114
BigData Tools Зиновьев Алексей Java/BigData тренер в EPAM

Мастер-класс по BigData Tools для HappyDev'15

Embed Size (px)

Citation preview

Page 1: Мастер-класс по BigData Tools для HappyDev'15

BigData Tools

Зиновьев Алексей

Java/BigData тренер в EPAM

Page 2: Мастер-класс по BigData Tools для HappyDev'15
Page 3: Мастер-класс по BigData Tools для HappyDev'15

Контакты

• https://twitter.com/zaleslaw

• https://twitter.com/BigDataRussia

• http://vk.com/big_data_russia Big Data Russia

• http://vk.com/java_jvm

Page 4: Мастер-класс по BigData Tools для HappyDev'15

JavaScript изо всех щелей

Page 5: Мастер-класс по BigData Tools для HappyDev'15

И вот, что я скажу тебе, JavaScript

Page 6: Мастер-класс по BigData Tools для HappyDev'15

И вот, что я скажу тебе, JavaScript

Page 7: Мастер-класс по BigData Tools для HappyDev'15

Мне нравится, когда все на JVMкрутится!

Page 8: Мастер-класс по BigData Tools для HappyDev'15

Типичный BigData кластер

• 450 машин

• Master Nodes (24 ядра, 158 Gb RAM).

• Data Nodes (24|32 ядра, 96|128 Gb RAM).

• Средняя YARN Queue utilization 85% (по дням).

• 12Pb – емкость хранения данных

Page 9: Мастер-класс по BigData Tools для HappyDev'15

Когда мы говорим, что имеем дело с BigData решением

• Когда перед глазами смесь архитектурных подходов, таких как Kappa, Lambda, Data Lake

• Когда мы имеем дело со стеком технологий, таких как Hadoop, Kafka, Spark, Storm, Samza, HBase, Cassandra, Titan, GridGain

• Когда анализ логов этих систем – задача не менее серьезного уровня

Page 10: Мастер-класс по BigData Tools для HappyDev'15

ScaleUp vs ScaleOut

16 CPUs 16 CPUs 16 CPUsScale - Out 16 CPUs

48 CPUsScale - Up 16 CPUs

Page 11: Мастер-класс по BigData Tools для HappyDev'15

Приходит время, данные в датацентры улетают…

I

50GB

300GB

5TB

Page 12: Мастер-класс по BigData Tools для HappyDev'15

Приходит время, данные в датацентры улетают…

Page 13: Мастер-класс по BigData Tools для HappyDev'15

Как вылечить невысокую устойчивость к сбоям?

Page 14: Мастер-класс по BigData Tools для HappyDev'15

Мыть голову при помощи нового шампуня «Репликация»!

Page 15: Мастер-класс по BigData Tools для HappyDev'15

Если вы слишком увлечётесь гонкой инструментов, то получится..

Page 16: Мастер-класс по BigData Tools для HappyDev'15

Типичный многосервисный проект, где основной болью будет конфликт

разных версий

Real-Time Data-Marts

Batch Data-Marts

Relations Graph

Ontology Metadata

Search Index

Events & Alarms

Real-time Dashboarding

Events & Alarms

All Raw Data backupis stored here

Real-time DataIngestion

Batch DataIngestion

Real-Time ETL & CEP

Batch ETL & Raw Area

Scheduler

Internal

External

Social

HDFS → CFSas an option

Time-Series Data

Titan & KairosDBstore data in Cassandra

Push Events & Alarms (Email, SNMP etc.)

Page 17: Мастер-класс по BigData Tools для HappyDev'15

Hadoop

Page 18: Мастер-класс по BigData Tools для HappyDev'15

Пора дать определение!

• Hadoop != MapReduce

Page 19: Мастер-класс по BigData Tools для HappyDev'15

Пора дать определение!

• Hadoop != MapReduce

• Hadoop – это фреймворк

Page 20: Мастер-класс по BigData Tools для HappyDev'15

Пора дать определение!

• Hadoop != MapReduce

• Hadoop – это фреймворк

• Фреймворк для обработки больших массивов данных

Page 21: Мастер-класс по BigData Tools для HappyDev'15

Пора дать определение!

• Hadoop != MapReduce

• Hadoop – это фреймворк

• Фреймворк для обработки больших массивов данных

• Который использует простые модели и парадигмы программирования

