Инженерия данных
Как настроить среду для Spark
Spark — это очень популярная платформа для работы с большими данными с открытым исходным кодом, которую используют многие компании отрасли. Здесь я хочу показать вам, как настроить среду Spark на компьютере с Linux (я использую Ubuntu 20.04.3).
Монтаж
Вот список того, что нам нужно установить:
- JDK
- ИДЕЯ
- Скала
- Искра
- PySpark (необязательно)
- Хадуп
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