#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).