Page 22: Мастер-класс по BigData Tools для HappyDev'15

Пора дать определение!

• Hadoop != MapReduce

• Hadoop – это фреймворк

• Фреймворк для обработки больших массивов данных

• Который использует простые модели и парадигмы программирования

• Скрывая от нас всю самую сложную часть с параллелизацией, перемещением данных и

Page 23: Мастер-класс по BigData Tools для HappyDev'15

Фреймворке в семействе Hadoop

• Универсальные (MapReduce, Tez, Kudu, RDD in Spark)

Page 24: Мастер-класс по BigData Tools для HappyDev'15

Фреймворке в семействе Hadoop

• Универсальные (MapReduce, Tez, Kudu, RDD in Spark)

• Абстрактные (Pig, Pipeline Spark)

Page 25: Мастер-класс по BigData Tools для HappyDev'15

Фреймворке в семействе Hadoop

• Универсальные (MapReduce, Tez, Kudu, RDD in Spark)

• Абстрактные (Pig, Pipeline Spark)

• SQL – подобные (Hive, Impala, Spark SQL)

Page 26: Мастер-класс по BigData Tools для HappyDev'15

Фреймворке в семействе Hadoop

• Универсальные (MapReduce, Tez, Kudu, RDD in Spark)

• Абстрактные (Pig, Pipeline Spark)

• SQL – подобные (Hive, Impala, Spark SQL)

• Для обработки графов (Giraph, GraphX)

Page 27: Мастер-класс по BigData Tools для HappyDev'15

Фреймворке в семействе Hadoop

• Универсальные (MapReduce, Tez, Kudu, RDD in Spark)

• Абстрактные (Pig, Pipeline Spark)

• SQL – подобные (Hive, Impala, Spark SQL)

• Для обработки графов (Giraph, GraphX)

• Машинное обучение (MLlib, Mahout)

Page 28: Мастер-класс по BigData Tools для HappyDev'15

Фреймворке в семействе Hadoop

• Универсальные (MapReduce, Tez, Kudu, RDD in Spark)

• Абстрактные (Pig, Pipeline Spark)

• SQL – подобные (Hive, Impala, Spark SQL)

• Для обработки графов (Giraph, GraphX)

• Машинное обучение (MLlib, Mahout)

• Stream (Spark Streaming, Storm)

Page 29: Мастер-класс по BigData Tools для HappyDev'15
Page 30: Мастер-класс по BigData Tools для HappyDev'15
Page 31: Мастер-класс по BigData Tools для HappyDev'15

Важнейшие части «слона»

• Hadoop Commons

• Hadoop Clients

• HDFS – Hadoop Distributed File System

• Yarn – Yet Another Resource Negotiator

• MapReduce

Page 32: Мастер-класс по BigData Tools для HappyDev'15

Как начать?

Page 33: Мастер-класс по BigData Tools для HappyDev'15

Как начать?

С выбора дистрибутива, конечно

Page 34: Мастер-класс по BigData Tools для HappyDev'15

Важнейшие части «слона»

• Apache Hadoop 2.7.1

• Hortonworks HDP 2.3 2.7.1

• Cloudera CDH 5.4.4 2.6.0

• MapR 5.0 2.7.0

• Pivotal HD 3.0 2.6.0

• other

Page 35: Мастер-класс по BigData Tools для HappyDev'15

HDP != Hadoop

Page 36: Мастер-класс по BigData Tools для HappyDev'15

HDP != Hadoop

Page 37: Мастер-класс по BigData Tools для HappyDev'15

Русские ставят вручную на первый попавшийся сервер

Page 38: Мастер-класс по BigData Tools для HappyDev'15

Нравится много писать в консоли?

Big Data on your local machine : How to install Hadoop 2.6.0

Page 39: Мастер-класс по BigData Tools для HappyDev'15

Режим установки local

• Однопоточная Java

• Легко дебажить даже из IDE

• Репликации нет

• HDFS учить не нужно

• dfs.replication=“1”;

• fs.defaultFS=“file:///”; fs.default.name=“file:///”;

• mapreduce.framework.name=“local”

Page 40: Мастер-класс по BigData Tools для HappyDev'15

Режим установки Pseudo-distributed

• Все на одной ноде

• Репликации нет

• Каждому демону из Hadoop соответсвует thread из Java

