2016-08-24 20 views
0

私はAWS EMRで多くのsqoopジョブを実行していますが、時にはこのインスタンスをオフにする必要があります。sqoopインクリメンタルインポートIDを保存

最後のIDを増分インポート(おそらくlocaly)から保存し、cronjob経由でs3にアップロードする方法があります。

私の最初のアイデアは、ジョブを作成するときに、私のデータが格納されているRedshiftにリクエストを送信し、最後のIDまたはlast_modifiedをbashスクリプトで取得することです。

もう一つのアイデアは、sqoopジョブの出力を得ることです--show $ jobid、last_idのパラメータをフィルタリングし、それを使ってジョブを再作成します。

しかし、sqoopがこれをより簡単に行う方法を提供しているかどうかはわかりません。 Sqoop docs 1として

答えて

1

ソリューション

ステップ

  1. MySQLインスタンスを作成し、これを実行する照会: CREATE TABLE SQOOP_ROOT (version INT, propname VARCHAR(128) NOT NULL, propval VARCHAR(256), CONSTRAINT SQOOP_ROOT_unq UNIQUE (version, propname));INSERT INTO SQOOP_ROOT VALUES(NULL, 'sqoop.hsqldb.job.storage.version', '0');

  2. 変更元sqoop-site.xmlには、MySQLのエンドポイント、ユーザー名とパスワードを追加します。あなたが初めてでコマンドを実行するとsqoop job --list

<property> 
    <name>sqoop.metastore.client.enable.autoconnect</name> 
    <value>true</value> 
    <description>If true, Sqoop will connect to a local metastore 
     for job management when no other metastore arguments are 
     provided. 
    </description> 
    </property> 


    <!-- 
    The auto-connect metastore is stored in ~/.sqoop/. Uncomment 
    these next arguments to control the auto-connect process with 
    greater precision. 
    --> 

    <property> 
    <name>sqoop.metastore.client.autoconnect.url</name> 
    <value>jdbc:mysql://your-mysql-instance-endpoint:3306/database</value> 
    <description>The connect string to use when connecting to a 
     job-management metastore. If unspecified, uses ~/.sqoop/. 
     You can specify a different path here. 
    </description> 
    </property> 
    <property> 
    <name>sqoop.metastore.client.autoconnect.username</name> 
    <value>${sqoop-user}</value> 
    <description>The username to bind to the metastore. 
    </description> 
    </property> 
    <property> 
    <name>sqoop.metastore.client.autoconnect.password</name> 
    <value>${sqoop-pass}</value> 
    <description>The password to bind to the metastore. 
    </description> 
    </property> 

それはゼロ値を返します。しかし、ジョブを作成した後、EMRをシャットダウンすると、実行中のジョブからsqoopメタデータを失うことはありません。

EMRでは、ブートストラップアクションを使用して、この操作をクラスタ作成で自動化できます。

2

増分インポートをコマンドラインから実行された場合、後続の増分インポートに--last値として指定されるべき値は、画面に出力されますご参考に。増分インポートが保存されたジョブから実行される場合、この値は保存されたジョブに保持されます。その後のsqoopジョブの実行--exec someIncrementalJobは、以前にインポートされたものよりも新しい行だけを引き続きインポートします。

したがって、何も保存する必要はありません。 Sqoopのメタストアは、最後の値を保存し、次のインクリメンタルなインポートジョブのために利用できます。

例、

sqoop job \ 
--create new_job \ 
-- \ 
import \ 
--connect jdbc:mysql://localhost/testdb \ 
--username xxxx \ 
--password xxxx \ 
--table employee \ 
--incremental append \ 
--check-column id \ 
--last-value 0 

そして--execパラメータを指定して、このジョブを開始:私は、ファイルsqoop-site.xmlのを変更し、私のMySQLへのエンドポイントを追加

sqoop job --exec new_job 
+0

問題は、メタストアがローカルに保存されていて、いつかETLプロセスをシャットダウンする必要があり、復元時に最後のIDから再起動する必要があるためです。ドキュメントを読む私はsqoop-metastoreを見て、私はsqoop-siteを変更しました。xmlを使用して、リモートでMySQLインスタンスにこのプロパティを保存します。私はこのアプローチを明日検証する予定です。 –

+0

@CarlosEduardo this _(リモートMySQLをメタストアとして)_があなたの問題を解決します。 –

+0

@CarlosEduardoあなたはそれを試してみましたか? –

関連する問題