SlideShare a Scribd company logo
1 of 33
Download to read offline
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
● Храним все входные данные в
необработанном виде
● Для анализа данных создаем подходящие
материализованные представления
● Как получить реалтайм представления?
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

What's hot

Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"
Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"
Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"Fwdays
 
Лекция 13. YARN
Лекция 13. YARNЛекция 13. YARN
Лекция 13. YARNTechnopark
 
PostgreSQL + PostGIS + TimescaleDB - storage for monitoring systems
PostgreSQL + PostGIS + TimescaleDB - storage for monitoring systemsPostgreSQL + PostGIS + TimescaleDB - storage for monitoring systems
PostgreSQL + PostGIS + TimescaleDB - storage for monitoring systemsIvan Muratov
 
Time series data in a relational database. TimescaleDB and PipelineDB extensi...
Time series data in a relational database. TimescaleDB and PipelineDB extensi...Time series data in a relational database. TimescaleDB and PipelineDB extensi...
Time series data in a relational database. TimescaleDB and PipelineDB extensi...Ivan Muratov
 
Hadoop implementation in Wikimart
Hadoop implementation in WikimartHadoop implementation in Wikimart
Hadoop implementation in WikimartRoman Zykov
 
Spark: нетипичные примеры использования
Spark:  нетипичные примеры использованияSpark:  нетипичные примеры использования
Spark: нетипичные примеры использованияfaithlessfriend
 
Отказоустойчивая обработка 10M OAuth токенов на Tarantool / Владимир Перепели...
Отказоустойчивая обработка 10M OAuth токенов на Tarantool / Владимир Перепели...Отказоустойчивая обработка 10M OAuth токенов на Tarantool / Владимир Перепели...
Отказоустойчивая обработка 10M OAuth токенов на Tarantool / Владимир Перепели...Ontico
 
Опыт использования Spark, Основано на реальных событиях
Опыт использования Spark, Основано на реальных событияхОпыт использования Spark, Основано на реальных событиях
Опыт использования Spark, Основано на реальных событияхVasil Remeniuk
 
Индексный поиск по регулярным выражениям (Александр Коротков)
Индексный поиск по регулярным выражениям (Александр Коротков)Индексный поиск по регулярным выражениям (Александр Коротков)
Индексный поиск по регулярным выражениям (Александр Коротков)Ontico
 
Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...
Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...
Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...Magneta AI
 
Hacking PostgreSQL. Разделяемая память и блокировки.
Hacking PostgreSQL. Разделяемая память и блокировки.Hacking PostgreSQL. Разделяемая память и блокировки.
Hacking PostgreSQL. Разделяемая память и блокировки.Anastasia Lubennikova
 

What's hot (12)

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

Viewers also liked

Ruby on Big Data (Cassandra + Hadoop)
Ruby on Big Data (Cassandra + Hadoop)Ruby on Big Data (Cassandra + Hadoop)
Ruby on Big Data (Cassandra + Hadoop)Brian O'Neill
 
Building an Effective Data Warehouse Architecture
Building an Effective Data Warehouse ArchitectureBuilding an Effective Data Warehouse Architecture
Building an Effective Data Warehouse ArchitectureJames Serra
 
Ruby, rails, no sql and big data
Ruby, rails, no sql and big dataRuby, rails, no sql and big data
Ruby, rails, no sql and big dataJohn Repko
 
Cassandra for all the Things
Cassandra for all the ThingsCassandra for all the Things
Cassandra for all the ThingsTheo Hultberg
 
Using Ruby to do Map/Reduce with Hadoop
Using Ruby to do Map/Reduce with HadoopUsing Ruby to do Map/Reduce with Hadoop
Using Ruby to do Map/Reduce with HadoopJames Kebinger
 
Modern Data Architecture for a Data Lake with Informatica and Hortonworks Dat...
Modern Data Architecture for a Data Lake with Informatica and Hortonworks Dat...Modern Data Architecture for a Data Lake with Informatica and Hortonworks Dat...
Modern Data Architecture for a Data Lake with Informatica and Hortonworks Dat...Hortonworks
 
