如何在Java程序中使用Sqoop?

问题描述 投票:22回答:5

我知道如何通过命令行使用sqoop。但是不知道如何使用java程序调用sqoop命令。谁能给一些代码视图?

java hadoop sqoop
5个回答
23
投票

您可以通过在类路径中包含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:...”应该作为数组中的两个单独元素传递,而不是一个。
  • sqoop解析器知道如何接受双引号参数,因此如果需要(我建议总是)使用双引号。唯一的例外是fields-delimited-by参数,它需要一个char,所以不要双引号。
  • 我建议拆分命令行参数创建逻辑和实际执行,这样就可以正确测试你的逻辑,而无需实际运行该工具。
  • 最好使用--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


12
投票

下面是在Java程序中使用sqoop将代码从MySQL导入HDFS / HBase的示例代码。确保在类路径中有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()方法的输出进行错误处理。希望这会有所帮助。


3
投票

有一个技巧很适合我。通过ssh,您可以直接执行Sqoop命令。您必须使用的是SSH Java库

这与Java无关。您只需要在要执行导入的远程系统中包含安装的任何SSH库和sqoop。现在通过ssh连接到系统并执行将数据从MySQL导出到hive的命令。

你必须按照这一步骤。

下载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, 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();   
}
}

0
投票

如果你知道可执行文件的位置和命令行参数你可以使用ProcessBuilder,那么可以运行一个单独的Process,Java可以监视完成并返回代码。


0
投票

请按照它为我工作的vikas给出的代码,并在classpath中包含这些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-original-1.1.1.4 Hadoop / Lib
  10. 杰克逊大小的原始1.3.17的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如果我想将导入的文件放入配置单元中我应该使用options.parameter(“ - hive-import”)吗?

© www.soinside.com 2019 - 2024. All rights reserved.