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ść:
- Jak polecacie I testy integracyjne?
- 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.
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:///
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.
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.
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.).
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
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
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