• Yarn выполняет свою работу

Page 41: Мастер-класс по BigData Tools для HappyDev'15

Режим установки Fully-distributed

• Репликация какая надо

• Master/slave ноды

• Yarn выполняет свою работу

Page 42: Мастер-класс по BigData Tools для HappyDev'15

Топология Hadoop

Page 43: Мастер-класс по BigData Tools для HappyDev'15

Best Practices

• DataNodes, NodeManagers and RegionServersобычно разворачиваются исходя из стратегии DataLocality

Page 44: Мастер-класс по BigData Tools для HappyDev'15

Best Practices

• DataNodes, NodeManagers and RegionServersобычно разворачиваются исходя из стратегии DataLocality

• Обычно каждый блок данных реплицируется минимум трижды в действительно разных местах

Page 45: Мастер-класс по BigData Tools для HappyDev'15

Best Practices

• DataNodes, NodeManagers and RegionServersобычно разворачиваются исходя из стратегии DataLocality

• Обычно каждый блок данных реплицируется минимум трижды в действительно разных местах

• Если можно, ставим балансировщик

Page 46: Мастер-класс по BigData Tools для HappyDev'15

Best Practices

• DataNodes, NodeManagers and RegionServersобычно разворачиваются исходя из стратегии DataLocality

• Обычно каждый блок данных реплицируется минимум трижды в действительно разных местах

• Если можно, ставим балансировщик

• Изучаем особенности HDFS

Page 47: Мастер-класс по BigData Tools для HappyDev'15

Рекомендации по мощностям

• 64GB RAM для NameNode позволяют адресоваться ~100M files в HDFS

• 256 GB RAM для data nodes и интенсивными in-memory operations (например Spark executors, или in-memory DBs)

• Минимум 8-16 cores CPUs

• Минимум 4 дисков (для master nodes) и 6-12 дисков (для data nodes) для IO optimization; + 1 отдельный диск для OS

Page 48: Мастер-класс по BigData Tools для HappyDev'15

HDFS

Page 49: Мастер-класс по BigData Tools для HappyDev'15

Hadoop Distributed File System

Hortonworks утверждает, что существуют кластера на 200 PB, 4500

машин, > 10^6 файлов и HDFSнормально так работает

Page 50: Мастер-класс по BigData Tools для HappyDev'15

NameNode

• Вообще это отдельные процессы, которые умеют жить как на одной, так и на разных машинах

• В кластере только одна NameNode, но это не SPOF!

• Есть StanbyNameNode, она страхует

• Если NameNode недоступна, то недоступен и HDFS кластер

Page 51: Мастер-класс по BigData Tools для HappyDev'15

NameNode рулит и разруливает!

Page 52: Мастер-класс по BigData Tools для HappyDev'15

DataNode

• DataNode может быть сколько угодно, чем больше, тем лучше

• Можно убирать и добавлять их без особого ущерба

• DataNode сама отвечает на запросы

• И слушается NameNode, когда надо умереть, реплицировать что-то или удалить реплику

Page 53: Мастер-класс по BigData Tools для HappyDev'15

Что нужно уметь и знать!

• Перемещать данные между HDFS и обычной FS: hdfs fs -copyFromLocal ; -copyToLocal

• Удалять/создавать директории

• Управлять правами на файлы/папки

• Диагностировать

• Проверять наличие свободного пространства

Все это при помощи команд, похожих на Linux

Page 54: Мастер-класс по BigData Tools для HappyDev'15

Укротите демонов!

• /logs

• /logLevel

• /stacks

• /metrics

• /metrics?format=json

Page 55: Мастер-класс по BigData Tools для HappyDev'15

MapReduce

Page 56: Мастер-класс по BigData Tools для HappyDev'15

MapReduce на уровне языков

Language Code sample

Java 8 Integer totalAge = persons

.stream()

.map(Person::getAge)

.reduce( 0, (a, b) -> a + b);

Scala val totalAge = persons

.map( (p: Person) => p.getAge )

.reduce( _ + _ )

Python totalAge = reduce(

(lambda a, b: a + b),

list( map(lambda p: p.getAge, persons) )

)

Page 57: Мастер-класс по BigData Tools для HappyDev'15

MapReduce для WordCount

Page 58: Мастер-класс по BigData Tools для HappyDev'15

