Upgrade to Pro — share decks privately, control downloads, hide ads and more …

railsclub 14

Avatar for Ravil Bayramgalin Ravil Bayramgalin
September 28, 2014
160

railsclub 14

Avatar for Ravil Bayramgalin

Ravil Bayramgalin

September 28, 2014
Tweet

Transcript

  1. Обработка данных поверх множества серверов: • удобная модель автоматического распределения

    данных и вычислений по серверам • отказоустойчивость • минимизация перемещения данных по сети Big Data
  2. • Hadoop Distributed File System (HDFS) — распределяет данные •

    Hadoop MapReduce — распределяет вычисления Hadoop
  3. • распределенная файловая система • хранит файлы блоками по 128МБ

    • распределяет отдельные блоки по разным серверам • реплицирует каждый блок 3 раза HDFS
  4. Word Count: counter.rb STDIN .chunk {|line| line.split.first } .each do

    |key, lines| puts [key, lines.size].join "\t" end
  5. 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
  6. Отчет • Таблицы Users: id, age Messages: sender_id • Задача:

    Распределение сообщений по возрасту
  7. Отчет: 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
  8. Отчет: 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
  9. Плюсы • Простая масштабируемая модель вычислений • Эффективность за счет

    больших батчей и локальности данных • Отказоустойчивый Минусы • Все пишется на диск • Слишком низкоуровневый • Невозможность итеративных алгоритмов • Невозможность потоковой обработки
  10. Потоковый 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
  11. Потоковый 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
  12. 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
  13. Особенности • Подходит для реалтайм потоков данных, мониторинга, алертинга, DRPC,

    анализа по временным интервалам • Не подходит для полноценного анализа по всем данным
  14. Lambda Architecture • Храним все входные данные в необработанном виде

    • Для анализа данных создаем подходящие материализованные представления • Как получить реалтайм представления?
  15. Lambda архитектура по-нашему • Не хотим писать одинаковые вычисления для

    разных платформ • Не хотим поддерживать две полностью разных платформы • Не хотим пересчитывать все данные, если код остался неизменным или незначительно изменился.
  16. Стриминг на стероидах • Реактивные связи для автоматического инкрементализма вычислений

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

    отказоустойчивостью (сайдкик не является ни одним из этих пунктов) • Flow — реактивный стриминг для реалтайм представлений
  18. 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