Ликбез про apache spark

Как всегда дело было поздней ночью, была такая не тривиальная задача обработать файлы логов(общий объем около 70 Гб текстовых файлов и архивов)
Начал в голове перебирать как можно сделать да еще и побыстрому. Вспомнился hadoop, но и вспомнилось его настройка, стало как-то не по себе и в голове звучала тревожная музыка. Google помог и я наткнулся на интересный проект Apache Spark. Описание из Вики
Apache Spark — каркас приложений с открытым исходным кодом. Библиотека предназначена для создания распределённых приложений, однако в отличии от Hadoop, реализующего двухуровневую концепцию MapReduce с дисковым хранилищем, использует примитивы в оперативной памяти, благодаря чему позволяет получать стократный выигрыш в скорости работы в определённых приложениях. Возможность многократного доступа к загруженным в память пользовательским данным делает библиотеку привлекательной для алгоритмов машинного обучения. Полазил по их документации
http://spark.apache.org/docs/latest/
Думаю, а ведь то что надо и потрогаю что-то новое. Сказано сделано, поднимаю vpn тунель, захожу на ipmi и для простоты установил Ubuntu так для тестов. Далее уже работал по ssh
Установка Apache Для простоты установки будет использоваться Ubuntu. Вначале нам необходимо установить репозитарии Java
4) Установка и копирование на «постоянное место жительства»
Добавим в sudo
Теперь нужно настроить Spark
export SPARK_WORKER_MEMORY="1g"
export SPARK_DRIVER_MEMORY="1g"
export SPARK_REPL_MEM="2g"
export SPARK_WORKER_PORT=9000
export SPARK_CONF_DIR="/usr/local/spark/conf"
export SPARK_TMP_DIR="/srv/spark/tmp"
export SPARK_PID_DIR="/srv/spark/pids"
export SPARK_LOG_DIR="/srv/spark/logs"
export SPARK_WORKER_DIR="/srv/spark/work"
export SPARK_LOCAL_DIRS="/srv/spark/tmp"
export SPARK_COMMON_OPTS="$SPARK_COMMON_OPTS -Dspark.kryoserializer.buffer.mb=32 "
LOG4J="-Dlog4j.configuration=file://$SPARK_CONF_DIR/log4j.properties"
export SPARK_MASTER_OPTS=" $LOG4J -Dspark.log.file=/srv/spark/logs/master.log "
export SPARK_WORKER_OPTS=" $LOG4J -Dspark.log.file=/srv/spark/logs/worker.log "
export SPARK_EXECUTOR_OPTS=" $LOG4J -Djava.io.tmpdir=/srv/spark/tmp/executor "
export SPARK_REPL_OPTS=" -Djava.io.tmpdir=/srv/spark/tmp/repl/\$USER "
export SPARK_APP_OPTS=" -Djava.io.tmpdir=/srv/spark/tmp/app/\$USER "
export PYSPARK_PYTHON="/usr/bin/python"
SPARK_PUBLIC_DNS="DNS RECORD"
export SPARK_WORKER_INSTANCES=2 Далее
spark.executor.memory 512m
spark.eventLog.enabled true
spark.serializer org.apache.spark.serializer.KryoSerializer
На этом установка закончена и можно запускать spark
Веб интерфейс со статистикой будет доступен по адресу
Чтобы меньше было отладочной информации необходимо сделать следующее
И испрвить строку с
Тем самым в логи будут писаться только ошибки. Вроде все установлено и настроено, но что с этим делать? По Spark пишут на Scala, но я мягко говоря плохо знаю scala, да и разбираться не было времени, поискал нашел, что можно писать на python
https://spark.apache.org/docs/latest/api/python/index.html
Писать достаточно просто, свой код показать не могу по ряду причин, ибо подписывал о неразглашении.
Мне хватило посмотреть официальные примеры https://github.com/apache/spark/tree/master/examples/src/main/python
В частности пример подсчета слов
Да и сообщество будет только радо, новым адептам.
Такой вот маленький ликбез, кстати время потратил на все это порядка 5 часов, не считая перерывы на кофе и перекуры :)
Начал в голове перебирать как можно сделать да еще и побыстрому. Вспомнился hadoop, но и вспомнилось его настройка, стало как-то не по себе и в голове звучала тревожная музыка. Google помог и я наткнулся на интересный проект Apache Spark. Описание из Вики
Apache Spark — каркас приложений с открытым исходным кодом. Библиотека предназначена для создания распределённых приложений, однако в отличии от Hadoop, реализующего двухуровневую концепцию MapReduce с дисковым хранилищем, использует примитивы в оперативной памяти, благодаря чему позволяет получать стократный выигрыш в скорости работы в определённых приложениях. Возможность многократного доступа к загруженным в память пользовательским данным делает библиотеку привлекательной для алгоритмов машинного обучения. Полазил по их документации
http://spark.apache.org/docs/latest/
Думаю, а ведь то что надо и потрогаю что-то новое. Сказано сделано, поднимаю vpn тунель, захожу на ipmi и для простоты установил Ubuntu так для тестов. Далее уже работал по ssh
Установка Apache Для простоты установки будет использоваться Ubuntu. Вначале нам необходимо установить репозитарии Java
$ sudo apt-add-repository ppa:webupd8team/java
$ sudo apt-get update
$ sudo apt-get install oracle-java7-installer
$ sudo apt-get update
Так же нам необходимо установить git
$ sudo apt-get install git
На этом подготовительные работы завершены и мы можем приступать к установки Apache Spark
По шагам:
1) Переходим в домашний каталог
cd ~
2) Создадим директорию, куда будет скачен дистрибутив
mkdir spark .&& cd spark/
wget http://mirror.tcpdiag.net/apache/spark/spark-1.2.0/spark-1.2.0.tgz
3) После скачивания распаковываем и
gunzip -c spark-1.2.0.tgz | tar -xvf —
cd spark-1.2.0/
4) Установка и копирование на «постоянное место жительства»
sudo sbt/sbt assembly
cd ..
sudo cp -Rp spark-1.2.0 /usr/local/
cd /usr/local/
sudo ln -s spark-1.2.0 spark
Дабы не противоречить постулатам Unix не будем работать от root и создадим специального пользователя и ключи для него
sudo addgroup spark
sudo useradd -g spark spark
sudo adduser spark sudo
sudo mkdir /home/spark
sudo chown spark:spark /home/spark
Добавим в sudo
visudo
spark ALL=(ALL) NOPASSWD:ALL
sudo chown -R spark:spark /usr/local/spark/
Логинимся нашим пользователем и генерируем ключи
sudo su spark
ssh-keygen -t rsa -P «»
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
Делаем служебные папки
sudo mkdir -p /srv/spark/{logs,work,tmp,pids}
sudo chown -R spark:spark /srv/spark
sudo chmod 4755 /srv/spark/tmp
Теперь нужно настроить Spark
cd /usr/local/spark/conf/
cp -p spark-env.sh.template spark-env.sh
vim spark-env.sh
export SPARK_WORKER_CORES="2"
export SPARK_WORKER_MEMORY="1g"
export SPARK_DRIVER_MEMORY="1g"
export SPARK_REPL_MEM="2g"
export SPARK_WORKER_PORT=9000
export SPARK_CONF_DIR="/usr/local/spark/conf"
export SPARK_TMP_DIR="/srv/spark/tmp"
export SPARK_PID_DIR="/srv/spark/pids"
export SPARK_LOG_DIR="/srv/spark/logs"
export SPARK_WORKER_DIR="/srv/spark/work"
export SPARK_LOCAL_DIRS="/srv/spark/tmp"
export SPARK_COMMON_OPTS="$SPARK_COMMON_OPTS -Dspark.kryoserializer.buffer.mb=32 "
LOG4J="-Dlog4j.configuration=file://$SPARK_CONF_DIR/log4j.properties"
export SPARK_MASTER_OPTS=" $LOG4J -Dspark.log.file=/srv/spark/logs/master.log "
export SPARK_WORKER_OPTS=" $LOG4J -Dspark.log.file=/srv/spark/logs/worker.log "
export SPARK_EXECUTOR_OPTS=" $LOG4J -Djava.io.tmpdir=/srv/spark/tmp/executor "
export SPARK_REPL_OPTS=" -Djava.io.tmpdir=/srv/spark/tmp/repl/\$USER "
export SPARK_APP_OPTS=" -Djava.io.tmpdir=/srv/spark/tmp/app/\$USER "
export PYSPARK_PYTHON="/usr/bin/python"
SPARK_PUBLIC_DNS="DNS RECORD"
export SPARK_WORKER_INSTANCES=2 Далее
cp -p spark-defaults.conf.template spark-defaults.conf
vim spark-defaults.conf
spark.master spark://DNS RECORD:7077
spark.executor.memory 512m
spark.eventLog.enabled true
spark.serializer org.apache.spark.serializer.KryoSerializer
На этом установка закончена и можно запускать spark
cd /usr/local/spark/sbin
sbin/start-all.sh
Веб интерфейс со статистикой будет доступен по адресу
http://DNS RECORD:8080/
Чтобы меньше было отладочной информации необходимо сделать следующее
cd /usr/local/spark/conf
cp log4j.properties.template log4j.properties
И испрвить строку с
log4j.rootCategory=INFO, console
на
log4j.rootCategory=ERROR, console
Тем самым в логи будут писаться только ошибки. Вроде все установлено и настроено, но что с этим делать? По Spark пишут на Scala, но я мягко говоря плохо знаю scala, да и разбираться не было времени, поискал нашел, что можно писать на python
https://spark.apache.org/docs/latest/api/python/index.html
Писать достаточно просто, свой код показать не могу по ряду причин, ибо подписывал о неразглашении.
Мне хватило посмотреть официальные примеры https://github.com/apache/spark/tree/master/examples/src/main/python
В частности пример подсчета слов
from __future__ import print_function
import sys
from operator import add
from pyspark import SparkContext
if __name__ == "__main__":
if len(sys.argv) != 2:
print("Usage: wordcount <file>", file=sys.stderr)
exit(-1)
sc = SparkContext(appName="PythonWordCount")
lines = sc.textFile(sys.argv[1], 1)
counts = lines.flatMap(lambda x: x.split(' ')) \
.map(lambda x: (x, 1)) \
.reduceByKey(add)
output = counts.collect()
for (word, count) in output:
print("%s: %i" % (word, count))
sc.stop()
Как вы видите, изящно и просто. Если кого-либо возбудил к изучению этого зверя просто прекрасно.
Да и сообщество будет только радо, новым адептам.
Такой вот маленький ликбез, кстати время потратил на все это порядка 5 часов, не считая перерывы на кофе и перекуры :)
25 апреля 2015 в 12:46
Ближайшие курсы

Как начать свой путь в разработке?
Онлайн-курс
9
марта

Основы языка C#
Базовый курс
9
марта
Скетчинг: начальный уровень
Скетчинг: начальный уровень
9
марта
Новые статьи

Как Kanban помогает в адаптации сотрудников
22600

Что такое MVP и как к нему подступиться
348500

Обновляем программу обучения для менеджеров по продажам
49300