WordCount, отлитый в Java : Mapper

Page 59: Мастер-класс по BigData Tools для HappyDev'15

WordCount, отлитый в Java : Reducer

Page 60: Мастер-класс по BigData Tools для HappyDev'15

WordCount, отлитый в Java : Runner

Page 61: Мастер-класс по BigData Tools для HappyDev'15

WordCount, отлитый в Java : Runner

Page 62: Мастер-класс по BigData Tools для HappyDev'15

Как запустить это хозяйство?

• Сделать jar

Page 63: Мастер-класс по BigData Tools для HappyDev'15

Как запустить это хозяйство?

• Сделать jar

• Запустить его на удаленной машине, где есть Hadoop

Page 64: Мастер-класс по BigData Tools для HappyDev'15

Как запустить это хозяйство?

• Сделать jar

• Запустить его на удаленной машине, где есть Hadoop

• hadoop jar your-jar.jar <packagename>.YourDriver –Ddir.input=/bla/bla/bla -Dmapred.reduce.tasks=4

Page 65: Мастер-класс по BigData Tools для HappyDev'15

Как запустить это хозяйство?

• Сделать jar

• Запустить его на удаленной машине, где есть Hadoop

• hadoop jar your-jar.jar <packagename>.YourDriver –Ddir.input=/bla/bla/bla -Dmapred.reduce.tasks=4

• В коде драйвера работай с этими константами

Page 66: Мастер-класс по BigData Tools для HappyDev'15

Как запустить это хозяйство?

• Сделать jar

• Запустить его на удаленной машине, где есть Hadoop

• hadoop jar your-jar.jar <packagename>.YourDriver –Ddir.input=/bla/bla/bla -Dmapred.reduce.tasks=4

• В коде драйвера работай с этими константами

• String hdfsInputFileOrDirectory = configuration.get(“dir.input”);

Page 67: Мастер-класс по BigData Tools для HappyDev'15

Запустили? Упало! Нужны тесты

Вот бы нам JUnit…

Page 68: Мастер-класс по BigData Tools для HappyDev'15

Запустили? Упало! Нужны тесты

public class MRUnitHelloWorld {MapDriver<LongWritable, Text, Text, IntWritable> mapDriver;

@Beforepublic void setUp() {

WordMapper mapper = new WordMapper();mapDriver = new MapDriver<LongWritable, Text, Text, IntWritable>();mapDriver.setMapper(mapper);

}

@Testpublic void testMapper() {

mapDriver.withInput(new LongWritable(1), new Text("cat dog"));mapDriver.withOutput(new Text("cat"), new IntWritable(1));mapDriver.withOutput(new Text("dog"), new IntWritable(1));mapDriver.runTest();

}}

Page 69: Мастер-класс по BigData Tools для HappyDev'15

Hadoop Jobs

Page 70: Мастер-класс по BigData Tools для HappyDev'15

Не забывай о JVM!

Page 71: Мастер-класс по BigData Tools для HappyDev'15

Но всеми этим фронтами кто-то должен управлять, говорить кому

когда что делать…

Page 72: Мастер-класс по BigData Tools для HappyDev'15

Скелет Hadoop, который пришелся по вкусу всем!

Page 73: Мастер-класс по BigData Tools для HappyDev'15

YARN

Page 74: Мастер-класс по BigData Tools для HappyDev'15

MapReduce – это всего лишь одно приложение, которое приходит к

всемогущему YARN за ресурсами для своих авантюр

Page 75: Мастер-класс по BigData Tools для HappyDev'15

YARN общается с HDFS, чтобы задействовать DataLocality и

оптимизировать свои ресурсы

Page 76: Мастер-класс по BigData Tools для HappyDev'15

YARN управляет жизненным циклом, нудно, но все работает!

Page 77: Мастер-класс по BigData Tools для HappyDev'15

Как извлекать факты для анализа данных из Hadoop?

Page 78: Мастер-класс по BigData Tools для HappyDev'15

Свин и шмелле летят на помощь!

Page 79: Мастер-класс по BigData Tools для HappyDev'15

Pig

Page 80: Мастер-класс по BigData Tools для HappyDev'15

Подсчет треугольников в графе

Page 81: Мастер-класс по BigData Tools для HappyDev'15

Pig Scripts -> MapReduce jobs

