oozie Sqoop アクションがハイブへのデータのインポートに失敗する
質問
oozie sqoop アクションの実行中に問題が発生しました。ログを見ると、sqoop が一時ディレクトリにデータをインポートでき、その後 sqoop がデータをインポートするハイブ スクリプトを作成していることがわかります。
一時データをハイブにインポート中に失敗します。
ログには例外がありません。
以下は私が使用しているスクープアクションです。
<workflow-app name="testSqoopLoadWorkflow" xmlns="uri:oozie:workflow:0.4">
<credentials>
<credential name='hive_credentials' type='hcat'>
<property>
<name>hcat.metastore.uri</name>
<value>${HIVE_THRIFT_URL}</value>
</property>
<property>
<name>hcat.metastore.principal</name>
<value>${KERBEROS_PRINCIPAL}</value>
</property>
</credential>
</credentials>
<start to="loadSqoopDataAction"/>
<action name="loadSqoopDataAction" cred="hive_credentials">
<sqoop xmlns="uri:oozie:sqoop-action:0.2">
<job-tracker>${jobTracker}</job-tracker>
<name-node>${nameNode}</name-node>
<job-xml>/tmp/hive-oozie-site.xml</job-xml>
<configuration>
<property>
<name>oozie.hive.defaults</name>
<value>/tmp/hive-oozie-site.xml</value>
</property>
</configuration>
<command>job --meta-connect ${SQOOP_METASTORE_URL} --exec TEST_SQOOP_LOAD_JOB</command>
</sqoop>
<ok to="end"/>
<error to="kill"/>
</action>
以下は、データのインポートに使用している sqoop ジョブです。
sqoop job --meta-connect ${SQOOP_METASTORE_URL} --create TEST_SQOOP_LOAD_JOB -- import --connect '${JDBC_URL}' --table testTable -m 1 --append --check-column pkId --incremental append --hive-import --hive-table testHiveTable;
Mapred ログで次の例外が発生します。
72285 [main] INFO org.apache.sqoop.hive.HiveImport - Loading uploaded data into Hive
Intercepting System.exit(1)
<<< Invocation of Main class completed <<<
Failing Oozie Launcher, Main class [org.apache.oozie.action.hadoop.SqoopMain], exit code [1]
Oozie Launcher failed, finishing Hadoop job gracefully
Oozie Launcher ends
提案してください。
解決
これは典型的なようです Hive への Sqoop インポート 仕事。したがって、Sqoop は HDFS にデータを正常にインポートしましたが、そのデータを Hive にロードすることに失敗しているようです。
何が起こっているのかについての背景をいくつかご紹介します...Oozie は、Sqoop コマンドを実行するための別のジョブ (Hadoop クラスター内の任意のノードで実行されます) を起動します。Sqoop コマンドは、データを HDFS にロードするための別のジョブを開始します。次に、Sqoop ジョブの最後に、sqoop はハイブ スクリプトを実行して、そのデータを Hive にロードします。
これは理論的には Hadoop クラスター内の任意のノードから実行されるため、Hive CLI が各ノードで利用可能であり、同じメタストアと通信する必要があります。Hive メタストアはリモート モードで実行する必要があります。
最も一般的な問題は、Sqoop が正しいメタストアと通信できないことです。通常、この主な理由は次のとおりです。
Hive メタストア サービス は実行されていません。リモート モードで実行し、別のサービスを開始する必要があります。実行中かどうかを確認する簡単な方法は次のとおりです。
サービスハイブメタストアのステータス
hive-site.xml
含まれていないhive.metastore.uris
. 。ここに例がありますhive-site.xml
とhive.metastore.uris
セット:<configuration> ... <property> <name>hive.metastore.uris</name> <value>thrift://sqoop2.example.com:9083</value> </property> ... </configuration>
hive-site.xml
Sqoop アクション (またはそのプロパティ) には含まれません。hive-site.xml を<file>
Sqoop アクションの要素。以下に workflow.xml の例を示します。<file>
初期化:<workflow-app name="sqoop-to-hive" xmlns="uri:oozie:workflow:0.4"> ... <action name="sqoop2hive"> ... <sqoop xmlns="uri:oozie:sqoop-action:0.2"> ... <file>/tmp/hive-site.xml#hive-site.xml</file> </sqoop> ... </action> ... </workflow-app>
他のヒント
これはSQOOPのバグのようです。JIRA#についてはよくわかりません。Hortonworksは、HDP 2.2バージョンでも問題はまだ解決されていないと述べました。
@abeaumase - 私はあなたの解決策を使いようとします。
以下の解決策をチェックしたいのであれば、1つのOozie JobでSQOOP + Hiveインポートに適していますか?
... ... ... /tmp/hive-site.xml#hive-site.xml. ... ...
CDHを使用している場合、問題が隠れているメタストアJAR依存関係の競合が原因である可能性があります。