SlideShare a Scribd company logo
Big Data и Ruby
Равиль Байрамгалин
@brainopia
Обработка данных поверх множества
серверов:
● удобная модель автоматического
распределения данных и вычислений по
серверам
● отказоустойчивость
● минимизация перемещения данных по сети
Big Data
● Hadoop Distributed File System (HDFS)
— распределяет данные
● Hadoop MapReduce — распределяет
вычисления
Hadoop
● распределенная файловая система
● хранит файлы блоками по 128МБ
● распределяет отдельные блоки по разным
серверам
● реплицирует каждый блок 3 раза
HDFS
MapReduce
Hadoop Streaming
Word Count: mapper.rb
STDIN.each do |line|
line.split.each do |word|
puts [word, 1].join("t")
end
end
Word Count: counter.rb
STDIN
.chunk {|line| line.split.first }
.each do |key, lines|
puts [key, lines.size].join "t"
end
Word Count
● Local: cat test | ruby mapper.rb | sort | ruby counter.rb
● Hadoop:
hadoop jar hadoop-streaming-2.5.1.jar 
-input myInputDirs 
-output myOutputDir 
-mapper mapper.rb 
-reducer counter.rb 
-file mapper.rb 
-file counter.rb
Отчет
● Таблицы
Users: id, age
Messages: sender_id
● Задача:
Распределение сообщений по возрасту
Отчет: job 1
sqoop import --table messages --columns
sender_id ...
mapper: identity
reducer: counter.rb
Отчет: job 2
$ sqoop import --table users --columns id,age ...
mapper: STDIN.each do |line|
if line.includes? ','
id, age = line.split(',')
puts [id, :age, age].join "t"
else
id, count = line.split
puts [id, :count, count].join "t"
end
end
Отчет: job 2
reducer: STDIN
.lazy
.map {|line|
key, type, value = line.split
{ sender: key, type.to_sym => value }
}
.chunk {|hash| hash[:sender] }
.each do |sender, hashes|
data = hashes.inject({}, :merge)
puts [data[:age], data[:count]].join "t"
end
Отчет: job 3
mapper: identity
reducer: counter.rb
Плюсы
● Простая масштабируемая модель
вычислений
● Эффективность за счет больших батчей и
локальности данных
● Отказоустойчивый
Минусы
● Все пишется на диск
● Слишком низкоуровневый
● Невозможность итеративных алгоритмов
● Невозможность потоковой обработки
Storm
Распределенный реалтайм
процессинг
потоков данных
Топология
Потоковый Word Count
class RandomSentence < RedStorm::DSL::Spout
on_init { @sentences = [...] }
on_send { @sentences.sample }
end
Потоковый Word Count
class RandomSentence < RedStorm::DSL::Spout
on_init { @sentences = [...] }
on_send { @sentences.sample }
end
class SplitSentence < RedStorm::DSL::Bolt
on_receive do |sentence,|
sentence.split.map {|word| [word] }
end
end
Потоковый Word Count
class RandomSentence < RedStorm::DSL::Spout
on_init { @sentences = [...] }
on_send { @sentences.sample }
end
class SplitSentenceBolt < RedStorm::DSL::Bolt
on_receive do |sentence,|
sentence.split.map {|word| [word] }
end
end
class WordCountBolt < RedStorm::DSL::Bolt
on_init { @counts = Hash.new 0 }
on_receive {|word,| [word, @counts[word] += 1] }
end
class WordCountTopology < RedStorm::DSL::Topology
spout RandomSentence do
output_fields :sentence
end
bolt SplitSentenceBolt do
output_fields :word
source RandomSentence
end
bolt WordCountBolt, parallelism: 2 do
output_fields :word, :count
source SplitSentenceBolt, fields: ['word']
end
configure :word_count do
num_workers 4
end
end
Особенности
● Подходит для реалтайм потоков данных,
мониторинга, алертинга, DRPC, анализа по
временным интервалам
● Не подходит для полноценного анализа по
всем данным
Lambda Architecture
● Храним все входные данные в
необработанном виде
● Для анализа данных создаем подходящие
материализованные представления
● Как получить реалтайм представления?
Big Data и Ruby
Big Data и Ruby
Big Data и Ruby
Big Data и Ruby
Lambda архитектура по-нашему
● Не хотим писать одинаковые вычисления
для разных платформ
● Не хотим поддерживать две полностью
разных платформы
● Не хотим пересчитывать все данные, если
код остался неизменным или незначительно
изменился.
Стриминг на стероидах
● Реактивные связи для автоматического
инкрементализма вычислений
— возможность стримить не только новые
значения, но и откатывать предыдущие
● Интеграция с хранилищем — exactly-once
семантика, эффективность через колокацию
данных (отсутствие распределенных локов и
сетевого оверхеда ), отказоустойчивость
через репликацию
● Floq — система очередей с простой
коллокацией данных, батчингом,
отказоустойчивостью (сайдкик не является
ни одним из этих пунктов)
● Flow — реактивный стриминг для реалтайм
представлений
request_flow(event_map)
.if_match(:cookie)
.if_match(:user_id)
.tap do |flow|
flow.target timeline(:user)
flow.target timeline(:logins)
end
request_flow('session_create' => :prepare_session)
.match_time timeline(:logins), after: true do |session, user|
session.merge user_id: user[:user_id]
end
Другие интересные системы
● Spark
● SummingBird
● Samza
@brainopia
Буду рад общению с вами!

