big data и ruby

33
Big Data и Ruby Равиль Байрамгалин @brainopia

Upload: -

Post on 15-Apr-2017

246 views

Category:

Data & Analytics


1 download

TRANSCRIPT

Page 1: Big Data и Ruby

Big Data и Ruby

Равиль Байрамгалин@brainopia

Page 2: Big Data и Ruby

Обработка данных поверх множества серверов:

● удобная модель автоматического распределения данных и вычислений по серверам

● отказоустойчивость● минимизация перемещения данных по сети

Big Data

Page 3: Big Data и Ruby

● Hadoop Distributed File System (HDFS) — распределяет данные

● Hadoop MapReduce — распределяет вычисления

Hadoop

Page 4: Big Data и Ruby

● распределенная файловая система● хранит файлы блоками по 128МБ● распределяет отдельные блоки по разным серверам

● реплицирует каждый блок 3 раза

HDFS

Page 5: Big Data и Ruby

MapReduce

Page 6: Big Data и Ruby

Hadoop Streaming

Page 7: Big Data и Ruby

Word Count: mapper.rb

STDIN.each do |line| line.split.each do |word| puts [word, 1].join("\t") endend

Page 8: Big Data и Ruby

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

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

Отчет

● Таблицы

Users: id, age

Messages: sender_id● Задача:

Распределение сообщений по возрасту

Page 11: Big Data и Ruby

Отчет: job 1

sqoop import --table messages --columns sender_id ...

mapper: identity

reducer: counter.rb

Page 12: Big Data и Ruby

Отчет: 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

Отчет: 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

Отчет: job 3

mapper: identity

reducer: counter.rb

Page 15: Big Data и Ruby

Плюсы● Простая масштабируемая модель вычислений

● Эффективность за счет больших батчей и локальности данных

● Отказоустойчивый

Минусы● Все пишется на диск● Слишком низкоуровневый● Невозможность итеративных алгоритмов● Невозможность потоковой обработки

Page 16: Big Data и Ruby

Storm

Распределенный реалтаймпроцессинг

потоков данных

Page 17: Big Data и Ruby

Топология

Page 18: Big Data и Ruby

Потоковый Word Count

class RandomSentence < RedStorm::DSL::Spout on_init { @sentences = [...] } on_send { @sentences.sample }end

Page 19: Big Data и Ruby

Потоковый 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

Потоковый 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

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

Особенности

● Подходит для реалтайм потоков данных, мониторинга, алертинга, DRPC, анализа по временным интервалам

● Не подходит для полноценного анализа по всем данным

Page 23: Big Data и Ruby

Lambda Architecture

● Храним все входные данные в необработанном виде

● Для анализа данных создаем подходящие материализованные представления

● Как получить реалтайм представления?

Page 24: Big Data и Ruby
Page 25: Big Data и Ruby
Page 26: Big Data и Ruby
Page 27: Big Data и Ruby
Page 28: Big Data и Ruby

Lambda архитектура по-нашему

● Не хотим писать одинаковые вычисления для разных платформ

● Не хотим поддерживать две полностью разных платформы

● Не хотим пересчитывать все данные, если код остался неизменным или незначительно изменился.

Page 29: Big Data и Ruby

Стриминг на стероидах

● Реактивные связи для автоматического инкрементализма вычислений — возможность стримить не только новые значения, но и откатывать предыдущие

● Интеграция с хранилищем — exactly-once семантика, эффективность через колокацию данных (отсутствие распределенных локов и сетевого оверхеда ), отказоустойчивость через репликацию

Page 30: Big Data и Ruby

● Floq — система очередей с простой коллокацией данных, батчингом, отказоустойчивостью (сайдкик не является ни одним из этих пунктов)

● Flow — реактивный стриминг для реалтайм представлений

Page 31: Big Data и Ruby

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

Другие интересные системы

● Spark● SummingBird● Samza

Page 33: Big Data и Ruby

@brainopia

Буду рад общению с вами!