Здравствуйте.
В данной статье мы в домашних условиях произведем установку на платформу EC2 AWS (Amazon Web Services) Apache Kafka, Apache Spark, Zookeeper, Spark-shell и научимся всем этим пользоваться.
1.1. По ссылке aws.amazon.com/console вам предстоит зарегистрироваться. Введите имя и запомните пароль.
1.2. Настраиваем экземпляры узлов для сервисов Zookeeper и Kafka.
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
2.1. Для установки ПО выбираем нашу ноду (копируем его Public DNS) для подключения через SSH. Настраиваем подключение через SSH. Используем сохраненное имя первого узла для настройки подключения через SSH с использованием пары ключей Private/Public «HadoopUser01.ppk” созданных в пункте 1.3. Переходим в раздел Connection/Auth через кнопку Browse ищем папку, где мы предварительно сохранили файл „HadoopUserХХ.ppk“.
Сохраняем конфигурацию подключения в настройках.
2.2. Подключаемся к узлу и используем login: ubuntu.
• Используя привилегии root обновляем packages и устанавливаем дополнительные пакеты, требующиеся для дальнейшей установки и настройки кластера.
• Устанавливаем Java 8 jdk и проверяем версию Java.
• Для нормальной производительности узла кластера необходимо подкорректировать настройки свопирования памяти. VM swappines по умолчанию установлен в 60% что значит при утилизации памяти в 60 % система начнет активно свопить данные с RAM на диск. В зависимости от версии Linux параметр VM swappines может быть установлен в 0 или 1:
• Для сохранения настроек при перезагрузке добавим строчку в файл конфигурации.
• Редактируем записи в файле /etc/hosts для удобного разрешения имен узлов кластера kafka и zookeeper по private IP адресам назначенным узлам кластера.
Проверяем правильность распознавания имен с помощью ping любой из записей.
• Загружаем последние актуальные версии (http://kafka.apache.org/downloads) дистрибутивов kafka и scala и подготавливаем директорию с установочными файлами.
• Удаляем файл архива tgz, он нам больше не понадобится
• Попробуем запустить сервис Zookeeper, для этого:
Zookeeper стартует с параметрами запуска по умолчанию. Можно проверить по логу:
Для обеспечения запуска демона Zookeeper, после перезагрузки, нам необходимо стартовать Zookeper, как фоновый сервис:
Для проверки запуска Zookepper проверяем
2.3. Настраиваем сервис Zookeeper и Kafka для работы. Первоначально отредактируем/создадим файл /etc/systemd/system/zookeeper.service (содержимое файла ниже).
Далее для Kafka отредактируем/создадим файл /etc/systemd/system/kafka.service (содержимое файла ниже).
• Активируем скрипты systemd для сервисов Kafka и Zookeeper.
• Проверим работу скриптов systemd.
• Проверим работоспособность сервисов Kafka и Zookeeper.
• Проверяем лог файл zookeeper.
2.4. Создаем свой первый топик на собранном сервере kafka.
Ctrl-C — выход из консоли топика.
• Теперь попробуем прочитать данные из топика.
• Просмотрим список топиков kafka.
• Редактируем параметры сервера kafka для подстройки под single cluster setup
#необходимо изменить параметр ISR в 1.
• Перезапускаем сервер Kafka и пытаемся снова подключиться consumer ом
• Посмотрим лист топиков.
Мы подготовили экземпляр узла с установленным сервисом Zookeeper и Kafka на AWS, теперь необходимо установить Apache Spark, для этого:
3.1. Скачиваем последнюю версию дистрибутива Apache Spark.
• Разархивируем дистрибутив и создадим символьный линк для spark и удалим ненужные файлы архивов.
• Переходим в каталог sbin и запускаем spark мастера.
• Подключаемся с помощью веб браузера к серверу Spark на порт 8080.
• Запускаем spark-slaves на том же самом узле
• Запускаем spark оболочку с мастером на узле host01.
• Если запуск не работает, добавляем путь к Spark в bash.
• Запускаем spark оболочку повторно с мастером на узле host01.
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
В данной статье мы в домашних условиях произведем установку на платформу 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
Комментарии (3)
Stas911
16.03.2019 02:42Это все здорово в плане потренероваться, но почему просто не запустить EMR одной кнопкой? Если же нужно что-то на Spark сделать разовое (типа ETL раз в сутки) — то Glue в помощь или EMR Steps.
Coocos
16.03.2019 08:04А где тут BigData? Зачем AWS? Все можно проделать на локалхосте. Статью нужно переименовать в «Учимся работать с EC2».
sshikov
>произведем установку ..., Apache Spark, Spark-shell
Насколько я понимаю, Spark-shell не более чем один скрипт в составе спарка. И его никто не устанавливает отдельно. Или вы о чем?