More Related Content

PDF
08 - Hadoop. Алгоритмы на графах в MapReduce
PDF
06 - Hadoop. Java API и Hadoop Streaming
PDF
13 - Hadoop. Парадигма Spark
PDF
14 - Hadoop. Фреймворк Spark
PDF
DF1 - BD - Baranov - Mining Large Datasets with Apache Spark
PDF
Apache Spark — Егор Пахомов
PDF
09 - Hadoop. Pig
PDF
Лекция 12. Spark
08 - Hadoop. Алгоритмы на графах в MapReduce
06 - Hadoop. Java API и Hadoop Streaming
13 - Hadoop. Парадигма Spark
14 - Hadoop. Фреймворк Spark
DF1 - BD - Baranov - Mining Large Datasets with Apache Spark
Apache Spark — Егор Пахомов
09 - Hadoop. Pig
Лекция 12. Spark

What's hot (12)

PDF
Apache spark
PDF
Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"
PDF
Лекция 13. YARN
PDF
PostgreSQL + PostGIS + TimescaleDB - storage for monitoring systems
PDF
Time series data in a relational database. TimescaleDB and PipelineDB extensi...
PPT
Hadoop implementation in Wikimart
PDF
Spark: нетипичные примеры использования
PDF
Отказоустойчивая обработка 10M OAuth токенов на Tarantool / Владимир Перепели...
PDF
Опыт использования Spark, Основано на реальных событиях
PPTX
Индексный поиск по регулярным выражениям (Александр Коротков)
PDF
Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...
PDF
Hacking PostgreSQL. Разделяемая память и блокировки.
Apache spark
Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"
Лекция 13. YARN
PostgreSQL + PostGIS + TimescaleDB - storage for monitoring systems
Time series data in a relational database. TimescaleDB and PipelineDB extensi...
Hadoop implementation in Wikimart
Spark: нетипичные примеры использования
Отказоустойчивая обработка 10M OAuth токенов на Tarantool / Владимир Перепели...
Опыт использования Spark, Основано на реальных событиях
Индексный поиск по регулярным выражениям (Александр Коротков)
Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...
Hacking PostgreSQL. Разделяемая память и блокировки.
Ad

Viewers also liked (8)

KEY
Ruby on Big Data (Cassandra + Hadoop)
PPTX
Building an Effective Data Warehouse Architecture
PPT
Ruby, rails, no sql and big data
PPTX
Ingestão de Dados
PDF
Cassandra for all the Things
PDF
Using Ruby to do Map/Reduce with Hadoop
PDF
Modern Data Architecture for a Data Lake with Informatica and Hortonworks Dat...
PPTX
Big data architectures and the data lake
Ruby on Big Data (Cassandra + Hadoop)
Building an Effective Data Warehouse Architecture
Ruby, rails, no sql and big data
Ingestão de Dados
Cassandra for all the Things
Using Ruby to do Map/Reduce with Hadoop
Modern Data Architecture for a Data Lake with Informatica and Hortonworks Dat...
Big data architectures and the data lake
Ad

Similar to Big Data и Ruby (20)

