web-dev-qa-db-ja.com

統合テストHiveジョブ

Hive ThriftおよびJDBCインターフェースを使用して、重要なHiveジョブを記述しようとしていますが、適切なJUnitテストの設定に問題があります。自明ではないということは、メタストアだけを扱うのではなく、ジョブが少なくとも1つのMapReduceステージをもたらすということです。

テストでは、Hiveサーバーを起動し、一部のデータをテーブルにロードし、そのテーブルに対して重要なクエリを実行し、結果を確認します。

Spring reference に従って、Springコンテキストを関連付けました。ただし、ジョブはMapReduceフェーズで失敗し、Hadoopバイナリが存在しないと警告されます。

Java.io.IOException:プログラム "/ usr/bin/hadoop"(ディレクトリ "/ Users/yoni/opower/workspace/intellij_project_root"内)を実行できません:エラー= 2、そのようなファイルまたはディレクトリはありません

問題は、Hiveサーバーがメモリ内で実行されているが、実行するにはHiveのローカルインストールに依存していることです。プロジェクトを自己完結型にするには、HDFSクラスターやMapReduceクラスターなどのHiveサービスを埋め込む必要があります。同じSpringメソッドを使用してHiveサーバーを起動し、それを MiniDFSCluster および MiniMRCluster でポイントしようとしました。これは、Hiveで使用されているパターンに似ています QTestUtil ソースおよび HBaseTestUtility 。しかし、私はそれを機能させることができませんでした。

Hiveの統合テストに3日間取り組んだ後、コミュニティに質問したいと思いました。

  1. 統合テストHiveジョブをどのようにすすめますか?
  2. インメモリHDFS、MR、およびHiveインスタンスを使用してHiveジョブを統合テストするための実用的なJUnitサンプルはありますか?

私が調べたその他のリソース:

編集:ローカルでもリモートでも、Hadoopクラスターに対して作業すると、フルスタックのHiveインスタンスに対して統合テストを実行できることを十分に承知しています。述べたように、問題はこれがHiveワークフローを効果的にテストするための実行可能なソリューションではないことです。

70
yoni

理想的には、ミニクラスターテストに頼るのではなく、LocalJobRunnerを使用してHiveクエリをテストできます。ただし、 Hive-3816 のため、mapred.job.tracker=localでHiveを実行すると、システムにインストールされているHive CLI実行可能ファイルが呼び出されます(質問に記載されています)。

Hive-3816が解決されるまで、ミニクラスターテストが唯一のオプションです。以下は、私がCDH 4.4に対してテストしたHiveテスト用の最小限のミニクラスターセットアップです。

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"));

テストのために個別のhiveserverまたはhiveserver2プロセスを実行する必要はありません。 jdbc接続URLをjdbc:Hive2:///に設定することにより、埋め込みhiveserver2プロセスでテストできます

12
oby1

私はかなり良いツールを1つ見つけました: HiveRunner 。 HiveスクリプトをテストするためのjUnit上のフレームワークです。内部的には、メモリ内にHSQLをメタストアとして持つスタンドアロンのHiveServerを起動します。

5
Luís Bianchin

2014年2月に承認された回答以降、何が変更されたのかは不明ですが、Hive 1.2.0以降では、OPによって記述された問題を次のように回避します。

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

構成ドキュメントに記載されている警告に注意してください。

ローカルタスク(通常はmapjoinハッシュテーブル生成フェーズ)が別のJVMで実行されるか(trueを推奨)かどうかを決定します。新しいJVMを生成するオーバーヘッドを回避しますが、メモリ不足の問題を引き起こす可能性があります。

これは、_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);
    }
  }
_

デフォルトの設定値により、executeInChildVM()メソッドが呼び出され、文字どおり_hadoop jar_が呼び出されます。他のコードパスは、これまでのところ私のテストで機能しています。潜在的なメモリの問題は、Javaヒープ構成(Xmx、Xmsなど))を調整することで解決できる可能性があります。

1
Andrey

HiveRunnerを実装しました。

https://github.com/klarna/HiveRunner

Macでテストし、Windowsで問題が発生しましたが、以下にリストされているいくつかの変更により、utilはうまく機能しました。

Windowsの場合、HiveRunnerをWindows環境で機能させるために行われた変更の一部を次に示します。これらの変更後、すべてのHiveクエリに対して単体テストが可能になります。

1. https://github.com/steveloughran/winutils にあるプロジェクトをコンピューターの任意の場所に複製し、そのフォルダーの/ binディレクトリを指す新しい環境変数HADOOP_HOMEを追加します。スラッシュやスペースは使用できません。 2. https://github.com/sakserv/hadoop-mini-clusters にあるプロジェクトをコンピューターの任意の場所に複製します。そのフォルダーの/ libディレクトリーを指す新しい環境変数HADOOP_WINDOWS_LIBSを追加します。この場合も、スラッシュやスペースは使用できません。 3. cygwinもインストールしましたが、Linuxのseverla win utilsが使用できると想定しています。

このgitbubのプルは、Windowsで動作させるのに役立ちました https://github.com/klarna/HiveRunner/pull/6

1
Prachi Sharma

Hiveは、Hiveテーブルのメタ情報を格納するRDBMSがローカルまたはスタンドアロンサーバーで実行できるという意味でのみ埋め込みモードをサポートします( https://cwiki.Apache.org/confluence/display/Hiveを参照)。/HiveClient (詳細))。さらに、Hiveとそれに付随するデータベースは、MapReduceジョブのストリングのオーケストレーターにすぎず、Hadoopフレームワークも実行している必要があります。

Hadoopスタックが事前構成されたこの仮想マシンを使用することをお勧めします http://hortonworks.com/products/hortonworks-sandbox/ 。 Hortonworksは2つの主要なHadoopディストリビューションプロバイダーの1つであるため、十分にサポートされています。

1
Dmitriusan

別のHive JUnitランナーは https://github.com/edwardcapriolo/Hive_test にあります

0
gliptak