Page 82: Мастер-класс по BigData Tools для HappyDev'15

Сделаем отчет на Pigdem = LOAD '/ok/demography/part-r-00000' AS (id:int, age:int,

gender:int, region:int);

Page 83: Мастер-класс по BigData Tools для HappyDev'15

Сделаем отчет на Pigdem = LOAD '/ok/demography/part-r-00000' AS (id:int, age:int,

gender:int, region:int);

logins = LOAD '/ok/logins/*' AS (ts:chararray, userid:int, clientType:int,

success:boolean, geoIp:int, userAgent:int);

Page 84: Мастер-класс по BigData Tools для HappyDev'15

Сделаем отчет на Pigdem = LOAD '/ok/demography/part-r-00000' AS (id:int, age:int,

gender:int, region:int);

logins = LOAD '/ok/logins/*' AS (ts:chararray, userid:int, clientType:int,

success:boolean, geoIp:int, userAgent:int);

by_user_success = GROUP logins BY (userid, success);

Page 85: Мастер-класс по BigData Tools для HappyDev'15

Сделаем отчет на Pigdem = LOAD '/ok/demography/part-r-00000' AS (id:int, age:int,

gender:int, region:int);

logins = LOAD '/ok/logins/*' AS (ts:chararray, userid:int, clientType:int,

success:boolean, geoIp:int, userAgent:int);

by_user_success = GROUP logins BY (userid, success);

logins_data = FOREACH by_user_success

GENERATE FLATTEN (group) as (userid, success),

COUNT(logins.ts) as login_amount;

Page 86: Мастер-класс по BigData Tools для HappyDev'15

Сделаем отчет на Pigdem = LOAD '/ok/demography/part-r-00000' AS (id:int, age:int,

gender:int, region:int);

logins = LOAD '/ok/logins/*' AS (ts:chararray, userid:int, clientType:int,

success:boolean, geoIp:int, userAgent:int);

by_user_success = GROUP logins BY (userid, success);

logins_data = FOREACH by_user_success

GENERATE FLATTEN (group) as (userid, success),

COUNT(logins.ts) as login_amount;

DESCRIBE logins_data;

Page 87: Мастер-класс по BigData Tools для HappyDev'15

Сделаем отчет на Pig

/* amount of logins by regions */

dem_logins= JOIN dem BY id, logins_data BY userid;

Page 88: Мастер-класс по BigData Tools для HappyDev'15

Сделаем отчет на Pig

/* amount of logins by regions */

dem_logins= JOIN dem BY id, logins_data BY userid;

by_region = GROUP dem_logins BY (region, gender, success);

Page 89: Мастер-класс по BigData Tools для HappyDev'15

Сделаем отчет на Pig

/* amount of logins by regions */

dem_logins= JOIN dem BY id, logins_data BY userid;

by_region = GROUP dem_logins BY (region, gender, success);

result = FOREACH by_region

GENERATE FLATTEN (group) as (region, gender, success),

SUM(dem_logins.login_amount) as login_amount;

Page 90: Мастер-класс по BigData Tools для HappyDev'15

Сделаем отчет на Pig

/* amount of logins by regions */

dem_logins= JOIN dem BY id, logins_data BY userid;

by_region = GROUP dem_logins BY (region, gender, success);

result = FOREACH by_region

GENERATE FLATTEN (group) as (region, gender, success),

SUM(dem_logins.login_amount) as login_amount;

DESCRIBE result;

Page 91: Мастер-класс по BigData Tools для HappyDev'15

Сделаем отчет на Pig

/* amount of logins by regions */

dem_logins= JOIN dem BY id, logins_data BY userid;

by_region = GROUP dem_logins BY (region, gender, success);

result = FOREACH by_region

GENERATE FLATTEN (group) as (region, gender, success),

SUM(dem_logins.login_amount) as login_amount;

DESCRIBE result;

STORE result INTO '/ok/dem_logins_by_region' using PigStorage(',');

Page 92: Мастер-класс по BigData Tools для HappyDev'15

Да по-любому надо тюнить!set default_parallel 64;

set job.name Calculate_number_of_users;

set mapred.child.java.opts -Xmx1024m

dem = LOAD '/ok/demography/part-r-00000' AS (id:int, age:int,

gender:int, region:int);

….

Page 93: Мастер-класс по BigData Tools для HappyDev'15

