Testy integracyjne Hive jobs

Próbuję napisać nietrywialną pracę Hive 'a używając interfejsów Hive i JDBC i mam problem z ustawieniem porządnego testu JUnit' a. Przez nietrywialne, mam na myśli, że praca powoduje co najmniej jeden etap MapReduce, w przeciwieństwie do radzenia sobie tylko z metastore.

Test powinien odpalić Serwer Hive, załadować niektóre dane do tabeli, uruchomić jakieś nietrywialne zapytanie na tej tabeli i sprawdzić wyniki.

Założyłem kontekst wiosenny zgodnie z Wiosna odniesienie . Jednak zadanie nie powiodło się w fazie MapReduce, narzekając, że nie istnieje żaden binarny Hadoop:

Java.io. IOException: nie można uruchomić programu " / usr / bin / hadoop "(w katalog " / Users /Yoni / opower / workspace / intellij_project_root"): error=2, No such file or directory

Problem polega na tym, że serwer Hive działa w pamięci, ale polega na lokalnej instalacji Hive w celu uruchomienia. Aby mój projekt był samodzielny, potrzebuję usług Hive wbudowane, w tym klastry HDFS i MapReduce. Próbowałem uruchomić serwer Hive używając tej samej metody Springa i skierować go na MiniDFSCluster i MiniMRCluster, podobny do wzorca używanego w źródle Hive QTestUtil oraz w HBaseTestUtility. Jednak nie udało mi się tego uruchomić.

Po trzech dniach próbowania testowania integracji Hive, pomyślałem, że zapytam społeczność:

  1. Jak polecacie I testy integracyjne?
  2. Czy masz działający przykład JUnit do testów integracyjnych Zadań Hive przy użyciu instancji HDFS, MR i Hive w pamięci?

Dodatkowe zasoby przeglądałem:

Edytuj: Jestem w pełni świadomy, że praca na klastrze Hadoop-lokalnym lub zdalnym-umożliwia uruchamianie testów integracyjnych na pełnym stosie Ula przykład. Problem, jak stwierdzono, polega na tym, że nie jest to realne rozwiązanie do skutecznego testowania przepływów pracy Hive.

Author: Keshav Pradeep Ramanath, 2013-05-23

6 answers

Najlepiej byłoby móc testować zapytania hive za pomocą LocalJobRunner zamiast uciekać się do testowania mini-klastrów. Jednak ze względu na HIVE-3816 uruchomienie hive z mapred.job.tracker=local powoduje wywołanie pliku wykonywalnego hive CLI zainstalowanego w systemie (jak opisano w twoim pytaniu).

Dopóki HIVE-3816 nie zostanie rozwiązany, testowanie mini-klastrów jest jedyną opcją. Poniżej znajduje się minimalna konfiguracja mini-Klastra dla testów hive, które przetestowałem przeciwko CDH 4.4.

Configuration conf = new Configuration();

/* Build MiniDFSCluster */
MiniDFSCluster miniDFS = new MiniDFSCluster.Builder(conf).build();

/* Build MiniMR Cluster */
System.setProperty("hadoop.log.dir", "/path/to/hadoop/log/dir"); // MAPREDUCE-2785
int numTaskTrackers = 1;
int numTaskTrackerDirectories = 1;
String[] racks = null;
String[] hosts = null;
miniMR = new MiniMRCluster(numTaskTrackers, miniDFS.getFileSystem().getUri().toString(),
                           numTaskTrackerDirectories, racks, hosts, new JobConf(conf));

/* Set JobTracker URI */
System.setProperty("mapred.job.tracker", miniMR.createJobConf(new JobConf(conf)).get("mapred.job.tracker"));

Nie ma potrzeby uruchamiania oddzielnego proces hiveserver lub hiveserver2 do testowania. Możesz przetestować za pomocą wbudowanego procesu hiveserver2, ustawiając adres URL połączenia jdbc na jdbc:hive2:///

 12
Author: oby1,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-16 21:48:23

