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


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

В интернете много сервисов, предоставляющих возможности облачных сервисов. С их помощью можно осваивать технологии BigData.

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

image


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


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

Настраиваем экземпляры узлов для сервисов 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 (https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html) для клиента или используем подключение по SSH из терминала.
  • Файл ключа .pem использует старый формат для удобства конвертируем его в формат ppk используемый Putty. Для этого запускаем утилиту PuTTYgen, загружаем ключ в старом формате .pem в утилиту. Конвертируем ключ и сохраняем (Save Private Key) для последующего использования в домашнюю папку с расширением .ppk.

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


Для удобства работы переименуйте узлы кластера в нотации 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


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

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

Подключаемся к узлу и используем 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

    Настраиваем сервис 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

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


Создаем свой первый топик на собранном сервере 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, для этого:

Скачиваем последнюю версию дистрибутива 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

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

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


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

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

courses.hadoopinrealworld.com/courses/enrolled/319237
data-flair.training/blogs/kafka-consumer
www.udemy.com/apache-spark-with-scala-hands-on-with-big-data




К сожалению, не доступен сервер mySQL