2016-10-12 14 views
0

Hueを使用してOozieのYARNでSqoopジョブを実行する際に問題が発生しました。私は、Oracleデータベースからテーブルをダウンロードし、そのテーブルをHDFSにアップロードしたいと考えています。私は4ノードで構成されたマルチノードクラスタを持っています。Oozieを使用してYARNでSqoopジョブを実行

私はシンプルなSqoopステートメントを実行したい:

import --options-file /tmp/oracle_dos.txt --table BD.BD_TABLE --target-dir /user/user1/files/user_temp_20160930_30 --m 1 

オプションファイルはノード番号1の他のノード上のローカルシステム上に配置されているがを/ tmp /ディレクトリにはオプションファイルを持っていません。私は、SqoopジョブにOozieのワークフローを作成し、それを実行しようとしたが、私はエラーを得た:

3432 [main] ERROR org.apache.sqoop.Sqoop - Error while expanding arguments 
java.lang.Exception: Unable to read options file: /tmp/oracle_dos.txt 

奇妙な事は仕事が時々OKであるということですが、時には失敗します。ログファイルが私に答えた理由 - OozieはYARNでSqoopジョブを実行します。

リソースマネージャ(YARNのコンポーネント)は、どのノードがSqoopジョブを実行するかを決定します。 Resource Managerが、ノード1(ローカルファイルシステム上のオプションファイルを持つ)がジョブを実行することを決定したとき、すべてがOKです。しかし、RMが他の3つのノードのうちの1つがSqoopジョブを実行することを決定したとき、それは失敗しました。

これは私にとって大きな問題です。私はすべてのノードにオプションファイルをアップロードしたくないからです(なぜなら、1000ノードがあればどうなるでしょうか?)。だから私の質問です - どのノードを使用する必要があるリソースマネージャーに指示する方法はありますか?

答えて

1

あなたはノード上であなたoozieアクション用のカスタムファイルが利用できるようにすることができ、それがこのsyntaxを見て、あなたのsqoopアクションで<file>タグを使用して行うことができます。

<workflow-app name="[WF-DEF-NAME]" xmlns="uri:oozie:workflow:0.1"> 
    ... 
    <action name="[NODE-NAME]"> 
     <sqoop xmlns="uri:oozie:sqoop-action:0.2"> 
      <job-tracker>[JOB-TRACKER]</job-tracker> 
      <name-node>[NAME-NODE]</name-node> 
      <prepare> 
       <delete path="[PATH]"/> 
       ... 
       <mkdir path="[PATH]"/> 
       ... 
      </prepare> 
      <configuration> 
       <property> 
        <name>[PROPERTY-NAME]</name> 
        <value>[PROPERTY-VALUE]</value> 
       </property> 
       ... 
      </configuration> 
      <command>[SQOOP-COMMAND]</command> 
      <arg>[SQOOP-ARGUMENT]</arg> 
      ... 
      <file>[FILE-PATH]</file> 
      ... 
      <archive>[FILE-PATH]</archive> 
      ... 
     </sqoop> 
     <ok to="[NODE-NAME]"/> 
     <error to="[NODE-NAME]"/> 
    </action> 
    ... 
</workflow-app> 

thisをお読みください。

あなたのワークフローのディレクトリにファイルを置く oracle_dos.txt最も単純なケースで

The file , archive elements make available, to map-reduce jobs, files and archives. If the specified path is relative, it is assumed the file or archiver are within the application directory, in the corresponding sub-path. If the path is absolute, the file or archive it is expected in the given absolute path.

Files specified with the file element, will be symbolic links in the home directory of the task.

...

ので、要素を追加oracle_dos.txt workflow.xmlで、あなたはこのような何かにコマンドを変更します。

01この場合
import --options-file ./oracle_dos.txt --table BD.BD_TABLE --target-dir /user/user1/files/user_temp_20160930_30 --m 1 

それにもかかわらず、あなたのsqoopのアクションは、クラスタ内のいくつかのランダムに選ばれたノード上で実行されている、oozieは、このノードにoracle_dos.txtをコピーし、あなたは、ローカルファイルへのとしてそれを参照することができます。

+0

あなたは正しいです。ありがとうございました :) –

0

おそらくこれはファイルのアクセス許可に関するものです。このファイルを/ home/{user}に入れてみてください。

+0

これはファイルのパーミッションに関するものではありません。オプション・ファイルは一時的に/ tmp/folderにあり、chmodは777です。問題は、ファイルがすべてのノードにはなく、ノード1にのみ存在することですが、リソース・マネージャはすべてのノードでジョブを実行します。 –

関連する問題