Przychodzę znaleźć jedno całkiem dobre narzędzie: HiveRunner . Jest to framework na szczycie jUnit do testowania skryptów hive. Pod maską uruchamia samodzielny HiveServer z HSQL w pamięci jako metastore.

 5
Author: Luís Bianchin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-29 19:31:53

Hive obsługuje tryb embedded tylko w tym sensie, że RDBMS przechowujący meta informacje dla tabel Hive może działać lokalnie lub na samodzielnym serwerze (zobacz https://cwiki.apache.org/confluence/display/Hive/HiveClient Po szczegóły). Co więcej, hive wraz z towarzyszącą mu bazą danych jest jedynie orchestratorem Dla ciągu Zadań MapReduce, co wymaga również działania frameworka Hadoop.

Polecam korzystanie z tej wirtualnej maszyny, która ma wstępnie skonfigurowaną Hadoop stack http://hortonworks.com/products/hortonworks-sandbox /. Hortonworks jest jednym z 2 wiodących dostawców dystrybucji Hadoop, więc jest dobrze wspierany.

 1
Author: Dmitriusan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-01 22:16:16

Nie wiem, co się zmieniło od czasu zaakceptowanej odpowiedzi w lutym. 2014, ale począwszy od Hive 1.2.0, następujące prace wokół problemu opisanego przez OP: {]}

System.setProperty(HiveConf.ConfVars.SUBMITLOCALTASKVIACHILD.varname, "false");

Należy pamiętać o ostrzeżeniu podanym w dokumentacji config:

Określa, czy lokalne zadania (zazwyczaj generowanie hashtable mapjoin phase) działa w osobnym JVM (true recommended) lub nie. Unika napowietrzne generowanie nowego JVM, ale może prowadzić do problemów z pamięcią.

To działa wokół zagadnienia, ponieważ w MapredLocalTask.java:

  @Override
  public int execute(DriverContext driverContext) {
    if (conf.getBoolVar(HiveConf.ConfVars.SUBMITLOCALTASKVIACHILD)) {
      // send task off to another jvm
      return executeInChildVM(driverContext);
    } else {
      // execute in process
      return executeInProcess(driverContext);
    }
  }

Domyślna wartość konfiguracyjna powoduje wywołanie metody executeInChildVM(), która dosłownie wywołuje hadoop jar. Druga ścieżka kodu do tej pory sprawdziła się w moich testach. Potencjalne problemy z pamięcią mogą być rozwiązane przez poprawienie konfiguracji Java heap (Xmx, Xms itp.).

 1
Author: Andrey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-18 18:49:50

Zaimplementowałem Hiverunnera.

Https://github.com/klarna/HiveRunner

Przetestowaliśmy go na Macu i mieliśmy pewne problemy z Windows, jednak z kilkoma zmianami wymienionymi poniżej util dobrze służył.

Dla windows oto kilka zmian, które zostały wykonane, aby HiveRunner działał w środowisku windows. Po tych zmianach testowanie jednostkowe jest możliwe dla wszystkich zapytań Hive.

1.Klonuj projekt na https://github.com/steveloughran/winutils w dowolnym miejscu na komputerze Dodaj nową zmienną środowiskową HADOOP_HOME, wskazując na katalog / bin tego folderu. nie dopuszcza się ukośników ani spacji. 2.Klonuj projekt na https://github.com/sakserv/hadoop-mini-clusters do dowolnego miejsca na twoim komputerze. Dodaj nową zmienną środowiskową HADOOP_WINDOWS_LIBS, wskazującą na katalog /lib tego folderu. Ponownie, nie wolno stosować ukośników ani spacji. 3.Zainstalowałem też Cygwina, zakładając, że severla win utils dla Linuksa może być dostępny poprzez

Ten pull na gitbubie pomógł w uruchomieniu go na Windowsie, https://github.com/klarna/HiveRunner/pull/63

 1
Author: Prachi Sharma,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-23 18:46:56

Kolejny Hive JUnit runner jest w https://github.com/edwardcapriolo/hive_test

 0
Author: gliptak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-05 20:00:51