Hadoop 如何在Java中执行Sqoop?
我创建了一个新的Java项目,然后添加了库Sqoop和Hadoop。(库是“hadoop-core-1.1.1.jar、sqoop-1.4.2.jar等…” 然后我尝试了以下代码:Hadoop 如何在Java中执行Sqoop?,hadoop,hive,sqoop,Hadoop,Hive,Sqoop,我创建了一个新的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", "-
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,但我不想使用它们
我真的很想使用sqoopapi,但我听说它还不存在
我读过,但它对我不起作用。首先让我提到,SQOOP1没有官方的客户端API。尽管以您这样的方式调用Sqoop是非常常见和有效的 根据日志,我猜执行Sqoop的java应用程序在类路径上没有hadoop配置。因此,Sqoop不会获取关于集群的信息,而是在“本地”模式下工作。为了在远程集群上运行Sqoop,需要将hadoop配置放入类路径中。有关更多详细信息,请在stackoverflow上签出以下内容。您可以使用“SqoopOptions”在Java程序中执行sqoop 这是将MySql中的表导入HDFS的示例代码
public static void importSQLToHDFS() throws Exception {
String driver = "com.mysql.jdbc.Driver";
Class.forName(driver).newInstance();
Configuration config = new Configuration();
config.addResource(new Path("/.../conf/core-site.xml"));
config.addResource(new Path("/.../conf/hdfs-site.xml"));
properties.load(new FileInputStream("/.../sqoopimport.properties"));
SqoopOptions options = new SqoopOptions();
options.setDriverClassName(driver);
options.setHadoopHome("/.../hadoop-0.20.2-cdh3u2");
options.setConnectString(properties.getProperty("db_connection_string"));
options.setTableName(properties.getProperty("db_mysql_table_name"));
options.setUsername(properties.getProperty("db_usr_id"));
options.setPassword(properties.getProperty("db_passwd"));
options.setNumMappers(1);
options.setTargetDir(properties.getProperty("path_export_file"));
options.setFileLayout(FileLayout.TextFile);
new ImportTool().run(options);
}
有关导出,请参见下面的示例代码。
注意:此处不使用属性文件。确保已创建要导入数据的表
public static boolean exportHDFSToSQL() throws InstantiationException, IllegalAccessException, ClassNotFoundException {
try {
SqoopOptions options=new SqoopOptions();
options.setConnectString("jdbc:mysql://localhost:3306/dbName");
options.setUsername("user_name");
options.setPassword("pwd");
options.setExportDir("path of file to be exported from hdfs");
options.setTableName("table_name");
options.setInputFieldsTerminatedBy(',');
options.setNumMappers(1);
new ExportTool().run(options);
} catch (Exception e) {
return false;
}
return true;
}
有一个技巧对我来说很简单。通过ssh,您可以直接执行Sqoop命令。您只需要使用SSH Java库 你必须遵循这一步 下载sshxcute java库: 并将其添加到包含以下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();
}
}
谢谢你的帮助。但什么是“属性”?我成功了吗?我不知道“/…/sqoopimport.properties”嗯…是的,上面的代码需要创建一个属性文件。上面的代码用于将表从MySQL导入HDFS。对于导出,请使用“新建导出工具()。运行(选项);“复制”: