복붙노트

[HADOOP] Java로 Sqoop을 실행하려면 어떻게해야합니까?

HADOOP

Java로 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. ==============================

    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. ==============================

    2.먼저 Sqoop 1에 공식 클라이언트 API가 없다는 것을 언급하겠습니다. 비록 당신이하는 방식으로 Sqoop을 호출하는 것은 꽤 흔하고 일하는 것입니다.

    먼저 Sqoop 1에 공식 클라이언트 API가 없다는 것을 언급하겠습니다. 비록 당신이하는 방식으로 Sqoop을 호출하는 것은 꽤 흔하고 일하는 것입니다.

    로그를 기반으로 Sqoop을 실행중인 자바 애플리케이션이 classpath에 hadoop 구성을 가지고 있지 않다고 추측 할 수있다. 따라서 Sqoop은 클러스터에 대한 정보를 얻지 못하고 "로컬"모드로 작동합니다. 원격 클러스터에 대해 Sqoop을 실행하려면 hadoop 구성을 클래스 경로에 넣어야합니다. 자세한 내용은 stackoverflow에서 다음 항목을 체크 아웃하십시오.

  3. ==============================

    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;
    }
    
  4. from https://stackoverflow.com/questions/14918923/how-can-i-execute-sqoop-in-java by cc-by-sa and MIT license