3

新しい Java プロジェクトを作成し、ライブラリ Sqoop と Hadoop を追加しました。(ライブラリは「hadoop-core-1.1.1.jar、sqoop-1.4.2.jar など....」です。)

次に、以下のコードを試しました:

public class MySqoopDriver {
    public static void main(String[] args) {
        String[] str = { "export", "--connect", "jdbc:mysql://localhost/mytestdb", "--hadoop-home",
                "/home/yoonhok/development/hadoop-1.1.1", "--table", "tbl_1", "--export-dir", "hdfs://localhost:9000/user/hive/warehouse/tbl_1",
                "--username", "yoonhok", "--password", "1234"};

        Sqoop.runTool(str);
    }
}

ターミナルで試してみるとうまくいくので、パラメータは正しいです。

しかし、うまくいきませんでした。エラーメッセージは次のとおりです。

13/02/17 16:23:07 WARN tool.BaseSqoopTool: Setting your password on the command-line is insecure. Consider using -P instead.
13/02/17 16:23:07 INFO manager.MySQLManager: Preparing to use a MySQL streaming resultset.
13/02/17 16:23:07 INFO tool.CodeGenTool: Beginning code generation
13/02/17 16:23:07 INFO manager.SqlManager: Executing SQL statement: SELECT t.* FROM `tbl_1` AS t LIMIT 1
13/02/17 16:23:07 INFO manager.SqlManager: Executing SQL statement: SELECT t.* FROM `tbl_1` AS t LIMIT 1
13/02/17 16:23:07 INFO orm.CompilationManager: HADOOP_HOME is /home/yoonhok/development/hadoop-1.1.1
Note: /tmp/sqoop-yoonhok/compile/86a3cab62184ad50a3ae11e7cb0e4f4d/tbl_1.java uses or overrides a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
13/02/17 16:23:08 INFO orm.CompilationManager: Writing jar file: /tmp/sqoop-yoonhok/compile/86a3cab62184ad50a3ae11e7cb0e4f4d/tbl_1.jar
13/02/17 16:23:08 INFO mapreduce.ExportJobBase: Beginning export of tbl_1
13/02/17 16:23:09 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
13/02/17 16:23:09 INFO input.FileInputFormat: Total input paths to process : 1
13/02/17 16:23:09 INFO input.FileInputFormat: Total input paths to process : 1
13/02/17 16:23:09 INFO mapred.JobClient: Cleaning up the staging area file:/tmp/hadoop-yoonhok/mapred/staging/yoonhok1526809600/.staging/job_local_0001
13/02/17 16:23:09 ERROR security.UserGroupInformation: PriviledgedActionException as:yoonhok cause:java.io.FileNotFoundException: File /user/hive/warehouse/tbl_1/000000_0 does not exist.
13/02/17 16:23:09 ERROR tool.ExportTool: Encountered IOException running export job: java.io.FileNotFoundException: File /user/hive/warehouse/tbl_1/000000_0 does not exist.

HDFS を確認すると、ファイルが存在します。

hadoop fs -ls /user/hive/warehouse/tbl_1
Found 1 items
-rw-r--r--   1 yoonhok supergroup        240 2013-02-16 18:56 /user/hive/warehouse/tbl_1/000000_0

Java プログラムで Sqoop を実行するにはどうすればよいですか?

Processbuilder と Process を試しましたが、使いたくありません。

Sqoop API をどうしても使いたいのですが、まだ存在しないと聞きました。

この質問を読みましたが、うまくいきません。

4

3 に答える 3

3

私にとってかなり簡単にうまくいったトリックがあります。ssh 経由で Sqoop コマンドを直接実行できます。使用する必要があるのは SSH Java ライブラリです

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

sshxcute Java ライブラリをダウンロード: 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, 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();   
   }
}
于 2014-06-27T16:13:44.713 に答える
1

まず、Sqoop 1 には公式のクライアント API がないことを述べさせてください。あなたが行う方法でSqoopを呼び出すことは非常に一般的で機能していますが。

ログに基づいて、Sqoop を実行している Java アプリケーションのクラスパスに Hadoop 構成がないと推測できます。したがって、Sqoop はクラスターに関する情報を取得せず、「ローカル」モードで動作します。リモート クラスタに対して Sqoop を実行するには、hadoop 構成をクラスパスに配置する必要があります。詳細については、stackoverflow の次のエントリを確認してください。

于 2013-02-18T00:14:09.790 に答える