我知道如何通过命令行使用sqoop。 但是不知道如何使用java程序调用sqoop命令。 任何人都可以提供一些代码视图吗?
答案 0 :(得分:23)
您可以通过在类路径中包含sqoop jar并调用Sqoop.runTool()
方法,从java代码中运行sqoop。您必须以编程方式为sqoop创建所需的参数,就好像它是命令行一样(例如--connect
等。)。
请注意以下事项:
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
答案 1 :(得分: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()方法的输出来进行错误处理。希望这会有所帮助。
答案 2 :(得分: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();
}
}
答案 3 :(得分:0)
如果你知道可执行文件的位置和命令行参数,你可以使用ProcessBuilder
,然后可以运行一个单独的Process
,Java可以监视完成并返回代码。
答案 4 :(得分:0)
请遵循vikas给出的代码,并在classpath中包含这些jar文件并导入这些包
import com.cloudera.sqoop.SqoopOptions; import com.cloudera.sqoop.tool.ImportTool;
参考图书馆
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”)吗?