web-dev-qa-db-ja.com

JavaプログラムでSqoopを使用するには?

コマンドラインからsqoopを使用する方法を知っています。しかし、Javaプログラムを使用してsqoopコマンドを呼び出す方法がわかりません。誰かがコードビューを提供できますか?

22
pradeep

クラスパスにsqoop jarを含め、Sqoop.runTool()メソッドを呼び出すことにより、Javaコード内からsqoopを実行できます。次のようにプログラムでsqoopに必要なパラメーターを作成する必要があります。コマンドラインの場合(例:_--connect_など)。

次の点に注意してください。

  • Sqoopツールの名前(インポート/エクスポートなど)が最初のパラメーターであることを確認してください。
  • クラスパスの順序に注意してください-sqoopにはバージョンXのライブラリが必要であり、別のバージョンを使用しているため、実行が失敗する可能性があります。 sqoopが必要とするライブラリーが独自の依存関係によって影になっていないことを確認してください。 commons-io(sqoopにはv1.4が必要です)でこのような問題が発生し、commons-io v1.2を使用していたため、NoSuchMethod例外が発生しました。
  • 各引数は、個別の配列要素上にある必要があります。たとえば、「-connect jdbc:mysql:...」は、配列内の1つの要素ではなく2つの個別の要素として渡す必要があります。
  • Sqoopパーサーは二重引用符で囲まれたパラメーターを受け入れる方法を知っているので、必要に応じて二重引用符を使用します(常にお勧めします)。唯一の例外は、単一の文字を期待するfields-delimited-byパラメータであるため、二重引用符で囲まないでください。
  • コマンドライン引数の作成ロジックと実際の実行を分割して、実際にツールを実行せずにロジックを適切にテストできるようにすることをお勧めします。
  • 環境への依存を防ぐために、--hadoop-homeパラメーターを使用することをお勧めします。
  • Sqoop.runTool()に対するSqoop.Main()の利点は、runTool()が実行のエラーコードを返すことです。

お役に立てば幸いです。

_final int ret = Sqoop.runTool(new String[] { ... });
if (ret != 0) {
  throw new RuntimeException("Sqoop failed - return code " + Integer.toString(ret));
}
_

RL

23
Harel Ben Attia

Java MySQLからHDFS/HBaseにデータをインポートするためのプログラム)でsqoopを使用するためのサンプルコードを以下に示します。クラスパスにsqoop jarがあることを確認してください:

        SqoopOptions options = new SqoopOptions();
        options.setConnectString("jdbc:mysql://HOSTNAME:PORT/DATABASE_NAME");
        //options.setTableName("TABLE_NAME");
        //options.setWhereClause("id>10");     // this where clause works when importing whole table, ie when setTableName() is used
        options.setUsername("USERNAME");
        options.setPassword("PASSWORD");
        //options.setDirectMode(true);    // Make sure the direct mode is off when importing data to HBase
        options.setNumMappers(8);         // Default value is 4
        options.setSqlQuery("SELECT * FROM user_logs WHERE $CONDITIONS limit 10");
        options.setSplitByCol("log_id");

        // HBase options
        options.setHBaseTable("HBASE_TABLE_NAME");
        options.setHBaseColFamily("colFamily");
        options.setCreateHBaseTable(true);    // Create HBase table, if it does not exist
        options.setHBaseRowKeyColumn("log_id");

        int ret = new ImportTool().run(options);

Harelが提案したように、run()メソッドの出力をエラー処理に使用できます。これが役立つことを願っています。

12
VikasG

私にはかなりうまくいったトリックがあります。 sshを介して、Sqoopコマンドを直接実行できます。あなたが使用しなければならないのはSSH Java Library

これはJavaから独立しています。インポートを実行するリモートシステムにインストールされているSSHライブラリとsqoopを含める必要があります。次に、sshを介してシステムに接続し、MySQLからHiveにデータをエクスポートするコマンドを実行します。

この手順に従う必要があります。

Sshxcute Java library: https://code.google.com/p/sshxcute/ をダウンロードして、Java以下を含むプロジェクトJavaコード

import net.neoremind.sshxcute.core.SSHExec;
import net.neoremind.sshxcute.core.ConnBean;
import net.neoremind.sshxcute.task.CustomTask;
import net.neoremind.sshxcute.task.impl.ExecCommand;

public class TestSSH {

public static void main(String args[]) throws Exception{

    // Initialize a ConnBean object, the parameter list is IP, username, password

    ConnBean cb = new ConnBean("192.168.56.102", "root","hadoop");

    // Put the ConnBean instance as parameter for SSHExec static method getInstance(ConnBean) to retrieve a singleton SSHExec instance
    SSHExec ssh = SSHExec.getInstance(cb);          
    // Connect to server
    ssh.connect();
    CustomTask sampleTask1 = new ExecCommand("echo $SSH_CLIENT"); // Print Your Client IP By which you connected to ssh server on Horton Sandbox
    System.out.println(ssh.exec(sampleTask1));
    CustomTask sampleTask2 = new ExecCommand("sqoop import --connect jdbc:mysql://192.168.56.101:3316/mysql_db_name --username=mysql_user --password=mysql_pwd --table mysql_table_name --Hive-import -m 1 -- --schema default");
    ssh.exec(sampleTask2);
    ssh.disconnect();   
}
}
3
vineetv2821993

Vikasによって提供されたコードに従ってください。コードはこれらのjarファイルをクラスパスに含め、これらのパッケージをインポートしてください。

import com.cloudera.sqoop.SqoopOptions; import com.cloudera.sqoop.tool.ImportTool;

参照ライブラリ

  1. Sqoop-1.4.4 jar/sqoop
  2. ojdbc6.jar/sqoop/lib(Oracleの場合)
  3. commons-logging-1.1.1.jar hadoop/lib
  4. hadoop-core-1.2.1.jar/hadoop
  5. commons-cli-1.2.jar hadoop/lib
  6. commmons-io.2.1.jar hadoop/lib
  7. commons-configuration-1.6.jar hadoop/lib
  8. commons-lang-2.4.jar hadoop/lib
  9. jackson-core-asl-1.8.8.jar hadoop/lib
  10. jackson-mapper-asl-1.8.8.jar hadoop/lib
  11. commons-httpclient-3.0.1.jar hadoop/lib

JREシステムライブラリ

1.resources.jar jdk/jre/lib 2.rt.jar jdk/jre/lib 3. jsse.jar jdk/jre/lib 4. jce.jar jdk/jre/lib 5. charsets、jar jdk/jre/lib 6. jfr.jar jdk/jre/lib 7. dnsns.jar jdk/jre/lib/ext 8. sunec.jar jdk/jre/lib/ext 9. zipfs.jar jdk/jre/lib/ext 10. sunpkcs11。 jar jdk/jre/lib/ext 11. localedata.jar jdk/jre/lib/ext 12. sunjce_provider.jar jdk/jre/lib/ext

EclipseプロジェクトがJDK1.6を使用していて、追加したライブラリがJDK1.7の場合、Eclipseでプロジェクトを作成するときにJREを構成して、エラーが発生することがあります。

VikasインポートしたファイルをHiveに配置する場合、options.parameter( "--Hive-import")を使用する必要がありますか?

0
timma

実行可能ファイルの場所とコマンドライン引数がわかっている場合は、ProcessBuilderを使用できます。これを実行すると、別のProcessを実行できますJavaで監視できます完了および戻りコード。

0
cdc