如何在Java程序中使用Sqoop?

pra*_*eep 22 java hadoop sqoop

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

小智 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));
}
Run Code Online (Sandbox Code Playgroud)

RL

  • 嘿,如果你有一个代码示例..这会有所帮助. (2认同)

小智 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);
Run Code Online (Sandbox Code Playgroud)

正如Harel所建议的那样,我们可以使用run()方法的输出进行错误处理.希望这会有所帮助.