Настройка кластера Apache Spark и Hive на Hadoop

Автор Категория , ,
Настройка кластера Apache Spark и Hive на Hadoop

Как настроить Apache Spark 3.0.1 и Hive 3.1.2 на Hadoop 3.3.0: тонкости установки и конфигурирования для обучения администраторов кластера и инженеров с примерами команд и кода распределенных приложений.

Запуск Spark-приложения на Hadoop-кластере

Прежде всего, для настройки кластера Apache Spark нужен работающий кластер Hadoop. Сама установка и настройка выполняется в 2 этапа:

  • сперва Spark должен знать, как работает Hadoop;
  • затем вычислительному движку нужно задать собственные конфигурации.

Для этого необходимо скопировать файлы конфигурации Hadoop в каталог конфигурации Spark на всех серверах в каталоге /pot/spark/conf.

На главном сервере следует отредактировать файлы конфигурации и скопировать их в файлы worker’ов, т.е. там, где выполняются рабочие процессы. Далее необходимо отредактировать файл .bashrc, добавив эти строки:

# Spark
export SPARK_HOME=/opt/spark
export SPARK_CONF_DIR=$SPARK_HOME/conf
export PATH=$SPARK_HOME/bin:$PATH

Теперь настройка вычислительного движка завершена, но перед отправкой распределенного приложения в кластер нужно предоставить JAR-файлы, просто запустив эти команды на любом сервере:

[hduser@{server} ~]# hdfs dfs –mkdir –p /user/spark/share/lib
[hduser@{server} ~]# hadoop fs –put /opt/spark/jars/* /user/spark/share/lib/

Далее можно отправить пользовательские приложения Spark в кластер и использовать Apache HDFS и YARN, запустив команду с набором параметров на любом сервере:

[hduser@{server} ~]# /opt/spark/bin/spark-submit \
--master yarn –deploy-mode cluster \
--class com.github.saeiddadkhah.hadoop.spark.Application \
--driver-memory 2G –driver-cores 2 \
--executor-memory 1G –executor-cores 1\
--name MyApp \
--num-executors 10 \
MyApp.jar

При этом необходимо предоставить некоторые другие конфигурации внутри приложения. В частности, определив точку входа через объект сеанса Spark, о чем мы подробно писали здесь. Также следует задать значения параметров контекста, например, как это сделано в следующем участке кода на Scala:

object SparkConfig {
  val ss = SparkSession
    .builder()
    .appName(“MyApp”)
    .config(“spark.hadoop.fs.defaultFS”, “hdfs://master:9000”)
    .config(“spark.sql.debug.maxToStringFields”, 100)
    .config(“fs.s3.impl”, “org.apache.hadoop.fs.s3native.NativeS3FileSystem”)
    .getOrCreate()
  ss.sparkContext.hadoopConfiguration.set(“fs.s3a.impl”, “org.apache.hadoop.fs.s3a.S3AfileSystem”)
  ss.sparkContext.hadoopConfiguration.set(“fs.s3a.path.style.access”, “True”)
}

Чтобы вычислительный движок мог обращаться к популярному SQL-on-Hadoop инструменту, NoSQL-хранилищу данных Hive, это тоже нужно настроить. Как это сделать и с какими трудностями можно при этом столкнуться, мы рассмотрим далее.

Настройка Apache Hive

Прежде всего необходимо скопировать файл конфигурации Hive hive-site.xml в каталог конфигурации Spark на всех серверах с помощью команды cp, сменив директорию на соответствующий каталог:

[hduser@{server} ~]# cd /pot/spark/conf
[hduser@{server} /opt/spark/conf]# cp /opt/hive/conf/hive-site.xml 

Далее нужно добавить другие конфигурации в Spark-приложение, чтобы включить поддержку Hive. По аналогии с вышерассмотренным участком кода на Scala, также следует определить точку входа в приложение через объект сеанса Spark и задать значения параметров контекста:

object SparkConfig {
  val ss = SparkSession
    .builder()
    .appName("MyApp")
    .config("spark.hadoop.fs.defaultFS", "hdfs://master:9000")
    .config("spark.sql.debug.maxToStringFields", 100)
    .config("spark.sql.warehouse.dir", "/user/hive/warehouse")
    .config("fs.s3.impl", "org.apache.hadoop.fs.s3native.NativeS3FileSystem")
    .config("hive.metastore.uris", "thrift://hiveserver:9083")
    .enableHiveSupport()
    .getOrCreate()
  ss.sparkContext.hadoopConfiguration.set("fs.s3a.impl", "org.apache.hadoop.fs.s3a.S3AFileSystem")
  ss.sparkContext.hadoopConfiguration.set("fs.s3a.path.style.access", "True")
}

При этом можно столкнуться с некоторыми проблемами. К примеру, исключение RuntimeException типа com.ctc.wstx.WstxParsingException:

Exception in thread "main" java.lang.RuntimeException: com.ctc.wstx.exc.WstxParsingException: Illegal character entity: expansion character

Обычно это случается при копировании, когда в файл конфигурации hive-site.xml попадает лишний символ. Удалить его можно, просто открыв этот файл в редакторе vi:

[hduser@hiveserver /opt/hive/conf]# vi hive-site.xml
# Find hive.txn.xlock.iow property and delete the special character between for and transactional words in its description.

Также можно столкнуться с исключением, которое возникает из-за несоответствия версий библиотек. Для устранения этой ошибки нужно проверить версию библиотеки guava в Apache Hive и Hadoop, чтобы привести их к единой последней версии. Сообщение об ошибке выглядит так:

Exception in thread "main" java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkArgument(ZLjava/lang/String;Ljava/lang/Object;)

Проверка версий:

[hduser@hiveserver ~]# ls /opt/hive/lib/ | grep guava
guava-19.0.jar

[hduser@hiveserver ~]# ls /opt/hadoop/share/hadoop/hdfs/lib/ | grep guava
guava-27.0-jre.jar

В данном примере нужно скопировать JAR-файл библиотеки guava из Hadoop в Hive:

[hduser@hiveserver ~]# mv /opt/hive/lib/guava-19.0.jar /opt/hive/lib/guava-19.0.jar.bak
[hduser@hiveserver ~]# cp /opt/hadoop/share/hadoop/hdfs/lib/guava-27.0-jre.jar /opt/hive/lib/guava-27.0-jre.jar

Узнайте больше про практическое использование Apache Spark и Hive для задач дата-инженерии, разработки распределенных приложений и аналитики больших данных на специализированных курсах в нашем лицензированном учебном центре обучения и повышения квалификации для разработчиков, менеджеров, архитекторов, инженеров, администраторов, Data Scientist’ов и аналитиков Big Data в Москве:

Источники

  1. https://medium.com/codex/setting-up-a-multi-node-apache-spark-cluster-on-apache-hadoop-and-apache-hive-412764ab6881
  2. https://medium.com/codex/setting-up-an-apache-hive-data-warehouse-6074775cf66