Настройка Spark для CI, как имитировать таблицы Hive

#java #apache-spark #hive

#java #apache-spark #hive

Вопрос:

В приложении Java с Spark 1.6.2 я хочу протестировать на CI env (travis или gitlabCI) некоторые SQL-запросы Spark, которые используют таблицы (из Apache Hive в рабочей среде).

Как я могу зарегистрировать некоторые таблицы, которые приложение Spark могло бы использовать без внешнего хранилища метафор Hive?

Примечание: Я не могу сделать это внутри программы Java.

Ответ №1:

Вы можете запускать модульные тесты, используя встроенный Hive, который поставляется из коробки с spark-hive:

     <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-hive_${scala.compat.version}</artifactId>
        <version>${spark.version}</version>
    </dependency>
  

Используя выбранную вами платформу модульного тестирования, вы создаете локальный SparkContext и HiveContext:

 // TODO: set this up before running all your tests
val conf = new SparkConf().
  setMaster("local[*]").
  setAppName("test").
  set("spark.ui.enabled", "false").
  set("spark.app.id", "SparkHiveTests").
  set("spark.driver.host", "localhost")
val sc = new SparkContext(conf)
val hiveContext = new HiveContext(sc)
// default directory is /user/hive/warehouse which doesn't exist on my local machine so use a different dir
hiveContext.setConf("hive.metastore.warehouse.dir", "/tmp/hive/warehouse")
  

Затем вы можете создавать / удалять таблицы и запускать запросы, используя встроенный Hive!

 // data will persist in this directory so drop the table to get a clean run if it exists
hiveContext.sql("DROP TABLE IF EXISTS src")
hiveContext.sql("CREATE TABLE src (key INT, value STRING)")
hiveContext.sql("LOAD DATA LOCAL INPATH 'src/test/resources/kv1.txt' INTO TABLE src")
val result = hiveContext.sql("SELECT count(*) FROM src").collect().head
assert(result(0) === 3l)
  

Извините за Scala здесь, но это должно быть очень похоже на Java. Если это не имеет смысла, дайте мне знать, и я могу попытаться переписать это на Java.

Комментарии:

1. Правильно, это то, что я делаю сейчас, внутри приложения Java, но я хочу перенести это из приложения. Может быть, что-то вроде общего контекста Spark.

2. @ThomasDecaux Что вы имеете в виду, когда говорите, что хотите перенести это из приложения? Используете ли вы junit? Этот код вы бы добавили в некоторые тесты junit, чтобы при настройке вашего конвейера CI выполнялись все тесты.

3. Я использую junit только для модульных тестов, для функций. тесты, я использую внешний скрипт Python (с поведением), который запускает несколько задач (следовательно, несколько контекстов Spark).