Домашняя BigData. Часть 1. Практика Spark Streaming на кластере AWS

Здравствуйте.

В данной статье мы в домашних условиях произведем установку на платформу EC2 AWS (Amazon Web Services) Apache Kafka, Apache Spark, Zookeeper, Spark-shell и научимся всем этим пользоваться.

Знакомство с платформой Amazon Web Services


1.1. По ссылке aws.amazon.com/console вам предстоит зарегистрироваться. Введите имя и запомните пароль.

1.2. Настраиваем экземпляры узлов для сервисов Zookeeper и Kafka.

  • Выберите в меню «Services->EC2». Далее необходимо выбрать версию операционной системы имиджа виртуальной машины, выбираем Ubuntu Server 16.04 LTS (HVM), SSD volume type, жмем ”Select". Переходим к настройке экземпляра сервера: тип «t3.medium» с параметрами 2vCPU, 4 GB памяти, General Purpose. Жмем «Next: Configuring Instance Details».
  • Добавляем количество экземпляров 1, жмем «Next: Add Storage»
  • Принимаем значение по умолчанию для размера диска 8 GB и меняем тип на Magnetic (в Production настройки исходя из обЪема данных и High Performance SSD)
  • В разделе «Tag Instances» для «Name» вводим имя экземпляра узла «Home1» (где 1 просто порядковый номер) и нажимаем на «Next:...»
  • В разделе " Configure Security Groups " выберите опцию «Use existing security group», выбрав имя группы безопасности («Spark_Kafka_Zoo_Project») и установите правила входящего трафика. Нажмите на «Next:...»
  • Просмотрите экран «Review» для проверки введенных значений и и запустите «Launch».
  • Для подключения к узлам кластера необходимо создать(в нашем случае использовать существующую) пару открытых ключей для идентификации и авторизации. Для этого выберите в списке тип операции «Use existing pair».

Создание ключей


  • Скачиваем Putty для клиента или используем подключение по SSH из терминала.
  • Файл ключа .pem использует старый формат для удобства конвертируем его в формат ppk используемый Putty. Для этого запускаем утилиту PuTTYgen, загружаем ключ в старом формате .pem в утилиту. Конвертируем ключ и сохраняем (Save Private Key) для последующего использования в домашнюю папку с расширением .ppk.

Запуск кластера


1.3. Для удобства работы переименуйте узлы кластера в нотации Node01-04. Для подключения к узлам кластера с локального компьютера через SSH необходимо определить IP адрес узла и его public/private DNS имя, выберите поочередно каждый из узлов кластера и для выбранного экземпляра (instance) запишите его public/private DNS имя для подключения через SSH и для установки ПО в текстовый файл HadoopAdm01.txt.

Пример: ec2-35-162-169-76.us-west-2.compute.amazonaws.com

Установка Apache Kafka в режиме SingleNode на узел кластера AWS


2.1. Для установки ПО выбираем нашу ноду (копируем его Public DNS) для подключения через SSH. Настраиваем подключение через SSH. Используем сохраненное имя первого узла для настройки подключения через SSH с использованием пары ключей Private/Public «HadoopUser01.ppk” созданных в пункте 1.3. Переходим в раздел Connection/Auth через кнопку Browse ищем папку, где мы предварительно сохранили файл „HadoopUserХХ.ppk“.

Сохраняем конфигурацию подключения в настройках.

2.2. Подключаемся к узлу и используем login: ubuntu.

• Используя привилегии root обновляем packages и устанавливаем дополнительные пакеты, требующиеся для дальнейшей установки и настройки кластера.

sudo apt-get update
sudo apt-get -y install wget net-tools netcat tar 

• Устанавливаем Java 8 jdk и проверяем версию Java.

sudo apt-get -y install openjdk-8-jdk

• Для нормальной производительности узла кластера необходимо подкорректировать настройки свопирования памяти. VM swappines по умолчанию установлен в 60% что значит при утилизации памяти в 60 % система начнет активно свопить данные с RAM на диск. В зависимости от версии Linux параметр VM swappines может быть установлен в 0 или 1:

sudo sysctl vm.swappiness=1

• Для сохранения настроек при перезагрузке добавим строчку в файл конфигурации.

echo 'vm.swappiness=1' | sudo tee --append /etc/sysctl.conf

• Редактируем записи в файле /etc/hosts для удобного разрешения имен узлов кластера kafka и zookeeper по private IP адресам назначенным узлам кластера.

echo "172.31.26.162 host01" | sudo tee --append /etc/hosts

Проверяем правильность распознавания имен с помощью ping любой из записей.