Hive

Page 94: Мастер-класс по BigData Tools для HappyDev'15

Как так? Снова SQL?

Да, дружище, он никуда не уходил, стоял за дверью…

Page 95: Мастер-класс по BigData Tools для HappyDev'15

Причины триумфа Hive

• Иллюзия структуры

• Единый язык для различных хранилищ

• SQL всем знаком

• Вполне реален ответ за небольшое время

• MapReduce слишком сложен

• Иллюзия JOINs

Page 96: Мастер-класс по BigData Tools для HappyDev'15
Page 97: Мастер-класс по BigData Tools для HappyDev'15
Page 98: Мастер-класс по BigData Tools для HappyDev'15

JOINы превращаются.. в элегантные шорты

Page 99: Мастер-класс по BigData Tools для HappyDev'15

Spark

Page 100: Мастер-класс по BigData Tools для HappyDev'15

Почему мамонты вымирают?

• Они слишком часто сохраняются на диск

Page 101: Мастер-класс по BigData Tools для HappyDev'15

Почему мамонты вымирают?

• Они слишком часто сохраняются на диск

• Слишком много людей сидят на абстракциях, а не пишут MR jobs

Page 102: Мастер-класс по BigData Tools для HappyDev'15

Почему мамонты вымирают?

• Они слишком часто сохраняются на диск

• Слишком много людей сидят на абстракциях, а не пишут MR jobs

• Слишком плох MR для итерационных вычислений

Page 103: Мастер-класс по BigData Tools для HappyDev'15

Почему мамонты вымирают?

• Они слишком часто сохраняются на диск

• Слишком много людей сидят на абстракциях, а не пишут MR jobs

• Слишком плох MR для итерационных вычислений

• Слишком долго MR был на коне

Page 104: Мастер-класс по BigData Tools для HappyDev'15

Почему мамонты вымирают?

• Они слишком часто сохраняются на диск

• Слишком много людей сидят на абстракциях, а не пишут MR jobs

• Слишком плох MR для итерационных вычислений

• Слишком долго MR был на коне

• И да, Google его больше не использует

Page 105: Мастер-класс по BigData Tools для HappyDev'15

Мы можем комбинировать подходы для всех источников данных

val points = spark.sql("select latitude, longitude from tweets")

val model = KMeans.train(points, 10)

Page 106: Мастер-класс по BigData Tools для HappyDev'15

WordCount на Scala + Sparkval conf = new SparkConf()

.setAppName(appName)

.setMaster(master)

Page 107: Мастер-класс по BigData Tools для HappyDev'15

WordCount на Scala + Sparkval conf = new SparkConf()

.setAppName(appName)

.setMaster(master)

val spark = new SparkContext(conf)

Page 108: Мастер-класс по BigData Tools для HappyDev'15

WordCount на Scala + Sparkval conf = new SparkConf()

.setAppName(appName)

.setMaster(master)

val spark = new SparkContext(conf)

val file = spark.textFile("…")

res.saveAsTextFile("…");

Page 109: Мастер-класс по BigData Tools для HappyDev'15

WordCount на Scala + Sparkval conf = new SparkConf()

.setAppName(appName)

.setMaster(master)

val spark = new SparkContext(conf)

val file = spark.textFile("…")

Тут как напишем сейчас MR!

res.saveAsTextFile("…");

Page 110: Мастер-класс по BigData Tools для HappyDev'15

WordCount на Scala + Sparkval conf = new SparkConf()

.setAppName(appName)

.setMaster(master)

val spark = new SparkContext(conf)

val file = spark.textFile("…")

val res = file.flatMap(line => line.split(" ")).map(word => (word, 1)).reduceByKey(_+_)

res.saveAsTextFile("…");

Page 111: Мастер-класс по BigData Tools для HappyDev'15

Основные компоненты

Page 112: Мастер-класс по BigData Tools для HappyDev'15

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

10x – 100x

Page 113: Мастер-класс по BigData Tools для HappyDev'15

Spark – это не царская дорога к большим данным

Статья о том, что меня раздражает в Spark

Page 114: Мастер-класс по BigData Tools для HappyDev'15

Контакты

• https://twitter.com/zaleslaw

• https://twitter.com/BigDataRussia

• http://vk.com/big_data_russia Big Data Russia

• http://vk.com/java_jvm