big data и ruby
TRANSCRIPT
![Page 1: Big Data и Ruby](https://reader031.vdocuments.net/reader031/viewer/2022021815/58780e051a28ab971e8b664d/html5/thumbnails/1.jpg)
Big Data и Ruby
Равиль Байрамгалин@brainopia
![Page 2: Big Data и Ruby](https://reader031.vdocuments.net/reader031/viewer/2022021815/58780e051a28ab971e8b664d/html5/thumbnails/2.jpg)
Обработка данных поверх множества серверов:
● удобная модель автоматического распределения данных и вычислений по серверам
● отказоустойчивость● минимизация перемещения данных по сети
Big Data
![Page 3: Big Data и Ruby](https://reader031.vdocuments.net/reader031/viewer/2022021815/58780e051a28ab971e8b664d/html5/thumbnails/3.jpg)
● Hadoop Distributed File System (HDFS) — распределяет данные
● Hadoop MapReduce — распределяет вычисления
Hadoop
![Page 4: Big Data и Ruby](https://reader031.vdocuments.net/reader031/viewer/2022021815/58780e051a28ab971e8b664d/html5/thumbnails/4.jpg)
● распределенная файловая система● хранит файлы блоками по 128МБ● распределяет отдельные блоки по разным серверам
● реплицирует каждый блок 3 раза
HDFS
![Page 5: Big Data и Ruby](https://reader031.vdocuments.net/reader031/viewer/2022021815/58780e051a28ab971e8b664d/html5/thumbnails/5.jpg)
MapReduce
![Page 6: Big Data и Ruby](https://reader031.vdocuments.net/reader031/viewer/2022021815/58780e051a28ab971e8b664d/html5/thumbnails/6.jpg)
Hadoop Streaming
![Page 7: Big Data и Ruby](https://reader031.vdocuments.net/reader031/viewer/2022021815/58780e051a28ab971e8b664d/html5/thumbnails/7.jpg)
Word Count: mapper.rb
STDIN.each do |line| line.split.each do |word| puts [word, 1].join("\t") endend
![Page 8: Big Data и Ruby](https://reader031.vdocuments.net/reader031/viewer/2022021815/58780e051a28ab971e8b664d/html5/thumbnails/8.jpg)
Word Count: counter.rb
STDIN .chunk {|line| line.split.first } .each do |key, lines| puts [key, lines.size].join "\t" end
![Page 9: Big Data и Ruby](https://reader031.vdocuments.net/reader031/viewer/2022021815/58780e051a28ab971e8b664d/html5/thumbnails/9.jpg)
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
![Page 10: Big Data и Ruby](https://reader031.vdocuments.net/reader031/viewer/2022021815/58780e051a28ab971e8b664d/html5/thumbnails/10.jpg)
Отчет
● Таблицы
Users: id, age
Messages: sender_id● Задача:
Распределение сообщений по возрасту
![Page 11: Big Data и Ruby](https://reader031.vdocuments.net/reader031/viewer/2022021815/58780e051a28ab971e8b664d/html5/thumbnails/11.jpg)
Отчет: job 1
sqoop import --table messages --columns sender_id ...
mapper: identity
reducer: counter.rb
![Page 12: Big Data и Ruby](https://reader031.vdocuments.net/reader031/viewer/2022021815/58780e051a28ab971e8b664d/html5/thumbnails/12.jpg)
Отчет: 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" endend
![Page 13: Big Data и Ruby](https://reader031.vdocuments.net/reader031/viewer/2022021815/58780e051a28ab971e8b664d/html5/thumbnails/13.jpg)
Отчет: 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
![Page 14: Big Data и Ruby](https://reader031.vdocuments.net/reader031/viewer/2022021815/58780e051a28ab971e8b664d/html5/thumbnails/14.jpg)
Отчет: job 3
mapper: identity
reducer: counter.rb
![Page 15: Big Data и Ruby](https://reader031.vdocuments.net/reader031/viewer/2022021815/58780e051a28ab971e8b664d/html5/thumbnails/15.jpg)
Плюсы● Простая масштабируемая модель вычислений
● Эффективность за счет больших батчей и локальности данных
● Отказоустойчивый
Минусы● Все пишется на диск● Слишком низкоуровневый● Невозможность итеративных алгоритмов● Невозможность потоковой обработки
![Page 16: Big Data и Ruby](https://reader031.vdocuments.net/reader031/viewer/2022021815/58780e051a28ab971e8b664d/html5/thumbnails/16.jpg)
Storm
Распределенный реалтаймпроцессинг
потоков данных
![Page 17: Big Data и Ruby](https://reader031.vdocuments.net/reader031/viewer/2022021815/58780e051a28ab971e8b664d/html5/thumbnails/17.jpg)
Топология
![Page 18: Big Data и Ruby](https://reader031.vdocuments.net/reader031/viewer/2022021815/58780e051a28ab971e8b664d/html5/thumbnails/18.jpg)
Потоковый Word Count
class RandomSentence < RedStorm::DSL::Spout on_init { @sentences = [...] } on_send { @sentences.sample }end
![Page 19: Big Data и Ruby](https://reader031.vdocuments.net/reader031/viewer/2022021815/58780e051a28ab971e8b664d/html5/thumbnails/19.jpg)
Потоковый 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] } endend
![Page 20: Big Data и Ruby](https://reader031.vdocuments.net/reader031/viewer/2022021815/58780e051a28ab971e8b664d/html5/thumbnails/20.jpg)
Потоковый 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] } endend
class WordCountBolt < RedStorm::DSL::Bolt on_init { @counts = Hash.new 0 } on_receive {|word,| [word, @counts[word] += 1] }end
![Page 21: Big Data и Ruby](https://reader031.vdocuments.net/reader031/viewer/2022021815/58780e051a28ab971e8b664d/html5/thumbnails/21.jpg)
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
![Page 22: Big Data и Ruby](https://reader031.vdocuments.net/reader031/viewer/2022021815/58780e051a28ab971e8b664d/html5/thumbnails/22.jpg)
Особенности
● Подходит для реалтайм потоков данных, мониторинга, алертинга, DRPC, анализа по временным интервалам
● Не подходит для полноценного анализа по всем данным
![Page 23: Big Data и Ruby](https://reader031.vdocuments.net/reader031/viewer/2022021815/58780e051a28ab971e8b664d/html5/thumbnails/23.jpg)
Lambda Architecture
● Храним все входные данные в необработанном виде
● Для анализа данных создаем подходящие материализованные представления
● Как получить реалтайм представления?
![Page 24: Big Data и Ruby](https://reader031.vdocuments.net/reader031/viewer/2022021815/58780e051a28ab971e8b664d/html5/thumbnails/24.jpg)
![Page 25: Big Data и Ruby](https://reader031.vdocuments.net/reader031/viewer/2022021815/58780e051a28ab971e8b664d/html5/thumbnails/25.jpg)
![Page 26: Big Data и Ruby](https://reader031.vdocuments.net/reader031/viewer/2022021815/58780e051a28ab971e8b664d/html5/thumbnails/26.jpg)
![Page 27: Big Data и Ruby](https://reader031.vdocuments.net/reader031/viewer/2022021815/58780e051a28ab971e8b664d/html5/thumbnails/27.jpg)
![Page 28: Big Data и Ruby](https://reader031.vdocuments.net/reader031/viewer/2022021815/58780e051a28ab971e8b664d/html5/thumbnails/28.jpg)
Lambda архитектура по-нашему
● Не хотим писать одинаковые вычисления для разных платформ
● Не хотим поддерживать две полностью разных платформы
● Не хотим пересчитывать все данные, если код остался неизменным или незначительно изменился.
![Page 29: Big Data и Ruby](https://reader031.vdocuments.net/reader031/viewer/2022021815/58780e051a28ab971e8b664d/html5/thumbnails/29.jpg)
Стриминг на стероидах
● Реактивные связи для автоматического инкрементализма вычислений — возможность стримить не только новые значения, но и откатывать предыдущие
● Интеграция с хранилищем — exactly-once семантика, эффективность через колокацию данных (отсутствие распределенных локов и сетевого оверхеда ), отказоустойчивость через репликацию
![Page 30: Big Data и Ruby](https://reader031.vdocuments.net/reader031/viewer/2022021815/58780e051a28ab971e8b664d/html5/thumbnails/30.jpg)
● Floq — система очередей с простой коллокацией данных, батчингом, отказоустойчивостью (сайдкик не является ни одним из этих пунктов)
● Flow — реактивный стриминг для реалтайм представлений
![Page 31: Big Data и Ruby](https://reader031.vdocuments.net/reader031/viewer/2022021815/58780e051a28ab971e8b664d/html5/thumbnails/31.jpg)
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
![Page 32: Big Data и Ruby](https://reader031.vdocuments.net/reader031/viewer/2022021815/58780e051a28ab971e8b664d/html5/thumbnails/32.jpg)
Другие интересные системы
● Spark● SummingBird● Samza
![Page 33: Big Data и Ruby](https://reader031.vdocuments.net/reader031/viewer/2022021815/58780e051a28ab971e8b664d/html5/thumbnails/33.jpg)
@brainopia
Буду рад общению с вами!