Big data architectures and the data lake
Big data architectures and the data lakeBig data architectures and the data lake
Big data architectures and the data lakeJames Serra
 

Viewers also liked (8)

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

Similar to Big Data и Ruby

Предметно-ориентированные языки программирования (DSL)
Предметно-ориентированные языки программирования (DSL)Предметно-ориентированные языки программирования (DSL)
Предметно-ориентированные языки программирования (DSL)Alexander Kirillov
 
Григорий Демченко, “Асинхронность и сопрограммы: обработка данных“
Григорий Демченко, “Асинхронность и сопрограммы: обработка данных“Григорий Демченко, “Асинхронность и сопрограммы: обработка данных“
Григорий Демченко, “Асинхронность и сопрограммы: обработка данных“Platonov Sergey
 
Hadoop presentation
Hadoop presentationHadoop presentation
Hadoop presentationVlad Orlov
 
Доставка данных в реальном времени.
Доставка данных в реальном времени. Доставка данных в реальном времени.
Доставка данных в реальном времени. beshkenadze
 
JavaScript on frontend and backend (in Russian
JavaScript on frontend and backend (in RussianJavaScript on frontend and backend (in Russian
JavaScript on frontend and backend (in RussianMikhail Davydov
 
Psgi app
Psgi appPsgi app
Psgi appund3f
 
Интеграция Яндекс Сервер
Интеграция Яндекс СерверИнтеграция Яндекс Сервер
Интеграция Яндекс СерверPVasili
 
LDAP in infrastructure (RootConf 2009)
LDAP in infrastructure (RootConf 2009)LDAP in infrastructure (RootConf 2009)
LDAP in infrastructure (RootConf 2009)Sergey Skvortsov
 
High Load 2009 Dimaa Rus Ready 16 9
High Load 2009 Dimaa Rus Ready 16 9High Load 2009 Dimaa Rus Ready 16 9
High Load 2009 Dimaa Rus Ready 16 9HighLoad2009
 
Development of a plugin for VS Code that supports ACSL language.
Development of a plugin for VS Code that supports ACSL language.Development of a plugin for VS Code that supports ACSL language.
Development of a plugin for VS Code that supports ACSL language.Denis Zakharov
 
О.В.Сухорослов "MapReduce"
О.В.Сухорослов "MapReduce"О.В.Сухорослов "MapReduce"
О.В.Сухорослов "MapReduce"Yandex
 
CodeFest 2010. Столяров С. — Серверный JavaScript: NodeJS и CouchDB
CodeFest 2010. Столяров С. — Серверный JavaScript: NodeJS и CouchDBCodeFest 2010. Столяров С. — Серверный JavaScript: NodeJS и CouchDB
CodeFest 2010. Столяров С. — Серверный JavaScript: NodeJS и CouchDBCodeFest
 
Серверный JavaScript: NodeJS и CouchDB
Серверный JavaScript: NodeJS и CouchDBСерверный JavaScript: NodeJS и CouchDB
Серверный JavaScript: NodeJS и CouchDBStepan Stolyarov
 

Similar to Big Data и Ruby (20)

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

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

Борьба с багами: RailsClub на DevConf 2015
Борьба с багами: RailsClub на DevConf 2015Борьба с багами: RailsClub на DevConf 2015
Борьба с багами: RailsClub на DevConf 2015Александр Ежов
 
Rubt on Rails: 1000 запросов в секунду
Rubt on Rails: 1000 запросов в секундуRubt on Rails: 1000 запросов в секунду
Rubt on Rails: 1000 запросов в секундуАлександр Ежов
 
Liquor, Liquid и другие безопасные языки разметки в RoR
Liquor, Liquid и другие безопасные языки разметки в RoRLiquor, Liquid и другие безопасные языки разметки в RoR
Liquor, Liquid и другие безопасные языки разметки в RoRАлександр Ежов
 
Антикризисная презентация
Антикризисная презентацияАнтикризисная презентация
Антикризисная презентацияАлександр Ежов
 
Eventmachine: структура evented-приложений
Eventmachine: структура evented-приложенийEventmachine: структура evented-приложений
Eventmachine: структура evented-приложенийАлександр Ежов
 
Обзорное сравнение серверов приложений для Rails
Обзорное сравнение серверов приложений для RailsОбзорное сравнение серверов приложений для Rails
Обзорное сравнение серверов приложений для RailsАлександр Ежов
 
Использования PgQ и Londste в rails-приложении
Использования PgQ и Londste в rails-приложенииИспользования PgQ и Londste в rails-приложении
Использования PgQ и Londste в rails-приложенииАлександр Ежов
 
Интернационализация и локализация Ruby on Rails. gem russian
Интернационализация и локализация Ruby on Rails. gem russianИнтернационализация и локализация Ruby on Rails. gem russian
Интернационализация и локализация Ruby on Rails. gem russianАлександр Ежов
 
Как сделать контрибут в Ruby on Rails
Как сделать контрибут в Ruby on RailsКак сделать контрибут в Ruby on Rails
Как сделать контрибут в Ruby on RailsАлександр Ежов
 

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

Кеширование данных в БД
Кеширование данных в БДКеширование данных в БД
Кеширование данных в БД
 
Борьба с багами: RailsClub на DevConf 2015
Борьба с багами: RailsClub на DevConf 2015Борьба с багами: RailsClub на DevConf 2015
Борьба с багами: RailsClub на DevConf 2015
 
Rails 5: awesome features and breaking changes
Rails 5: awesome features and breaking changesRails 5: awesome features and breaking changes
Rails 5: awesome features and breaking changes
 
Abstract machines for great good
Abstract machines for great goodAbstract machines for great good
Abstract machines for great good
 
Rubt on Rails: 1000 запросов в секунду
Rubt on Rails: 1000 запросов в секундуRubt on Rails: 1000 запросов в секунду
Rubt on Rails: 1000 запросов в секунду
 
Liquor, Liquid и другие безопасные языки разметки в RoR
Liquor, Liquid и другие безопасные языки разметки в RoRLiquor, Liquid и другие безопасные языки разметки в RoR
Liquor, Liquid и другие безопасные языки разметки в RoR
 
Vim or die
Vim or dieVim or die
Vim or die
 
Capistrano Rails
Capistrano RailsCapistrano Rails
Capistrano Rails
 
Умное кэширование в Rails
Умное кэширование в RailsУмное кэширование в Rails
Умное кэширование в Rails
 
Sphinx как база данных
Sphinx как база данныхSphinx как база данных
Sphinx как база данных
 
Emacs и Rails
Emacs и RailsEmacs и Rails
Emacs и Rails
 
Антикризисная презентация
Антикризисная презентацияАнтикризисная презентация
Антикризисная презентация
 
Eventmachine: структура evented-приложений
Eventmachine: структура evented-приложенийEventmachine: структура evented-приложений
Eventmachine: структура evented-приложений
 
Дэдлоки
ДэдлокиДэдлоки
Дэдлоки
 
Обзорное сравнение серверов приложений для Rails
Обзорное сравнение серверов приложений для RailsОбзорное сравнение серверов приложений для Rails
Обзорное сравнение серверов приложений для Rails
 
Приложения в плагинах
Приложения в плагинахПриложения в плагинах
Приложения в плагинах
 
Использования PgQ и Londste в rails-приложении
Использования PgQ и Londste в rails-приложенииИспользования PgQ и Londste в rails-приложении
Использования PgQ и Londste в rails-приложении
 
Масштабирование в Rails
Масштабирование в RailsМасштабирование в Rails
Масштабирование в Rails
 
Интернационализация и локализация Ruby on Rails. gem russian
Интернационализация и локализация Ruby on Rails. gem russianИнтернационализация и локализация Ruby on Rails. gem russian
Интернационализация и локализация Ruby on Rails. gem russian
 
Как сделать контрибут в Ruby on Rails
Как сделать контрибут в Ruby on RailsКак сделать контрибут в Ruby on Rails
Как сделать контрибут в 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 ● Храним все входные данные в необработанном виде ● Для анализа данных создаем подходящие материализованные представления ● Как получить реалтайм представления?
  • 24.
  • 25.
  • 26.
  • 27.
  • 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