如何在Java程序中使用Sqoop?

2022-09-02 01:03:14

我知道如何通过命令行使用sqoop。但是不知道如何使用java程序调用sqoop命令。任何人都可以提供一些代码视图吗?


答案 1

您可以通过在类路径中包含 sqoop jar 并调用该方法来从 Java 代码内部运行 sqoop。您必须创建所需的参数,以便以编程方式进行 sqoop 操作,就好像它是命令行一样(例如 等)。Sqoop.runTool()--connect

请注意以下事项:

  • 确保 sqoop 工具名称(例如导入/导出等)是第一个参数。
  • 请注意类路径排序 - 执行可能会失败,因为 sqoop 需要库的 X 版本,而您使用的是其他版本。确保 sqoop 所需的库不会被你自己的依赖项所掩盖。我在commons-io上遇到了这样的问题(sqoop需要v1.4),并且自从我使用commons-io v1.2以来,我有一个NoSuchMethod例外。
  • 每个参数都需要位于单独的数组元素上。例如,“--connect jdbc:mysql:...”应作为数组中的两个独立元素传递,而不是一个。
  • sqoop解析器知道如何接受双引号参数,因此如果需要,请使用双引号(我建议始终使用)。唯一的例外是字段分隔参数,它需要一个字符,所以不要用双引号括起来。
  • 我建议拆分命令行参数创建逻辑和实际执行,以便可以在不实际运行工具的情况下正确测试您的逻辑。
  • 最好使用 --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));
}

断续器


答案 2

在下面找到在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() 方法的输出进行错误处理。希望这有帮助。


推荐