Инженерия данных

Как настроить среду для Spark

Spark — это очень популярная платформа для работы с большими данными с открытым исходным кодом, которую используют многие компании отрасли. Здесь я хочу показать вам, как настроить среду Spark на компьютере с Linux (я использую Ubuntu 20.04.3).

Монтаж

Вот список того, что нам нужно установить:

  1. JDK
  2. ИДЕЯ
  3. Скала
  4. Искра
  5. PySpark (необязательно)
  6. Хадуп

1. ДДК

JDK — это сокращение от Java Development Kit, среды разработки для Java. Spark написан на Scala, языке, который очень похож на Java, а также работает на JVM (виртуальная машина Java), поэтому сначала нам нужно установить JDK. Здесь я установил JDK 11.0.13.

Чтобы установить JDK, запустите:

$ sudo apt install default-jre

Далее проверяем, выполнена ли установка:

$ java -version

Он должен вывести следующее:

openjdk version "11.0.13" 2021-10-19
OpenJDK Runtime Environment (build 11.0.13+8-Ubuntu-0ubuntu1.20.04)
OpenJDK 64-Bit Server VM (build 11.0.13+8-Ubuntu-0ubuntu1.20.04, mixed mode, sharing)

2. ИДЕЯ

IntelliJ IDEA — самая популярная IDE для Java/Scala. Он нужен нам для написания и запуска кода.

Загрузите и установите последнюю версию IDEA здесь: https://www.jetbrains.com/idea/download/#section=linux. Я выбрал бесплатную версию сообщества.

3. Скала

Scala — это язык, который обычно используется для написания программ Spark (наряду с Python!). Если вы хотите научиться программировать на Scala, очень рекомендую этот курс: https://www.coursera.org/specializations/scala. Если вы не знаете Scala, вы можете использовать Python, но все равно установите Scala!

Скачать Scala можно здесь: https://www.scala-lang.org/download/scala2.html. Вы можете либо выбрать Загрузить двоичные файлы Scala для UNIX и распаковать двоичные файлы локально, либо установить Scala с помощью IDEA, выбрав Начало работы со Scala в IntelliJ. Я сделал последнее и установил Scala 2.12.11 на свою машину.

4. Искра

Загрузите Spark здесь: https://spark.apache.org/downloads.html. Здесь я выбрал последний выпуск (3.2.0), предварительно созданный для Apache Hadoop 3.3.

Затем распакуйте пакет и переместите его в нужную папку:

$ tar -zxvf spark-3.2.0-bin-hadoop3.2.tgz
$ mv spark-3.2.0-bin-hadoop3.2 /opt/spark

Затем вам нужно изменить файл конфигурации bash (~/.bashrc или ~/.bash_profile или ~/.zshrc) и добавить Spark в PATH:

export SPARK_HOME=/opt/spark
export PATH=$PATH:$SPARK_HOME/bin:$SPARK_HOME/sbin

Наконец, вам нужно снова запустить файл конфигурации, чтобы он заработал:

$ source ~/.bashrc

Теперь вы можете запустить Spark на своем компьютере! Перейдите к /opt/spark/bin/ и выполните:

$ ./spark-shell

Если вы видите приведенный ниже результат, это означает, что все готово для Spark!

5. PySpark (необязательно)

Короче говоря, PySpark — это версия Spark для Python. Вы можете писать код Spark в стиле Python с помощью PySpark, не изучая Scala. Для установки PySpark используйте PyPI, запустите:

$ pip install pyspark

6. Хадуп

Hadoop — это предыдущее поколение платформы больших данных до Spark. Каким бы замечательным ни был Spark, в некотором смысле он был построен поверх Hadoop и по-прежнему опирается на компоненты Hadoop. Подробнее об их отношениях можно прочитать в этой статье. Здесь я хочу запускать задания Spark в кластере Hadoop и использовать YARN (инструмент управления ресурсами и планирования Hadoop) и HDFS (файловая система данных Hadoop), потому что они действительно просты в использовании, поэтому установка Hadoop является обязательной.

Чтобы установить Hadoop, загрузите его здесь: https://hadoop.apache.org/releases.html. Здесь я выбрал версию 3.2.2.

Затем распакуйте пакет и переместите его в нужную папку:

$ tar -zxvf hadoop-3.2.2.tar.gz
$ mv hadoop-3.2.2.tar.gz /usr/local/hadoop/

Затем вам нужно изменить файл конфигурации bash (~/.bashrc или ~/.bash_profile или ~/.zshrc) и добавить Hadoop в PATH:

export HADOOP_HOME=/usr/local/hadoop/hadoop-3.2.2/
export HADOOP_PREFIX=$HADOOP_HOME
export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop

Затем снова запустите файл конфигурации, чтобы он заработал:

$ source ~/.bashrc

Теперь вы можете запустить Hadoop на своем компьютере! Перейдите к /usr/local/hadoop/hadoop-3.2.2/bin и выполните:

$ hadoop version

Если вы видите приведенный ниже результат, это означает, что Hadoop успешно установлен!

Конфигурация

1. Настройте распределенный режим Hadoop (настройка HDFS и YARN)

1.1 Настройка аутентификации SSH

Во-первых, вам нужно убедиться, что на вашем компьютере установлена ​​Java, выполнив действия, описанные в разделе «Установка». Затем нам нужно настроить пары ключей распределенной аутентификации, чтобы главный узел мог легко подключаться к рабочим узлам. Установите SSH на свой компьютер с помощью:

$ sudo apt install openssh-client
$ sudo apt install openssh-server

Затем создайте открытый ssh-ключ на каждом узле с помощью:

$ ssh-keygen -t rsa -P ''

После этого отправьте открытый ключ на каждую машину в кластере:

$ cat ~/.ssh/id_dsa.pub >> ~/.ssh/autorized_keys

Запустите ssh localhost, чтобы проверить, входите ли вы в систему с помощью ключа. Если вы видите ниже, ваша настройка SSH завершена!

1.2 Настройка местоположения NameNode

Обновите свой /hadoop/etc/hadoop/core-site.xml, чтобы настроить расположение NameNode:

<configuration>
    <!-- specify communication address for namenode>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://localhost:9000</value>
        <description>The name of the default file system.</description>
    </property>
    <!-- specify storage directory of temorary files generated during Hadoop run>
    <property>
        <name>hadoop.tmp.dir</name>
        <value>file:/usr/local/hadoop/hadoop-3.2.2/tmp</value>
        <description>A base for other temporary directories.</description>
    </property>
</configuration>

1.3 Настройка пути HDFS

Обновите hadoop/etc/hadoop/hdfs-site.xml, чтобы настроить путь HDFS:

<configuration>
    <!-- specify how many times data is replicated in the cluster>
    <property>
        <name>dfs.replication</name>
        <value>1</value>
    </property>
    <property>
        <name>dfs.namenode.name.dir</name>
        <value>file:/usr/local/hadoop/hadoop-3.2.2/tmp/dfs/name</value>
    </property>
    <property>
        <name>dfs.namenode.data.dir</name>
        <value>file:/usr/local/hadoop/hadoop-3.2.2/tmp/dfs/data</value>
    </property>
</configuration>

1.4 Настройка пряжи

Сначала отредактируйте hadoop/etc/hadoop/mapred-site.xml, чтобы установить YARN в качестве платформы по умолчанию для операций MapReduce:

<configuration>
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
    <property>
        <name>yarn.app.mapreduce.am.env</name>
        <value>HADOOP_MAPRED_HOME=$HADOOP_HOME</value>
    </property>
    <property>
        <name>mapreduce.map.env</name>
        <value>HADOOP_MAPRED_HOME=$HADOOP_HOME</value>
    </property>
    <property>
        <name>mapreduce.reduce.env</name>
        <value>HADOOP_MAPRED_HOME=$HADOOP_HOME</value>
    </property>
</configuration>

Затем отредактируйте hadoop/etc/hadoop/yarn-site.xml:

<property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
    <property>
        <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
        <value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>

1.5 Формат HDFS

После настройки вам необходимо отформатировать HDFS, выполнив:

$ hadoop namenode -format

Если вы видите ниже, форматирование выполнено!

1.6 Запустите HDFS и YARN

Теперь вы можете запускать сервисы HDFS и YARN! Перейдите к /usr/local/hadoop/hadoop-3.2.2/bin и выполните:

$ start-all.sh

Используйте команду jps, чтобы убедиться, что HDFS и YARN успешно работают:

В конце концов, ваши задания завершены, вы можете завершить службу Hadoop, перейдя в /usr/local/hadoop/hadoop-3.2.2/bin и выполнив:

$ stop-all.sh

2. Создайте и запустите код Scala в IDEA

2.1 Создайте новый проект Scala

Как я упоминал ранее, IDEA — очень популярная IDE для Scala. Одна из причин этого заключается в том, что очень легко настроить среду разработки для проектов Scala с помощью IDEA. Вот как:

Сначала откройте IntelliJ IDEA после ее загрузки. Нажмите Файл -> Создать -> Проект. Выберите Scala -> sbt и нажмите Далее:

Затем назовите свой проект и выберите правильные версии JDK, SBT и Scala. Убедитесь, что версии соответствуют тому, что мы установили ранее!

Затем нажмите Готово, и вы увидите представление проекта:

Откройте файл build.sbt и измените его, как показано ниже:

name := "demo_example"
scalaVersion := "2.12.11"
version := "1.0"
libraryDependencies += "org.scala-lang.modules" %% "scala-parser-combinators" % "1.1.2"
libraryDependencies += "org.apache.spark" %% "spark-core" % "3.2.0"
libraryDependencies += "org.apache.spark" %% "spark-mllib" % "3.2.0"
libraryDependencies += "org.apache.spark" %% "spark-sql" % "3.2.0"
libraryDependencies += "org.apache.spark" %% "spark-hive" % "3.2.0"

Последние четыре строки добавляют пакеты Spark в качестве ваших зависимостей Scala. После сохранения редактирования вы увидите три варианта: Обновить проект, Включить автоматический импорт и Игнорировать. Нажмите Включить автоматический импорт, чтобы IDEA начала загрузку зависимостей. Он также будет собирать ваш проект каждый раз, когда в build.sbt вносятся изменения. Как только это будет сделано, вы увидите все искровые зависимости во внешних библиотеках на левой панели.

2.2 Создайте и запустите пример скрипта Scala/Spark

Теперь мы можем написать код Scala в этом проекте. Перейдите в каталог src -> main -> scala на левой панели, щелкните правой кнопкой мыши и выберите Создать -> Класс Scala, затем выберите Объект. и введите имя класса как Demo, нажмите ОК.

Добавьте следующий код в файл Demo.scala:

import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}
object Demo {
  def main(args: Array[String]) = {
      val sparkConf: SparkConf = new SparkConf().setMaster("local").setAppName("WordCount")
      val sc = new SparkContext(sparkConf)
      // 1. read file, get data by line
      val lines: RDD[String] = sc.parallelize(Array("Hello World Jack", "Hello World Luna", "Hello World Jack"))
    // 2. break each line to words
      val words: RDD[String] = lines.flatMap(_.split(" "))
      // 3. split data based on words
      val wordGroup: RDD[(String, Iterable[String])] = words.groupBy(word => word)
      // 4. convert data after splitting
      val wordToCount = wordGroup.map {
        case (word, list) => {
          (word, list.size)
        }
      }
      // 5. collect the results and print
      val array: Array[(String, Int)] = wordToCount.collect()
      array.foreach(println)
      // close connection
      sc.stop()
  }
}

Что делает этот фрагмент кода, так это подсчет слов в трех предложениях: «Hello World Jack», «Hello World Luna», «Hello World Jack» и вывод результатов на консоль. Вы можете запустить его, щелкнув правой кнопкой мыши и выбрав Запустить демонстрацию. После нескольких журналов из Spark вы должны увидеть вывод.

Вот и все! Теперь у вас есть первая запущенная программа Spark!

2.3 Упакуйте сценарий Scala в файл jar

Чтобы отправлять задания Spark, написанные на Scala, вы должны упаковать свой код Scala в исполняемый файл Jar. Вот как это сделать с нашим примером подсчета слов.

Нажмите Файл -> Структура проекта -> Артефакты -> + -> JAR -> Из модулей с зависимостями.

Выберите Модуль: demo_example и Основной класс: Demo, нажмите ОК.

Затем удалите поддержку внешних пакетов lib в Output Layout и оставьте только вывод компиляции demo_example. Нажмите ОК.

Наконец, скомпилируйте и сгенерируйте файл Jar, нажав Build -> Build Artifacts -> demo_example:jar -> Build. Вы увидите файл demo_example.jar в out/artifacts/demo_example_jar/ на левой панели. Это ваш файл JAR!

Теперь вы можете отправить этот jar-файл в Spark и увидеть, как он работает:

spark-submit --class Demo --master local your/path/to/demo_example.jar

Если вы видите ниже, это означает, что вы только что успешно упаковали и отправили свое приложение Scala в Spark.

Поздравляем! Вы только что настроили свою среду для Spark. Теперь вы можете написать любое приложение Spark и запустить его в кластере. Удачного кодирования!

Репозиторий Github: https://github.com/haocai1992/SparkDemo