[HADOOP] Java로 Sqoop을 실행하려면 어떻게해야합니까?
HADOOPJava로 Sqoop을 실행하려면 어떻게해야합니까?
새 Java 프로젝트를 만든 다음 Library 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", "--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를 사용해 보았지만 사용하고 싶지 않습니다.
정말 Sqoop API를 사용하고 싶지만 아직 존재하지 않는다고 들었습니다.
나는이 질문을 읽었지만 그것은 나를 위해 일하지 않는다.
해결법
-
==============================
1.저를 위해 아주 쉽게 운동 한 간계가있다. ssh를 통해 Sqoop 명령을 직접 실행할 수 있습니다. SSH Java 라이브러리 만 사용해야합니다.
저를 위해 아주 쉽게 운동 한 간계가있다. ssh를 통해 Sqoop 명령을 직접 실행할 수 있습니다. SSH Java 라이브러리 만 사용해야합니다.
이 단계를 따라야합니다.
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, 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(); } }
-
==============================
2.먼저 Sqoop 1에 공식 클라이언트 API가 없다는 것을 언급하겠습니다. 비록 당신이하는 방식으로 Sqoop을 호출하는 것은 꽤 흔하고 일하는 것입니다.
먼저 Sqoop 1에 공식 클라이언트 API가 없다는 것을 언급하겠습니다. 비록 당신이하는 방식으로 Sqoop을 호출하는 것은 꽤 흔하고 일하는 것입니다.
로그를 기반으로 Sqoop을 실행중인 자바 애플리케이션이 classpath에 hadoop 구성을 가지고 있지 않다고 추측 할 수있다. 따라서 Sqoop은 클러스터에 대한 정보를 얻지 못하고 "로컬"모드로 작동합니다. 원격 클러스터에 대해 Sqoop을 실행하려면 hadoop 구성을 클래스 경로에 넣어야합니다. 자세한 내용은 stackoverflow에서 다음 항목을 체크 아웃하십시오.
-
==============================
3.Java 프로그램에서 sqoop을 실행하기 위해 "SqoopOptions"를 사용할 수 있습니다.
Java 프로그램에서 sqoop을 실행하기 위해 "SqoopOptions"를 사용할 수 있습니다.
이것은 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; }
from https://stackoverflow.com/questions/14918923/how-can-i-execute-sqoop-in-java by cc-by-sa and MIT license
'HADOOP' 카테고리의 다른 글
[HADOOP] Mapreduce wordcount 작업에서 클래스를 찾을 수 없음 예외 (0) | 2019.06.04 |
---|---|
[HADOOP] 스칼라 디렉토리에 폴더 나열하기 (0) | 2019.06.04 |
[HADOOP] 구조체 배열로 데이터 선택 하이브 (0) | 2019.06.04 |
[HADOOP] 하이브 및 정규 표현 (0) | 2019.06.04 |
[HADOOP] 새 API에서의 AlternTextOutputFormat 대체 (0) | 2019.06.04 |