• Загружаем последние актуальные версии (http://kafka.apache.org/downloads) дистрибутивов kafka и scala и подготавливаем директорию с установочными файлами.

wget http://mirror.linux-ia64.org/apache/kafka/2.1.0/kafka_2.12-2.1.0.tgz 
tar -xvzf kafka_2.12-2.1.0.tgz
ln -s  kafka_2.12-2.1.0 kafka

• Удаляем файл архива tgz, он нам больше не понадобится

• Попробуем запустить сервис Zookeeper, для этого:

~/kafka/bin/zookeeper-server-start.sh -daemon ~/kafka/config/zookeeper.properties

Zookeeper стартует с параметрами запуска по умолчанию. Можно проверить по логу:

 tail -n 5 ~/kafka/logs/zookeeper.out

Для обеспечения запуска демона Zookeeper, после перезагрузки, нам необходимо стартовать Zookeper, как фоновый сервис:

bin/zookeeper-server-start.sh -daemon config/zookeeper.properties

Для проверки запуска Zookepper проверяем

netcat -vz localhost 2181

2.3. Настраиваем сервис Zookeeper и Kafka для работы. Первоначально отредактируем/создадим файл /etc/systemd/system/zookeeper.service (содержимое файла ниже).

[Unit]
Description=Apache Zookeeper server
Documentation=http://zookeeper.apache.org
Requires=network.target remote-fs.target
After=network.target remote-fs.target

[Service]
Type=simple
ExecStart=/home/ubuntu/kafka/bin/zookeeper-server-start.sh /home/ubuntu/kafka/config/zookeeper.properties
ExecStop=/home/ubuntu/kafka/bin/zookeeper-server-stop.sh

[Install]
WantedBy=multi-user.target

Далее для Kafka отредактируем/создадим файл /etc/systemd/system/kafka.service (содержимое файла ниже).

[Unit]
Description=Apache Kafka server (broker)
Documentation=http://kafka.apache.org/documentation.html
Requires=zookeeper.service

[Service]
Type=simple
ExecStart=/home/ubuntu/kafka/bin/kafka-server-start.sh /home/ubuntu/kafka/config/server.properties
ExecStop=/home/ubuntu/kafka/bin/kafka-server-stop.sh

[Install]
WantedBy=multi-user.target

• Активируем скрипты systemd для сервисов Kafka и Zookeeper.

sudo systemctl enable zookeeper
sudo systemctl enable kafka

• Проверим работу скриптов systemd.

sudo systemctl start zookeeper
sudo systemctl start kafka

sudo systemctl status zookeeper
sudo systemctl status kafka

sudo systemctl stop zookeeper
sudo systemctl stop kafka

• Проверим работоспособность сервисов Kafka и Zookeeper.

netcat -vz localhost 2181
netcat -vz localhost 9092

• Проверяем лог файл zookeeper.

cat logs/zookeeper.out

Первая радость


2.4. Создаем свой первый топик на собранном сервере kafka.
  • Важно использовать подключение к «host01:2181» как вы указывали в конфигурационном файле server.properties.
  • Запишем некоторые данные в топик.

kafka-console-producer.sh --broker-list host01:9092 --topic first_topic
Привет
Как прошли выходные

Ctrl-C — выход из консоли топика.

• Теперь попробуем прочитать данные из топика.

kafka-console-consumer.sh --bootstrap-server host01:9092 --topic last_topic --from-beginning

• Просмотрим список топиков kafka.

bin/kafka-topics.sh --zookeeper spark01:2181 --list

• Редактируем параметры сервера kafka для подстройки под single cluster setup
#необходимо изменить параметр ISR в 1.

bin/kafka-topics.sh --zookeeper spark01:2181 --config min.insync.replicas=1 --topic __consumer_offsets --alter

• Перезапускаем сервер Kafka и пытаемся снова подключиться consumer ом

• Посмотрим лист топиков.

bin/kafka-topics.sh --zookeeper host01:2181 --list

Настройка Apache Spark на одноузловом кластере


Мы подготовили экземпляр узла с установленным сервисом Zookeeper и Kafka на AWS, теперь необходимо установить Apache Spark, для этого:

3.1. Скачиваем последнюю версию дистрибутива Apache Spark.

wget https://archive.apache.org/dist/spark/spark-2.4.0/spark-2.4.0-bin-hadoop2.6.tgz

• Разархивируем дистрибутив и создадим символьный линк для spark и удалим ненужные файлы архивов.

tar -xvf spark-2.4.0-bin-hadoop2.6.tgz
ln -s spark-2.4.0-bin-hadoop2.6 spark
rm spark*.tgz

• Переходим в каталог sbin и запускаем spark мастера.

./start-master.sh

• Подключаемся с помощью веб браузера к серверу Spark на порт 8080.

• Запускаем spark-slaves на том же самом узле

./start-slave.sh spark://host01:7077

• Запускаем spark оболочку с мастером на узле host01.

./spark-shell --master spark://host01:7077

• Если запуск не работает, добавляем путь к Spark в bash.

vi ~/.bashrc
# добавляем строчки в конец файла
SPARK_HOME=/home/ubuntu/spark
export PATH=$SPARK_HOME/bin:$PATH

source ~/.bashrc

• Запускаем spark оболочку повторно с мастером на узле host01.

./spark-shell --master spark://host01:7077
 

3.2. Одноузловой кластер с Kafka, Zookeeper и Spark работает. Ура!

Немного творчества


4.1. Скачиваем редактор Scala-IDE (По ссылке scala-ide.org). Запускаем и начинаем писать код. Здесь я повторяться уже не буду, так как есть хорошая статья на Хабре.

4.2. В помощь полезная литература и курсы:

courses.hadoopinrealworld.com/courses/enrolled/319237
data-flair.training/blogs/kafka-consumer
www.udemy.com/apache-spark-with-scala-hands-on-with-big-data
  • +10
  • 2,4k
  • 3
Поделиться публикацией

Комментарии 3

    0
    >произведем установку ..., Apache Spark, Spark-shell
    Насколько я понимаю, Spark-shell не более чем один скрипт в составе спарка. И его никто не устанавливает отдельно. Или вы о чем?
      0
      Это все здорово в плане потренероваться, но почему просто не запустить EMR одной кнопкой? Если же нужно что-то на Spark сделать разовое (типа ETL раз в сутки) — то Glue в помощь или EMR Steps.
        0
        А где тут BigData? Зачем AWS? Все можно проделать на локалхосте. Статью нужно переименовать в «Учимся работать с EC2».

        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

        Самое читаемое