71

Hive Thrift および JDBC インターフェースを使用して重要な Hive ジョブを作成しようとしていますが、適切な JUnit テストのセットアップに問題があります。自明ではないということは、メタストアのみを処理するのではなく、ジョブが少なくとも 1 つの MapReduce ステージをもたらすことを意味します。

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

Spring リファレンスに従って、Spring コンテキストを配線しました。ただし、ジョブは MapReduce フェーズで失敗し、Hadoop バイナリが存在しないというエラーが表示されます。

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

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

Hive の統合テストを 3 日間試した後、コミュニティに質問してみようと思いました。

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

私が見た追加のリソース:

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

4

6 に答える 6

13

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

HIVE-3816 が解決されるまでは、ミニクラスター テストが唯一のオプションです。以下は、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"));

テストのために別の hiveserver または hiveserver2 プロセスを実行する必要はありません。jdbc 接続 URL をjdbc:hive2:///

于 2014-02-16T21:48:23.110 に答える
6

1 つの非常に優れたツールを見つけるようになりました: HiveRunnerです。ハイブ スクリプトをテストするための jUnit 上のフレームワークです。内部では、メモリ内 HSQL をメタストアとしてスタンドアロンの HiveServer を起動します。

于 2014-08-29T19:31:53.307 に答える
1

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

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

于 2013-11-01T22:16:16.110 に答える
1

2014 年 2 月に受け入れられた回答から何が変わったのかはわかりませんが、Hive 1.2.0 の時点では、OP で説明されている問題を回避するために次のように動作します。

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

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

ローカル タスク (通常は mapjoin ハッシュ テーブル生成フェーズ) が別の JVM で実行されるかどうか (真の推奨) を決定します。新しい 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 など) を微調整することで解決できる可能性があります。

于 2016-10-18T18:49:50.000 に答える