PPTX
DSL без купюр
PDF
Предметно-ориентированные языки программирования (DSL)
PDF
Григорий Демченко, “Асинхронность и сопрограммы: обработка данных“
ODP
Apache Hadoop
PDF
Hadoop presentation
PPTX
Расширение библиотеки Slick
PDF
Доставка данных в реальном времени.
PDF
Not the Rails Way
PDF
JavaScript on frontend and backend (in Russian
PDF
pgconf.ru 2015 avito postgresql
PDF
Psgi app
PPTX
PPT
Интеграция Яндекс Сервер
PPT
LDAP in infrastructure (RootConf 2009)
PPT
Catalyst and Rose::DB
PPTX
High Load 2009 Dimaa Rus Ready 16 9
PPTX
Development of a plugin for VS Code that supports ACSL language.
PDF
О.В.Сухорослов "MapReduce"
PDF
CodeFest 2010. Столяров С. — Серверный JavaScript: NodeJS и CouchDB
PDF
Серверный JavaScript: NodeJS и CouchDB
DSL без купюр
Предметно-ориентированные языки программирования (DSL)
Григорий Демченко, “Асинхронность и сопрограммы: обработка данных“
Apache Hadoop
Hadoop presentation
Расширение библиотеки Slick
Доставка данных в реальном времени.
Not the Rails Way
JavaScript on frontend and backend (in Russian
pgconf.ru 2015 avito postgresql
Psgi app
Интеграция Яндекс Сервер
LDAP in infrastructure (RootConf 2009)
Catalyst and Rose::DB
High Load 2009 Dimaa Rus Ready 16 9
Development of a plugin for VS Code that supports ACSL language.
О.В.Сухорослов "MapReduce"
CodeFest 2010. Столяров С. — Серверный JavaScript: NodeJS и CouchDB
Серверный JavaScript: NodeJS и CouchDB

More from Александр Ежов (20)

PDF
Кеширование данных в БД
PDF
Борьба с багами: RailsClub на DevConf 2015
PDF
Rails 5: awesome features and breaking changes
PDF
Abstract machines for great good
PPT
Rubt on Rails: 1000 запросов в секунду
PPT
Liquor, Liquid и другие безопасные языки разметки в RoR
PDF
Capistrano Rails
PDF
Умное кэширование в Rails
PPT
Sphinx как база данных
ODP
PPT
Антикризисная презентация
PPT
Eventmachine: структура evented-приложений
PPT
PDF
Обзорное сравнение серверов приложений для Rails
PDF
Приложения в плагинах
PDF
Использования PgQ и Londste в rails-приложении
PDF
Масштабирование в Rails
PDF
Интернационализация и локализация Ruby on Rails. gem russian
PDF
Как сделать контрибут в Ruby on Rails
Кеширование данных в БД
Борьба с багами: RailsClub на DevConf 2015
Rails 5: awesome features and breaking changes
Abstract machines for great good
Rubt on Rails: 1000 запросов в секунду
Liquor, Liquid и другие безопасные языки разметки в RoR
Capistrano Rails
Умное кэширование в Rails
Sphinx как база данных
Антикризисная презентация
Eventmachine: структура evented-приложений
Обзорное сравнение серверов приложений для Rails
Приложения в плагинах
Использования PgQ и Londste в rails-приложении
Масштабирование в Rails
Интернационализация и локализация Ruby on Rails. gem russian
Как сделать контрибут в Ruby on Rails

Big Data и Ruby

  • 1. Big Data и Ruby Равиль Байрамгалин @brainopia
  • 2. Обработка данных поверх множества серверов: ● удобная модель автоматического распределения данных и вычислений по серверам ● отказоустойчивость ● минимизация перемещения данных по сети Big Data
  • 3. ● Hadoop Distributed File System (HDFS) — распределяет данные ● Hadoop MapReduce — распределяет вычисления Hadoop
  • 4. ● распределенная файловая система ● хранит файлы блоками по 128МБ ● распределяет отдельные блоки по разным серверам ● реплицирует каждый блок 3 раза HDFS
  • 7. Word Count: mapper.rb STDIN.each do |line| line.split.each do |word| puts [word, 1].join("t") end end
  • 8. Word Count: counter.rb STDIN .chunk {|line| line.split.first } .each do |key, lines| puts [key, lines.size].join "t" end
  • 9. Word Count ● Local: cat test | ruby mapper.rb | sort | ruby counter.rb ● Hadoop: hadoop jar hadoop-streaming-2.5.1.jar -input myInputDirs -output myOutputDir -mapper mapper.rb -reducer counter.rb -file mapper.rb -file counter.rb
  • 10. Отчет ● Таблицы Users: id, age Messages: sender_id ● Задача: Распределение сообщений по возрасту
  • 11. Отчет: job 1 sqoop import --table messages --columns sender_id ... mapper: identity reducer: counter.rb
  • 12. Отчет: job 2 $ sqoop import --table users --columns id,age ... mapper: STDIN.each do |line| if line.includes? ',' id, age = line.split(',') puts [id, :age, age].join "t" else id, count = line.split puts [id, :count, count].join "t" end end
  • 13. Отчет: job 2 reducer: STDIN .lazy .map {|line| key, type, value = line.split { sender: key, type.to_sym => value } } .chunk {|hash| hash[:sender] } .each do |sender, hashes| data = hashes.inject({}, :merge) puts [data[:age], data[:count]].join "t" end
  • 14. Отчет: job 3 mapper: identity reducer: counter.rb
  • 15. Плюсы ● Простая масштабируемая модель вычислений ● Эффективность за счет больших батчей и локальности данных ● Отказоустойчивый Минусы ● Все пишется на диск ● Слишком низкоуровневый ● Невозможность итеративных алгоритмов ● Невозможность потоковой обработки
  • 18. Потоковый Word Count class RandomSentence < RedStorm::DSL::Spout on_init { @sentences = [...] } on_send { @sentences.sample } end
  • 19. Потоковый Word Count class RandomSentence < RedStorm::DSL::Spout on_init { @sentences = [...] } on_send { @sentences.sample } end class SplitSentence < RedStorm::DSL::Bolt on_receive do |sentence,| sentence.split.map {|word| [word] } end end
  • 20. Потоковый Word Count class RandomSentence < RedStorm::DSL::Spout on_init { @sentences = [...] } on_send { @sentences.sample } end class SplitSentenceBolt < RedStorm::DSL::Bolt on_receive do |sentence,| sentence.split.map {|word| [word] } end end class WordCountBolt < RedStorm::DSL::Bolt on_init { @counts = Hash.new 0 } on_receive {|word,| [word, @counts[word] += 1] } end
  • 21. class WordCountTopology < RedStorm::DSL::Topology spout RandomSentence do output_fields :sentence end bolt SplitSentenceBolt do output_fields :word source RandomSentence end bolt WordCountBolt, parallelism: 2 do output_fields :word, :count source SplitSentenceBolt, fields: ['word'] end configure :word_count do num_workers 4 end end
  • 22. Особенности ● Подходит для реалтайм потоков данных, мониторинга, алертинга, DRPC, анализа по временным интервалам ● Не подходит для полноценного анализа по всем данным
  • 23. Lambda Architecture ● Храним все входные данные в необработанном виде ● Для анализа данных создаем подходящие материализованные представления ● Как получить реалтайм представления?
  • 28. Lambda архитектура по-нашему ● Не хотим писать одинаковые вычисления для разных платформ ● Не хотим поддерживать две полностью разных платформы ● Не хотим пересчитывать все данные, если код остался неизменным или незначительно изменился.
  • 29. Стриминг на стероидах ● Реактивные связи для автоматического инкрементализма вычислений — возможность стримить не только новые значения, но и откатывать предыдущие ● Интеграция с хранилищем — exactly-once семантика, эффективность через колокацию данных (отсутствие распределенных локов и сетевого оверхеда ), отказоустойчивость через репликацию
  • 30. ● Floq — система очередей с простой коллокацией данных, батчингом, отказоустойчивостью (сайдкик не является ни одним из этих пунктов) ● Flow — реактивный стриминг для реалтайм представлений
  • 31. request_flow(event_map) .if_match(:cookie) .if_match(:user_id) .tap do |flow| flow.target timeline(:user) flow.target timeline(:logins) end request_flow('session_create' => :prepare_session) .match_time timeline(:logins), after: true do |session, user| session.merge user_id: user[:user_id] end
  • 32. Другие интересные системы ● Spark ● SummingBird ● Samza