Вступление
В моей последней статье я рассмотрел, как настроить и использовать Hadoop в Windows. Теперь эта статья посвящена настройке локальной среды разработки для Apache Spark в ОС Windows.
Apache Spark — самая популярная технология кластерных вычислений, предназначенная для быстрых и надежных вычислений. Он обеспечивает неявный параллелизм данных и отказоустойчивость по умолчанию. Он легко интегрируется с HIVE и HDFS и обеспечивает беспроблемный опыт параллельной обработки данных. Вы можете прочитать больше о Spark на https://spark.apache.org .
По умолчанию проекты Spark SQL не работают в ОС Windows и требуют, чтобы мы сначала выполнили некоторые основные настройки; это все, что мы собираемся обсудить в этой статье, поскольку я не нашел это хорошо задокументированным в Интернете или в книгах.
Эта статья также может быть использована для настройки среды разработки Spark на Mac или Linux. Просто убедитесь, что вы загрузите правильную версию ОС с сайта Spark.
Вы можете обратиться к проекту Scala, используемому в этой статье от GitHub, здесь: https://github.com/gopal-tiwari/LocalSparkSql .
Что ожидать
В конце этой статьи вы сможете создавать / запускать свои проекты Spark SQL и spark-shell в ОС Windows.
Я разделил эту статью на три части. Вы можете использовать любой из трех режимов в зависимости от конкретного варианта использования.
Вам также может понравиться:
Полная коллекция Apache Spark [Учебники и статьи] .
Режимы настройки Spark Local Development
- Доступ к одному проекту (одиночное подключение к одному проекту)
Время установки: 15 минут
Функциональность: Limited
- У каждого проекта будет свой метастор и склад.
- Базы данных и таблицы, созданные одним проектом, не будут доступны другим проектам.
- Только один проект Spark SQL может запускаться или выполняться одновременно.
Время установки: 20 минут
Функциональность: Extended
- У каждого проекта будет общий метастор и склад.
- Таблицы, созданные одним проектом, будут доступны другим проектам или спарк-оболочке.
- Это создаст ощущение псевдокластера.
- Только один проект Spark SQL может запускаться или выполняться одновременно.
Время установки: 40 минут
Функциональность: Полная
- Эта конфигурация немного утомительна, но одноразовая настройка предоставит вам возможность иметь несколько открытых соединений для метастаза.
- Там не будет разницы между вашей локальной системой и кластером с точки зрения функциональности.
- Базы данных и таблицы будут совместно использоваться всеми проектами или оболочками Spark.
- Вы можете одновременно запускать несколько проектов spark-shell или Spark.
Решение для ошибок искры
Многие из вас, возможно, пытались запустить spark в Windows, и могли столкнуться со следующей ошибкой при запуске проекта:
16/04/02 19:59:31 WARN NativeCodeLoader: Unable to load native-hadoop library for
your platform... using builtin-java classes where applicable
16/04/02 19:59:31 ERROR Shell: Failed to locate the winutils binary in the hadoop
binary path java.io.IOException: Could not locate executable null\bin\winutils.exe
in the Hadoop binaries.
Это связано с тем, что в вашей системе нет встроенных двоичных файлов Hadoop для ОС Windows.
Вы можете создать его, следуя моей предыдущей статье, или скачать его с https://github.com/cdarlint/winutils .
Приведенная ниже ошибка также связана с двоичными файлами Native Hadoop для ОС Windows.
16/04/03 19:59:10 ERROR util.Shell: Failed to locate the winutils binary in the
hadoop binary path java.io.IOException: Could not locate executable
C:\hadoop\bin\winutils.exe in the Hadoop binaries.
Решение то же самое. Нам нужно установить HADOOP_HOME
с родными двоичными файлами Windows.
Итак, просто следуйте этой статье, и в конце этого урока вы сможете избавиться от всех этих ошибок.
Скачивание необходимых файлов
- Загрузите и установите JDK в соответствии с архитектурой вашей ОС и ЦП с https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html .
- Установите версию Scala в зависимости от версии Spark, которую вы используете, по адресу https://www.scala-lang.org/download/all.html .
- Загрузите и установите 7-zip с https://www.7-zip.org/download.html .
- Загрузите и извлеките Apache Spark, используя 7-zip с http://spark.apache.org/downloads.html .
- Загрузите zip-файл или клон двоичных файлов Hadoop для Windows со страницы https://github.com/cdarlint/winutils .
- Если у вас не установлена IDE, пожалуйста, установите ее. Intellij IDEA является предпочтительным, и вы можете получить версию для сообщества по адресу https://www.jetbrains.com/idea/download/#section=windows .
- Загрузите распространяемый пакет Microsoft Visual C ++ 2010, если в вашей системе эти предварительно не установлены:
Для 32-битных (x86) ОС вам нужно установить только., А для 64-битных (x64) -. и б.
В этом руководстве предполагается, что двоичные файлы Spark и Hadoop разархивированы на диске C: \ . Однако вы можете разархивировать их в любом месте вашей системы.
Настройка и установка
JDK
Прежде чем мы продолжим, давайте удостоверимся, что ваши настройки Java выполнены правильно, а переменные среды обновлены в установочном каталоге Java.
Чтобы подтвердить, что Java установлена на вашем компьютере, просто откройте cmd и введите java –version
. Вы должны увидеть версию Java, установленную в вашей системе.
Если вы получили сообщение об ошибке, например «java» не распознается как внутренняя или внешняя команда, работающая программа или пакетный файл », выполните следующие действия. В противном случае пропустите это.
- Выполните загруженную настройку JRE и JDK и завершите установку с настройками по умолчанию.
- Теперь откройте диалог системных переменных окружения
- В Windows 7 щелкните правой кнопкой мыши на « Мой компьютер» и выберите « Свойства»> «Дополнительно» .
- Для Windows 8 перейдите в Панель управления> Система> Расширенные настройки системы .
- Для Windows 10 перейдите в Панель управления> Система и безопасность> Система> Расширенные настройки системы .
JAVA_HOME
в поле Имя переменной и укажите путь установки JDK в поле Значение переменной .- Progra ~ 1 = «Программные файлы»
- Progra ~ 2 = ‘Программные файлы (x86)’
Это должно выглядеть так:
java –version
, и вы сможете увидеть версию Java, которую вы только что установили.Если ваша командная строка выглядит примерно так, как на картинке выше, вы готовы. В противном случае вам нужно проверить, совпадает ли ваша установочная версия с архитектурой вашей ОС (x86, x64). Путь переменных среды также может быть неправильным.
Scala
- Возможно, вам придется установить Scala, в зависимости от вашей версии Spark.
- Для этой статьи мы будем использовать Spark 2.4.4 и Scala 2.12.10.
- Просто запустите скачанный scala-2.12.10.msi и следуйте инструкциям по установке.
- Чтобы подтвердить установку Scala, откройте cmd и введите
scala –version
. Ваша командная строка должна выглядеть следующим образом:
Настройка IntelliJ IDEA
- Вы можете настроить Eclipse с помощью плагина Scala или просто установить IntelliJ IDEA.
- Вы можете установить плагин Scala на экране первоначальной настройки или в меню « Настройки»> «Плагин»> «Поиск и установка Scala».
- Если у вас возникают проблемы с прокси-сервером VPN во время установки плагина, вы можете выбрать автономную установку плагина.
- Убедитесь, что окно file> settings> plugins показывает, что плагин Scala установлен, как показано на следующем рисунке:
Hadoop Home Setup
- Откройте загруженный репозиторий GitHub https://github.com/cdarlint/winutils, используя 7-zip (т.е. winutils-master.zip).
- Внутри вы найдете файл hadoop-2.7.7 . Теперь распакуйте его на диск C: \ .
- Ваш каталог C: \ hadoop-2.7.7 \ bin должен выглядеть так, как показано ниже:
- Когда извлечение закончено, нам нужно добавить новую
HADOOP_HOME
переменную системной среды. - Чтобы добавить a
HADOOP_HOME
, откройте диалоговое окно переменных среды и нажмите кнопку « Создать» в разделе « Системные переменные » и заполните текстовые поля « Имя» и « Значение» , как показано на рисунке ниже:
Настройка Spark Home
- Откройте загруженный файл Spark gz, используя 7-zip (т.е. spark-2.4.4-bin-hadoop2.7.gz).
- Внутри этого вы найдете tar-файл spark-2.4.4-bin-hadoop2.7 . Дважды щелкните по нему и извлеките каталог spark-2.4.4-bin-hadoop2.7 на диск C: \ .
- Ваш каталог C: \ spark-2.4.4-bin-hadoop2.7 должен выглядеть следующим образом:
- Как только извлечение закончено, нам нужно добавить каталог Spark bin в переменную System Path «Path».
- Отредактируйте переменную пути и добавьте «C: \ spark-2.4.4-bin-hadoop2.7 \ bin», как показано на рисунке ниже:
ПРИМЕЧАНИЕ. Если у вас нет прав администратора для добавления переменных среды, не беспокойтесь, так как вы можете установить его в IDE для каждого проекта отдельно. Процесс объясняется в следующем разделе.
Доступ к одному проекту
Теперь давайте создадим новый проект Scala-Maven с именем «LocalSparkSql». Кроме того, вы можете клонировать его из GitHub: https://github.com/gopal-tiwari/LocalSparkSql .
Структура проекта выглядит следующим образом:
LocalSparkHiveTest.scala
Scala
xxxxxxxxxx
1
package org.connected.spark
2
import org.apache.spark.sql.{DataFrame, SaveMode, SparkSession}
4
object LocalSparkHiveTest {
6
def main(args: Array[String]): Unit = {
8
val spark: SparkSession = SparkSession.builder()
10
.enableHiveSupport()
11
.master("local")
12
.appName("Demo")
13
.getOrCreate()
14
spark.sql("SHOW DATABASES").show
16
spark.sql("CREATE DATABASE IF NOT EXISTS sparkdemo")
17
spark.sql("CREATE TABLE IF NOT EXISTS sparkdemo.table1(id INT, name STRING)")
18
spark.sql("SHOW DATABASES").show
19
20
import spark.implicits._
21
val df:DataFrame = Seq(
22
(1, "One"),
23
(2, "Two"),
24
(3, "Three")
25
).toDF("id","name")
26
df.write.mode(SaveMode.Append).format("hive").saveAsTable("sparkdemo.table1")
28
//Thread.sleep(60 * 1000)
29
spark.sql("SELECT * FROM sparkdemo.table1").show(false)
30
println(spark.sql("select * from sparkdemo.table1").count)
31
}
33
}
pom.xml
XML
xxxxxxxxxx
1
2
<project xmlns="http://maven.apache.org/POM/4.0.0"
3
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5
<modelVersion>4.0.0</modelVersion>
6
<groupId>org.connected.spark</groupId>
8
<artifactId>LocalSparkSql</artifactId>
9
<version>1.0.0-SNAPSHOT</version>
10
<dependencies>
12
<dependency>
13
<groupId>org.apache.spark</groupId>
14
<artifactId>spark-core_2.12</artifactId>
15
<version>2.4.4</version>
16
</dependency>
17
<dependency>
18
<groupId>org.apache.spark</groupId>
19
<artifactId>spark-sql_2.12</artifactId>
20
<version>2.4.4</version>
21
</dependency>
22
<dependency>
23
<groupId>org.apache.spark</groupId>
24
<artifactId>spark-hive_2.12</artifactId>
25
<version>2.4.4</version>
26
</dependency>
27
</dependencies>
28
</project>
Теперь давайте щелкните правой кнопкой мыши файл «LocalSparkHiveTest» и нажмите « Выполнить» .
Ошибка 1
Exception in thread "main" org.apache.spark.sql.AnalysisException:
java.lang.RuntimeException: java.io.IOException: (null) entry in command string:
null chmod 0733 C:\tmp\hive;
Если вы видите вышеупомянутую ошибку, это означает, что вы HADOOP_HOME
не правильно настроены.
Если вам не удалось установить переменные системной среды из-за проблемы с правами доступа администратора, вы можете установить ее здесь на уровне проекта, выполнив несколько шагов, описанных ниже, в противном случае вы можете перейти к следующей инструкции.
- Перейдите в верхний правый угол экрана Intellij и выберите Edit Configurations.
- В левой боковой панели разверните Приложение, добавьте и выберите LocalSparkHiveTest .
- Теперь добавьте «HADOOP_HOME = C: \ hadoop-2.7.7» в поле «Переменная среды».
- Нажмите на Применить и закройте диалоговое окно.
Теперь давайте попробуем снова запустить основной объект
Ошибка 2
Exception in thread "main" org.apache.spark.sql.AnalysisException:
java.lang.RuntimeException: java.lang.RuntimeException: The root scratch dir:
/tmp/hive on HDFS should be writable. Current permissions are: ---------;
Чтобы устранить эту ошибку, нам нужно открыть разрешения для временного каталога Hive по умолчанию.
Здесь нам нужно открыть домашнюю страницу Hadoop, а затем перейти в каталог / bin и выполнить следующую команду:
winutils.exe chmod 777 /tmp/hive
Предоставленные разрешения должны быть «drwxrwxrwx», вы можете проверить статус разрешения, используя следующую команду
winutils.exe ls \tmp\hive
Ошибка 3
Вы можете получить следующую ошибку, если на вашем компьютере нет распространяемого пакета Microsoft Visual C ++ 2010.
The code execution cannot proceed because MSVCR100.dll was not found.
Reinstalling the program may fix this problem.
Вы можете скачать и установить C ++ 2010 Redistributable Package из раздела « Загрузки » этой статьи, так как я предоставил прямую ссылку для скачивания там.
Теперь давайте снова выполним проект, и вы сможете создать базу данных и таблицу без проблем.
Вывод:
К настоящему времени вы могли заметить, что в корневой папке вашего проекта были созданы две новые директории, metastore_db и spark-warehouse .
Что это за каталоги ???
metastore_db:
Spark SQL использует метасторное хранилище Hive для управления метаданными баз данных и таблиц, созданных пользователями. Вы можете принять это как небольшую реляционную базу данных, в которой хранится информация о фактическом пути к каталогу базы данных, структурах таблиц, столбцах разделов, расположении файлов и т. Д.
По умолчанию Spark поставляется с поддержкой Embedded Derby Db для управления метаданными. Более подробную информацию о Дерби можно найти здесь https://db.apache.org/derby/ .
искровой склад:
Каталог хранилища - это место, куда записываются данные таблицы. По умолчанию Spark создает каталог как иск-склад.
Вы можете получить больше информации здесь https://jaceklaskowski.gitbooks.io/mastering-spark-sql/spark-sql-hive-metastore.html .
Теперь, если мы создадим еще один новый проект с тем же кодом, который мы использовали для проекта LocalSparkSql , мы можем заметить, что мы не можем получить доступ к базе данных « sparkdemo», созданной нашим предыдущим проектом. Причина такого поведения заключается в том, что для каждого проекта metastore_db и spark-warehouse создаются заново, и они специфичны для этого проекта, так как они создаются в корневом каталоге проекта.
Тем не менее, мы можем подключиться к другим проектам metastore и warehouse, но лучшим подходом было бы создать общий отдельный каталог metastore_db и spark-warehouse и совместно использовать его для нескольких проектов, добавив несколько дополнительных конфигураций в SparkSession, и это то, что мы собираемся сделать обсудить в нашем следующем разделе.
Доступ к нескольким проектам
Чтобы смоделировать это поведение, нам нужно создать новый проект и попытаться получить доступ к общим metastore_db и хранилищу.
Для этой демонстрации мы будем использовать каталоги, как показано ниже:
Для metastore_db C: \ tmp \ hive \ metastore_db
Для склада C: \ tmp \ hive \ spark-warehouse
Настройка Spark-Project
Чтобы Spark ссылался на наш новый общий каталог, нам нужно добавить следующую конфигурацию при создании объекта сеанса Spark:
spark.sql.warehouse.dir = C: / tmp / hive / spark-warehouse
javax.jdo.option.ConnectionURL = jdbc: derby:; databaseName = C: / tmp / hive / metastore_db; create = true
Код должен выглядеть так:
Scala
1
val spark: SparkSession = SparkSession.builder()
2
.enableHiveSupport()
3
.master("local")
4
.appName("Demo")
5
.config("spark.sql.warehouse.dir","C:/tmp/hive/spark-warehouse")
6
.config("javax.jdo.option.ConnectionURL","jdbc:derby:;databaseName=C:/tmp/hive/metastore_db;create=true")
7
.getOrCreate()
Вы должны использовать вышеуказанную конфигурацию в каждом из ваших проектов, чтобы предоставить проектам доступ к базам данных и таблицам, созданным другими приложениями.
Настройка Spark-Shell
Теперь, чтобы проверить правильность вышеуказанных конфигураций, мы можем запустить spark-shell и попытаться получить доступ к базе данных « sparkdemo» и «table1».
Перед запуском spark-shell нам нужно настроить его так, чтобы он указывал на наше общее хранилище метастазов и хранилище, выполнив следующие шаги:
- Перейдите в каталог конфигурации Spark, C: \ spark-2.4.4-bin-hadoop2.7 \ conf .
- Создайте или переименуйте уже существующий файл « spark-defaults.conf.template» в «spark-defaults.conf»
- Добавьте следующие две строки в конец файла:
spark.driver.extraJavaOptions -Dderby.system.home=C:/tmp/hive
spark.sql.warehouse.dir C:/tmp/hive/spark-warehouse
- Теперь откройте новый cmd и запустите его
spark-shell
из каталога C: \ spark-2.4.4-bin-hadoop2.7 \ bin .
Теперь давайте попробуем составить список всех баз данных, запустив SHOW DATABASES
и выбрав все данные из таблицы1 в оболочке.
Приведенный выше результат подтверждает правильность наших общих настроек метастазов, поскольку мы можем получить доступ к таблицам, созданным с помощью приведенного выше кода.
Теперь, если вы оставите спарк-оболочку открытой и попытаетесь запустить свой проект Scala в одно и то же время, вы получите следующую ошибку.
Unable to open a test connection to the given database. JDBC url = jdbc:derby:;databaseName=C:/tmp/hive/metastore_db;create=true, username = APP. Terminating connection pool (set lazyInit to true if you expect to start your database after your app). Original Exception: ------
java.sql.SQLException: Failed to start database 'C:/tmp/hive/metastore_db' with class loader org.apache.spark.sql.hive.client.IsolatedClientLoader$$anon$1@4262fdeb, see the next exception for details.
Это потому, что мы используем встроенный в Spark derbyDb , и одно приложение (то есть spark-shell) уже напрямую подключено к общей базе данных metastore_db и получило блокировку, поэтому другой экземпляр не может быть инициирован. Этой ситуации можно было бы избежать, если бы мы могли подключиться к дерби, используя сетевой сервис вместо прямого подключения к базе данных. Но у нас не запущен экземпляр сервера Derby, поэтому мы не можем этого сделать в этом случае.
Однако мы можем создать метасторское хранилище Hive в отдельной реляционной базе данных и разрешить Spark подключаться к этой базе данных, чтобы включить настройку нескольких подключений. Мы поговорим об этом в следующем разделе.
Полный кластерный доступ
Чтобы настроить локальное хранилище метастазов в этом режиме, нам необходимо загрузить и установить несколько дополнительных компонентов, перечисленных ниже, а также другие компоненты, указанные в разделе « Загрузки» этой статьи.
Примечание. Не стоит сразу переходить к этому разделу статьи, так как вы можете пропустить несколько важных и обязательных шагов, поэтому следите за статьей с самого начала, чтобы правильно выполнить настройку.
Загрузки
- Загрузите и установите MySql Community Edition: https://dev.mysql.com/downloads/windows/installer/8.0.html .
- Если у вас нет редактора SQL GUI, пожалуйста, установите HeidiSql: https://www.heidisql.com/download.php
- Загрузите jar-файл коннектора MySql, в зависимости от версии сервера MySql, по адресу https://dev.mysql.com/downloads/connector/j/ . Убедитесь, что выбрали Platform Independent в качестве операционной системы для продолжения.
- Загрузите или откройте DDL metastore Hive: https://raw.githubusercontent.com/apache/hive/master/metastore/scripts/upgrade/mysql/hive-schema-2.3.0.mysql.sql
- Загрузите DDL транзакционной схемы Hive по адресу : https://raw.githubusercontent.com/apache/hive/master/metastore/scripts/upgrade/mysql/hive-txn-schema-2.3.0.mysql.sql
Монтаж
MySql:
- Запустите загруженный mysql-installer-community-8.0. *. *. Msi .
- Выберите тип установки как пользовательский .
- Пожалуйста, выберите по крайней мере следующие функции для установки:
- На следующей странице нажмите кнопку Выполнить, чтобы позволить установщику загрузить и установить недостающие компоненты из вашей системы.
- Нажмите на следующий и выполнить , чтобы установка начнется.
- После установки появится страница конфигурации; давайте выберем автономный сервер MySQL .
- Выберите « Компьютер разработки» в качестве типа конфигурации и оставьте другие параметры по умолчанию.
- Мы устанавливаем пароль root как «root» для простоты этой демонстрации.
- Оставьте остальные настройки по умолчанию и завершите установку.
HeidiSQL
- Теперь запустите загруженный HeidiSQL _ * _ Setup.exe и завершите установку с настройками по умолчанию.
- Откройте HeidiSQL и выберите тип сети как MariaDB или MySQL .
- Введите имя пользователя и пароль в качестве пользователя root (или настроенные имя пользователя и пароль) и нажмите «Открыть».
- Откройте новое окно запроса и выполните следующие инструкции:
CREATE DATABASE metastore_db;
USE metastore_db;
- Теперь скопируйте содержимое hd metastore ddl из файла hive -schema-2.3.0.mysql.sql . Ссылка: https://raw.githubusercontent.com/apache/hive/master/metastore/scripts/upgrade/mysql/hive-schema-2.3.0.mysql.sql .
- Удалите или закомментируйте строку с номером 835 как «- SOURCE hive-txn-schema-2.3.0.mysql.sql;»
- Выполните весь DDL на metastore_db .
- Теперь скопируйте и выполните DDL транзакционной схемы Hive из файла hive-schema-2.3.0.mysql.sql . Ссылка: https://raw.githubusercontent.com/apache/hive/master/metastore/scripts/upgrade/mysql/hive-txn-schema-2.3.0.mysql.sql .
После того, как оба файла SQL будут успешно выполнены на вашем metastore_db , вы можете настроить свои проекты для доступа к этому метасторному хранилищу. Итак, давайте настроим проекты spark-shell и Scala / Java, выполнив следующие шаги:
Настройка Spark-Shell
Перед запуском spark-shell нам нужно настроить его на использование нашего общего метасчета и хранилища MySQL. Пожалуйста, выполните следующие действия для настройки оболочки:
- Перейдите в каталог конфигурации Spark C: \ spark-2.4.4-bin-hadoop2.7 \ conf .
- Убедитесь, что вы удалили файл «spark-defaults.conf» или закомментировали ранее добавленную строку для spark.driver.extraJavaOptions и spark.sql.warehouse.dir .
- Теперь создайте новый файл с именем hive-site.xml . Затем добавьте следующее содержимое в каталог conf.
- Скопируйте mysql-connector-java-8.0.18.jar в каталог C: \ spark-2.4.4-bin-hadoop2.7 \ jars \ . Вы можете получить его из C: \ Program Files (x86) \ MySQL \ Connector J 8.0 \ или использовать уже загруженный в разделе загрузок. Ссылка: https://dev.mysql.com/downloads/connector/j/ .
- Удалите старый каталог хранилища (например, C: \ tmp \ hive \ spark-warehouse ). В противном случае мы можем получить ошибку «Каталог уже существует», так как мы повторно используем тот же каталог.
- Теперь откройте новую командную строку и запустите spark-shell из каталога C: \ spark-2.4.4-bin-hadoop2.7 \ bin и выполните следующий код:
Улей-site.xml
XML
xxxxxxxxxx
1
<configuration>
2
<property>
3
<name>javax.jdo.option.ConnectionURL</name>
4
<value>jdbc:mysql://localhost:3306/metastore_db?ceateDatabaseIfNotExist=true</value>
5
<description>JDBC connect string for a JDBC metastore</description>
6
</property>
7
<property>
9
<name>javax.jdo.option.ConnectionDriverName</name>
10
<value>com.mysql.cj.jdbc.Driver</value>
11
<description>Driver class name for a JDBC metastore</description>
12
</property>
13
<property>
15
<name>javax.jdo.option.ConnectionUserName</name>
16
<value>root</value>
17
</property>
18
<property>
20
<name>javax.jdo.option.ConnectionPassword</name>
21
<value>root</value>
22
</property>
23
<property>
25
<name>hive.metastore.warehouse.dir</name>
26
<value>C:/tmp/hive/spark-warehouse</value>
27
<description>location of default database for the warehouse</description>
28
</property>
29
</configuration>
Оболочка
xxxxxxxxxx
1
spark.sql("CREATE DATABASE IF NOT EXISTS sparkdemo")
2
spark.sql(
4
s"""
5
CREATE TABLE IF NOT EXISTS sparkdemo.table2
6
(
7
id INT,
8
name STRING
9
)
10
PARTITIONED BY(
11
date STRING
12
)
13
STORED AS PARQUET
14
""")
15
import org.apache.spark.sql.{DataFrame, SaveMode}
17
import spark.implicits._
18
spark.conf.set("hive.exec.dynamic.partition.mode","nonstrict")
20
val df2: DataFrame = Seq(
22
(1, "One","2020-01-01"),
23
(2, "Two","2020-01-03"),
24
(3, "Three","2020-01-11")
25
).toDF("id", "name","date")
26
df2.write.mode("overwrite").insertInto("sparkdemo.table2")
28
spark.sql("SHOW DATABASES").show
30
spark.sql(“SELECT * FROM sparkdemo.table2”).show
31
spark.sql("SHOW PARTITIONS sparkdemo.table2").show
Вывод: вывод из команд SQL
Теперь нам нужно проверить, что мы можем открыть несколько подключений к метасольве Hive. Затем мы можем проверить, что мы можем запускать несколько проектов Spark одновременно в нашей локальной системе Windows. Попробуем получить доступ к метастажу из отдельного проекта, не закрывая текущий спарк-оболочку в нашем следующем разделе.
Конфигурирование Spark Project
Теперь давайте создадим новый объект Scala LocalMySQLMetastoreTest
в нашем проекте «LocalSparkSql».
В этом объекте мы попытаемся вставить еще несколько записей в sparkdemo.table2 , который мы только что создали с помощью spark-shell.
Теперь нам нужно предоставить несколько дополнительных конфигураций, связанных с адресом и учетными данными сервера MySQL, чтобы он мог использоваться экземпляром SparkSession для подключения его к нашему новому метасольве MySQL.
Пример конфигурации вместе с полным кодом приведен ниже:
Образец
Scala
xxxxxxxxxx
1
val spark: SparkSession = SparkSession.builder()
2
.enableHiveSupport()
3
.master("local")
4
…
5
.config("javax.jdo.option.ConnectionURL", "jdbc:mysql://<MySQL SERVER>:<PORT>/metastore_db")
6
.config("javax.jdo.option.ConnectionDriverName", "<DATABASE DRIVER CLASS NAME>")
7
.config("javax.jdo.option.ConnectionUserName", "<USER NAME>")
8
.config("javax.jdo.option.ConnectionPassword", "<PASSWORD>")
9
…
10
.getOrCreate()
Поскольку мы будем использовать MySQL JDBC для соединения, нам нужно добавить драйвер MySQL JDBC в качестве зависимости в pom.xml , как показано ниже:
XML
xxxxxxxxxx
1
<dependencies>
2
…
3
<dependency>
4
<groupId>mysql</groupId>
5
<artifactId>mysql-connector-java</artifactId>
6
<version>8.0.18</version>
7
</dependency>
8
..
9
</dependencies>
Полный код
LocalMySQLMetastoreTest.scala
Scala
xxxxxxxxxx
1
import org.apache.spark.sql.{DataFrame, SaveMode, SparkSession}
2
object LocalMySQLMetastoreTest {
4
def main(args: Array[String]): Unit = {
6
val spark: SparkSession = SparkSession.builder()
8
.enableHiveSupport()
9
.master("local")
10
.appName("Demo")
11
.config("spark.sql.warehouse.dir", "C:\\tmp\\hive\\spark-warehouse")
12
.config("javax.jdo.option.ConnectionURL", "jdbc:mysql://localhost:3306/metastore_db")
13
.config("javax.jdo.option.ConnectionDriverName", "com.mysql.cj.jdbc.Driver")
14
.config("javax.jdo.option.ConnectionUserName", "root")
15
.config("javax.jdo.option.ConnectionPassword", "root")
16
.config("hive.exec.dynamic.partition.mode", "nonstrict")
17
.getOrCreate()
18
import spark.implicits._
20
spark.sql("CREATE DATABASE IF NOT EXISTS sparkdemo")
21
spark.sql(
22
s"""
23
CREATE TABLE IF NOT EXISTS sparkdemo.table2
24
(
25
id INT,
26
name STRING
27
)
28
PARTITIONED BY(
29
date STRING
30
)
31
STORED AS PARQUET
32
""")
33
val df2: DataFrame = Seq(
35
(4, "Four", "2020-01-13"),
36
(5, "Five", "2020-01-13"),
37
(6, "Six", "2020-01-15")
38
).toDF("id", "name", "date")
39
df2.write.mode(SaveMode.Overwrite).insertInto("sparkdemo.table2")
40
spark.sql("SELECT * FROM sparkdemo.table2").show
41
spark.sql("SHOW PARTITIONS sparkdemo.table2").show
42
}
43
}
pom.xml
XML
xxxxxxxxxx
1
2
<project xmlns="http://maven.apache.org/POM/4.0.0"
3
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5
<modelVersion>4.0.0</modelVersion>
6
<groupId>org.connected.spark</groupId>
8
<artifactId>LocalSparkSql</artifactId>
9
<version>1.0.0-SNAPSHOT</version>
10
<dependencies>
12
<dependency>
13
<groupId>org.apache.spark</groupId>
14
<artifactId>spark-core_2.12</artifactId>
15
<version>2.4.4</version>
16
</dependency>
17
<dependency>
18
<groupId>org.apache.spark</groupId>
19
<artifactId>spark-sql_2.12</artifactId>
20
<version>2.4.4</version>
21
</dependency>
22
<dependency>
23
<groupId>org.apache.spark</groupId>
24
<artifactId>spark-hive_2.12</artifactId>
25
<version>2.4.4</version>
26
</dependency>
27
<dependency>
28
<groupId>mysql</groupId>
29
<artifactId>mysql-connector-java</artifactId>
30
<version>8.0.18</version>
31
</dependency>
32
</dependencies>
33
</project>
Теперь давайте запустим наш объект LocalMySQLMetastoreTest . Вывод должен выглядеть как на картинке ниже:
Примечание. В некоторых случаях вы не сможете увидеть новый добавленный раздел или данные в других проектах spark-shell /, так как это ожидаемое поведение управления метастазами Hive / Spark. Вы можете выполнить ALTER TABLE ADD PARTITIONS или spark.catalog.refreshTable ("dbname.tablename") для отражения новых данных.
После запуска проекта еще раз с теми же данными, я получил следующее исключение при попытке запустить spark.sql("SELECT * FROM sparkdemo.table2").show
мою старую оболочку spark:
java.io.FileNotFoundException: File
file:/C:/tmp/hive/spark-warehouse/sparkdemo.db/table2/date=2020-01-13/part-000
00-666cc8ed-b44b-4025-9606-e5d9e660c8db.c000 does not exist
Причина этого проста; мы добавили / изменили несколько дополнительных строк / разделов за пределами оболочки, поэтому в каталоге метастазов в нашем spark-shell об этих изменениях ничего не известно.
Выполнение приведенного ниже кода выполнит принудительное обновление метаданных и в конечном итоге решит эту проблему
Scala
xxxxxxxxxx
1
spark.catalog.refreshTable("sparkdemo.table2")
Теперь выполнение spark.sql("SELECT * FROM sparkdemo.table2").show
в оболочке дает следующие обновленные результаты:
Конечные заметки
Я надеюсь, что эта расширенная демонстрация по настройке локальной среды разработки Spark дала вам полное, глубокое понимание конфигураций, связанных с локальной настройкой. Я пытался охватить как можно больше сценариев сбоев, но если у вас есть какие-либо другие проблемы, вопросы или предложения, вы можете поделиться ими в комментариях ниже.
Спасибо за прочтение!!