Ликбез про apache spark

Юрий Медведев
Как всегда дело было поздней ночью, была такая не тривиальная задача обработать файлы логов(общий объем около 70 Гб текстовых файлов и архивов)
Начал в голове перебирать как можно сделать да еще и побыстрому. Вспомнился 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 часов, не считая перерывы на кофе и перекуры :)
Юрий Медведев больше 2 лет назадСпасибо 1
0 чел.