Статьи

Подробное руководство: настройка среды разработки Apache Spark в Windows 10

Вступление

В моей последней статье я рассмотрел, как настроить и использовать 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

  1. Доступ к одному проекту (одиночное подключение к одному проекту)
  2. Время установки: 15 минут
    Функциональность: Limited

  • У каждого проекта будет свой метастор и склад.
  • Базы данных и таблицы, созданные одним проектом, не будут доступны другим проектам.
  • Только один проект Spark SQL может запускаться или выполняться одновременно.
  • Доступ к нескольким проектам (одно подключение к нескольким проектам)

    Время установки: 20 минут
    Функциональность: Extended

    • У каждого проекта будет общий метастор и склад.
    • Таблицы, созданные одним проектом, будут доступны другим проектам или спарк-оболочке.
    • Это создаст ощущение псевдокластера.
    • Только один проект Spark SQL может запускаться или выполняться одновременно.
  • Полный кластерный доступ (Multi Project Multi Connection)

    Время установки: 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.

    Итак, просто следуйте этой статье, и в конце этого урока вы сможете избавиться от всех этих ошибок.

    Скачивание необходимых файлов

    1. Загрузите и установите JDK в соответствии с архитектурой вашей ОС и ЦП с https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html .
    2. Установите версию Scala в зависимости от версии Spark, которую вы используете, по  адресу https://www.scala-lang.org/download/all.html .
    3. Загрузите и установите 7-zip с https://www.7-zip.org/download.html .
    4. Загрузите и извлеките Apache Spark, используя 7-zip с http://spark.apache.org/downloads.html .
    5. Загрузите zip-файл или клон двоичных файлов Hadoop для Windows со страницы https://github.com/cdarlint/winutils .
    6. Если у вас не установлена ​​IDE, пожалуйста, установите ее. Intellij IDEA является предпочтительным, и вы можете получить версию для сообщества по адресу https://www.jetbrains.com/idea/download/#section=windows .
    7. Загрузите распространяемый пакет Microsoft Visual C ++ 2010, если в вашей системе эти предварительно не установлены:
      1. https://www.microsoft.com/en-us/download/details.aspx?id=5555 .
      2. https://www.microsoft.com/en-us/download/details.aspx?id=14632 .

    Для 32-битных (x86) ОС вам нужно установить только., А для 64-битных (x64) -. и б.

    В этом руководстве предполагается, что двоичные файлы Spark и Hadoop разархивированы на  диске C: \ . Однако вы можете разархивировать их в любом месте вашей системы.

    Настройка и установка

    JDK

    Прежде чем мы продолжим, давайте удостоверимся, что ваши настройки Java выполнены правильно, а переменные среды обновлены в установочном каталоге Java.

    Чтобы подтвердить, что Java установлена ​​на вашем компьютере, просто откройте cmd и введите  java –version.  Вы должны увидеть версию Java, установленную в вашей системе.

    Если вы получили сообщение об ошибке, например «java» не распознается как внутренняя или внешняя команда, работающая программа или пакетный файл », выполните следующие действия. В противном случае пропустите это.

    1. Выполните загруженную настройку JRE и JDK и завершите установку с настройками по умолчанию.
    2. Теперь откройте диалог системных переменных окружения
    • В Windows 7 щелкните правой кнопкой мыши на « Мой компьютер» и выберите « Свойства»> «Дополнительно» .
    • Для Windows 8 перейдите в Панель управления> Система> Расширенные настройки системы .
    • Для Windows 10 перейдите в Панель управления> Система и безопасность> Система> Расширенные настройки системы .
  • Нажмите кнопку Переменные среды .
  • Нажмите кнопку « Создать» в разделе « Системные переменные ». Затем введите  JAVA_HOMEв поле Имя переменной и укажите путь установки JDK в  поле Значение переменной .
  • Если путь содержит пробелы, используйте сокращенное имя пути — например, C: \ Progra ~ 1 \ Java \ jdk1.8.0_74
  • Для пользователей Windows на 64-битных системах
    • Progra ~ 1 = «Программные файлы»
    • Progra ~ 2 = ‘Программные файлы (x86)’

    Это должно выглядеть так: 
    Добавление новой системной переменной

  • Теперь нажмите ОК .
  • Затем найдите переменную Path в разделе System Variable в диалоговом окне Environment Variables, которое вы только что открыли.
  • Отредактируйте путь и нажмите кнопку « Изменить текст» или « Новый» и добавьте «;% JAVA_HOME% \ bin» в конце.
  • Добавление «% JAVA_HOME% \ bin» в PATH

    Переменные среды

  • Чтобы подтвердить установку Java, откройте новый cmd и введите  java –version, и вы сможете увидеть версию Java, которую вы только что установили.
  • Проверка версии установленной Java

    Если ваша командная строка выглядит примерно так, как на картинке выше, вы готовы. В противном случае вам нужно проверить, совпадает ли ваша установочная версия с архитектурой вашей ОС (x86, x64). Путь переменных среды также может быть неправильным.

    Scala

    1. Возможно, вам придется установить Scala, в зависимости от вашей версии Spark.
    2. Для этой статьи мы будем использовать Spark 2.4.4 и Scala 2.12.10.
    3. Просто запустите скачанный scala-2.12.10.msi и следуйте инструкциям по установке.
    4. Чтобы подтвердить установку Scala, откройте cmd и введите  scala –version. Ваша командная строка должна выглядеть следующим образом:
    5. Проверка версии Scala

    Настройка IntelliJ IDEA

    1. Вы можете настроить Eclipse с помощью плагина Scala или просто установить IntelliJ IDEA.
    2. Вы можете установить плагин Scala на экране первоначальной настройки или в меню « Настройки»> «Плагин»> «Поиск и установка Scala».
    3. Если у вас возникают проблемы с прокси-сервером VPN во время установки плагина, вы можете выбрать автономную установку плагина.
    4. Убедитесь, что окно file> settings> plugins показывает, что плагин Scala установлен, как показано на следующем рисунке:
    5. Установка плагина Scala

    Hadoop Home Setup

    1. Откройте загруженный репозиторий GitHub https://github.com/cdarlint/winutils, используя 7-zip (т.е. winutils-master.zip).
    2. Внутри вы найдете файл hadoop-2.7.7 . Теперь распакуйте его на диск C: \ .
    3. Ваш каталог C: \ hadoop-2.7.7 \ bin должен выглядеть так, как показано ниже:
    4. C: \ hadoop-2.7.7 \ bin

    5. Когда извлечение закончено, нам нужно добавить новую  HADOOP_HOMEпеременную системной среды.
    6. Чтобы добавить a  HADOOP_HOME, откройте диалоговое окно переменных среды и нажмите кнопку « Создать» в разделе « Системные переменные » и заполните  текстовые поля « Имя»  и « Значение» , как показано на рисунке ниже:
    7. Добавление переменной HADOOP_HOME

    Настройка Spark Home

    1. Откройте загруженный файл Spark gz, используя 7-zip (т.е. spark-2.4.4-bin-hadoop2.7.gz).
    2. Внутри этого вы найдете tar-файл spark-2.4.4-bin-hadoop2.7 . Дважды щелкните по нему и извлеките каталог spark-2.4.4-bin-hadoop2.7 на диск C: \ .
    3. Копирование файла Hadoop на диск C: \

    4. Ваш каталог C: \ spark-2.4.4-bin-hadoop2.7 должен выглядеть следующим образом:
    5. Каталог C: \ spark-2.4.4-bin-hadoop2.7

    6. Как только извлечение закончено, нам нужно добавить каталог Spark bin в переменную System Path «Path».
    7. Отредактируйте переменную пути и добавьте «C: \ spark-2.4.4-bin-hadoop2.7 \ bin», как показано на рисунке ниже:
    8. Редактирование переменных среды

    ПРИМЕЧАНИЕ. Если у вас нет прав администратора для добавления переменных среды, не беспокойтесь, так как вы можете установить его в IDE для каждого проекта отдельно. Процесс объясняется в следующем разделе.

    Доступ к одному проекту

    Теперь давайте создадим новый проект Scala-Maven с именем «LocalSparkSql». Кроме того, вы можете клонировать его из GitHub: https://github.com/gopal-tiwari/LocalSparkSql .

    Структура проекта выглядит следующим образом:

    Начальная структура проекта

    LocalSparkHiveTest.scala


    Scala





    xxxxxxxxxx
    1
    34



    1
    package org.connected.spark

    2
    3
    import org.apache.spark.sql.{DataFrame, SaveMode, SparkSession}

    4
    5
    object LocalSparkHiveTest {

    6
    7
      def main(args: Array[String]): Unit = {

    8
    9
        val spark: SparkSession = SparkSession.builder()

    10
          .enableHiveSupport()

    11
          .master("local")

    12
          .appName("Demo")

    13
          .getOrCreate()

    14
    15
        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
    27
        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
    32
      }

    33
    }


    pom.xml


    XML





    xxxxxxxxxx
    1
    30


     

    1
     version="1.0" encoding="UTF-8"?>

    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.0modelVersion>

    6
    7
        <groupId>org.connected.sparkgroupId>

    8
        <artifactId>LocalSparkSqlartifactId>

    9
        <version>1.0.0-SNAPSHOTversion>

    10
    11
        <dependencies>

    12
            <dependency>

    13
                <groupId>org.apache.sparkgroupId>

    14
                <artifactId>spark-core_2.12artifactId>

    15
                <version>2.4.4version>

    16
            dependency>

    17
            <dependency>

    18
                <groupId>org.apache.sparkgroupId>

    19
                <artifactId>spark-sql_2.12artifactId>

    20
                <version>2.4.4version>

    21
            dependency>

    22
            <dependency>

    23
                <groupId>org.apache.sparkgroupId>

    24
                <artifactId>spark-hive_2.12artifactId>

    25
                <version>2.4.4version>

    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не правильно настроены.

    Если вам не удалось установить переменные системной среды из-за проблемы с правами доступа администратора, вы можете установить ее здесь на уровне проекта, выполнив несколько шагов, описанных ниже, в противном случае вы можете перейти к следующей инструкции.

    1. Перейдите в верхний правый угол экрана Intellij и выберите Edit Configurations.
    2. Редактировать конфигурации

    3. В левой боковой панели разверните Приложение, добавьте и выберите LocalSparkHiveTest .
    4. Запустить / Отладить конфигурации

    5. Теперь добавьте «HADOOP_HOME = C: \ hadoop-2.7.7»  в поле «Переменная среды».
    6. Добавление переменных среды

    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





    x


     

    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 нам нужно настроить его так, чтобы он указывал на наше общее хранилище метастазов и хранилище, выполнив следующие шаги:

    1. Перейдите в каталог конфигурации Spark,  C: \ spark-2.4.4-bin-hadoop2.7 \ conf .
    2. Создайте или переименуйте уже существующий файл « spark-defaults.conf.template»  в «spark-defaults.conf»
    3. Добавьте следующие две строки в конец файла: 
      1. spark.driver.extraJavaOptions -Dderby.system.home=C:/tmp/hive 
      2. spark.sql.warehouse.dir C:/tmp/hive/spark-warehouse 
    4. Теперь откройте новый cmd и запустите его  spark-shellиз  каталога C: \ spark-2.4.4-bin-hadoop2.7 \ bin .

    Теперь давайте попробуем составить список всех баз данных, запустив  SHOW DATABASESи выбрав все данные из таблицы1 в оболочке.

    Выбор * из таблицы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 подключаться к этой базе данных, чтобы включить настройку нескольких подключений. Мы поговорим об этом в следующем разделе.

    Полный кластерный доступ

    Чтобы настроить локальное хранилище метастазов в этом режиме, нам необходимо загрузить и установить несколько дополнительных компонентов, перечисленных ниже, а также другие компоненты, указанные в разделе « Загрузки» этой статьи.

    Примечание. Не стоит сразу переходить к этому разделу статьи, так как вы можете пропустить несколько важных и обязательных шагов, поэтому следите за статьей с самого начала, чтобы правильно выполнить настройку.

    Загрузки

    1. Загрузите и установите MySql Community Edition:  https://dev.mysql.com/downloads/windows/installer/8.0.html .
    2. Если у вас нет редактора SQL GUI, пожалуйста, установите HeidiSql:  https://www.heidisql.com/download.php
    3. Загрузите jar-файл коннектора MySql, в зависимости от версии сервера MySql, по адресу https://dev.mysql.com/downloads/connector/j/ . Убедитесь, что выбрали Platform Independent в качестве операционной системы для продолжения.
    4. Загрузите или откройте DDL metastore Hive:  https://raw.githubusercontent.com/apache/hive/master/metastore/scripts/upgrade/mysql/hive-schema-2.3.0.mysql.sql  
    5. Загрузите DDL транзакционной схемы Hive по адресуhttps://raw.githubusercontent.com/apache/hive/master/metastore/scripts/upgrade/mysql/hive-txn-schema-2.3.0.mysql.sql

    Монтаж

    MySql:

    1. Запустите загруженный mysql-installer-community-8.0. *. *. Msi .
    2. Выберите тип установки как пользовательский .
    3. Пожалуйста, выберите по крайней мере следующие функции для установки:
    4. Установка MySQL Server

    5. На следующей странице нажмите кнопку Выполнить, чтобы позволить установщику загрузить и установить недостающие компоненты из вашей системы.
    6. Нажмите на следующий и выполнить , чтобы установка начнется.
    7. После установки появится страница конфигурации; давайте выберем автономный сервер MySQL .
    8. Выберите « Компьютер разработки» в качестве типа конфигурации и оставьте другие параметры по умолчанию.
    9. Мы устанавливаем пароль root как «root» для простоты этой демонстрации.
    10. Оставьте остальные настройки по умолчанию и завершите установку.

    HeidiSQL

    1. Теперь запустите загруженный HeidiSQL _ * _ Setup.exe и завершите установку с настройками по умолчанию.
    2. Откройте HeidiSQL и выберите тип сети как MariaDB или MySQL .
    3. Введите имя пользователя и пароль в качестве пользователя root (или настроенные имя пользователя и пароль) и нажмите «Открыть».
    4. Откройте новое окно запроса и выполните следующие инструкции:
      1. CREATE DATABASE metastore_db; 
      2. USE metastore_db; 
    5. Теперь скопируйте содержимое 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 .
      1. Удалите или закомментируйте строку с номером 835 как «- SOURCE hive-txn-schema-2.3.0.mysql.sql;»
      2. Выполните весь DDL на metastore_db .
    6. Теперь скопируйте и выполните 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. Пожалуйста, выполните следующие действия для настройки оболочки:

    1. Перейдите в каталог конфигурации Spark C: \ spark-2.4.4-bin-hadoop2.7 \ conf .
    2. Убедитесь, что вы удалили файл «spark-defaults.conf»  или закомментировали ранее добавленную строку для spark.driver.extraJavaOptions и spark.sql.warehouse.dir . 
    3. Теперь создайте новый файл с именем hive-site.xml . Затем добавьте следующее содержимое в каталог conf.
    4. Улей-site.xml 


      XML





      xxxxxxxxxx
      1
      29


       

      1
      <configuration>

      2
          <property>

      3
              <name>javax.jdo.option.ConnectionURLname>

      4
              <value>jdbc:mysql://localhost:3306/metastore_db?ceateDatabaseIfNotExist=truevalue>

      5
              <description>JDBC connect string for a JDBC metastoredescription>

      6
          property>

      7
      8
          <property>

      9
              <name>javax.jdo.option.ConnectionDriverNamename>

      10
              <value>com.mysql.cj.jdbc.Drivervalue>

      11
              <description>Driver class name for a JDBC metastoredescription>

      12
          property>

      13
      14
          <property>

      15
              <name>javax.jdo.option.ConnectionUserNamename>

      16
              <value>rootvalue>

      17
          property>

      18
      19
          <property>

      20
              <name>javax.jdo.option.ConnectionPasswordname>

      21
              <value>rootvalue>

      22
          property>

      23
      24
          <property>

      25
              <name>hive.metastore.warehouse.dirname>

      26
              <value>C:/tmp/hive/spark-warehousevalue>

      27
              <description>location of default database for the warehousedescription>

      28
          property>

      29
      configuration>


             

    5. Скопируйте 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/
    6. Удалите старый каталог хранилища (например, C: \ tmp \ hive \ spark-warehouse ). В противном случае мы можем получить ошибку «Каталог уже существует», так как мы повторно используем тот же каталог.
    7. Теперь откройте новую командную строку и запустите spark-shell из  каталога C: \ spark-2.4.4-bin-hadoop2.7 \ bin и выполните следующий код:

    8. Оболочка





      xxxxxxxxxx
      1
      32



      1
      spark.sql("CREATE DATABASE IF NOT EXISTS sparkdemo")

      2
      3
      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
      16
      import org.apache.spark.sql.{DataFrame, SaveMode}

      17
      import spark.implicits._

      18
      19
      spark.conf.set("hive.exec.dynamic.partition.mode","nonstrict")

      20
      21
      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
      27
      df2.write.mode("overwrite").insertInto("sparkdemo.table2")

      28
      29
      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
    10


     

    1
    val spark: SparkSession = SparkSession.builder() 

    2
    .enableHiveSupport() 

    3
    .master("local") 

    4
       

    5
    .config("javax.jdo.option.ConnectionURL", "jdbc:mysql://:/metastore_db")

    6
    .config("javax.jdo.option.ConnectionDriverName", "")

    7
    .config("javax.jdo.option.ConnectionUserName", "")

    8
    .config("javax.jdo.option.ConnectionPassword", "")

    9
       

    10
    .getOrCreate()


    Поскольку мы будем использовать MySQL JDBC для соединения, нам нужно добавить драйвер MySQL JDBC в качестве зависимости в pom.xml , как показано ниже:


    XML





    xxxxxxxxxx
    1


     

    1
    <dependencies>

    2

    3
            <dependency>

    4
                 <groupId>mysqlgroupId>

    5
                 <artifactId>mysql-connector-javaartifactId>

    6
                 <version>8.0.18version>

    7
            dependency>

    8
    ..

    9
    dependencies>  


    Полный код

    LocalMySQLMetastoreTest.scala


    Scala





    xxxxxxxxxx
    1
    43


     

    1
    import org.apache.spark.sql.{DataFrame, SaveMode, SparkSession}

    2
    3
    object LocalMySQLMetastoreTest {

    4
    5
      def main(args: Array[String]): Unit = {

    6
    7
        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
    19
        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
    34
        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
    33


     

    1
     version="1.0" encoding="UTF-8"?>

    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.0modelVersion>

    6
    7
        <groupId>org.connected.sparkgroupId>

    8
        <artifactId>LocalSparkSqlartifactId>

    9
        <version>1.0.0-SNAPSHOTversion>

    10
    11
        <dependencies>

    12
            <dependency>

    13
                <groupId>org.apache.sparkgroupId>

    14
                <artifactId>spark-core_2.12artifactId>

    15
                <version>2.4.4version>

    16
            dependency>

    17
            <dependency>

    18
                <groupId>org.apache.sparkgroupId>

    19
                <artifactId>spark-sql_2.12artifactId>

    20
                <version>2.4.4version>

    21
            dependency>

    22
            <dependency>

    23
                <groupId>org.apache.sparkgroupId>

    24
                <artifactId>spark-hive_2.12artifactId>

    25
                <version>2.4.4version>

    26
            dependency>

    27
            <dependency>

    28
                <groupId>mysqlgroupId>

    29
                <artifactId>mysql-connector-javaartifactId>

    30
                <version>8.0.18version>

    31
            dependency>

    32
        dependencies>

    33
    project>


    Теперь давайте запустим наш  объект LocalMySQLMetastoreTest . Вывод должен выглядеть как на картинке ниже:

    Вывод из 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


     

    1
    spark.catalog.refreshTable("sparkdemo.table2")


    Теперь выполнение  spark.sql("SELECT * FROM sparkdemo.table2").showв оболочке дает следующие обновленные результаты:

    Обновленные результаты

    Конечные заметки

    Я надеюсь, что эта расширенная демонстрация по настройке локальной среды разработки Spark дала вам полное, глубокое понимание конфигураций, связанных с локальной настройкой. Я пытался охватить как можно больше сценариев сбоев, но если у вас есть какие-либо другие проблемы, вопросы или предложения, вы можете поделиться ими в комментариях ниже.

    Спасибо за прочтение!!

    Дальнейшее чтение