Как использовать Sqoop в программе Java?

Я знаю, как использовать Sqoop через командную строку. Но не знаю, как вызвать команду sqoop с помощью java-программ . Кто - нибудь может дать представление кода?

5 ответов


вы можете запустить sqoop из своего java-кода, включив банку sqoop в свой путь к классам и вызвав Sqoop.runTool() метод. Вам нужно будет создать необходимые параметры для sqoop программно, как если бы это была командная строка (например,--connect etc.).

Пожалуйста, обратите внимание на следующее:

  • убедитесь, что имя инструмента sqoop (например, импорт / экспорт и т. д.) является первым параметром.
  • обратите внимание на порядок пути к классам - выполнение может завершиться ошибкой, так как для sqoop требуется версия X библиотеки, а вы используете другую версию. Убедитесь, что библиотеки, необходимые для sqoop, не затенены вашими собственными зависимостями. Я столкнулся с такой проблемой с commons-io (sqoop требует v1.4) и имел исключение NoSuchMethod, так как я использовал commons-io v1.2.
  • каждый аргумент должен быть на отдельном элементе массива. Например, " --connect jdbc: mysql:..."должны быть переданы как два отдельных элемента в массив, не один.
  • парсер sqoop знает, как принимать параметры с двойными кавычками, поэтому используйте двойные кавычки, если вам нужно (я предлагаю всегда). Единственным исключением является параметр fields-delimited-by, который ожидает один символ, поэтому не цитируйте его дважды.
  • Я бы предложил разделить логику создания аргументов командной строки и фактическое выполнение, чтобы ваша логика могла быть протестирована должным образом без фактического запуска инструмента.
  • было бы лучше использовать -- параметр 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));
}

RL


Ниже приведен пример кода для использования sqoop в Java-программе для импорта данных из 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 () для обработки ошибок. Надеюсь, это поможет.


есть трюк, который сработал для меня довольно легко. Через ssh вы можете выполнить команду Sqoop напрямую. Просто вы должны использовать библиотеку SSH Java

вы должны следовать этому шагу.

скачать библиотеку java sshxcute: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();   
}
}

Если вы знаете расположение исполняемого файла и аргументы командной строки вы можете использовать ProcessBuilder, Это может быть запущен отдельный Process что Java может контролировать для завершения и возврата кода.


пожалуйста, следуйте код, данный vikas он работал для меня и включить эти файлы jar в classpath и импортировать эти пакеты

импортировать com.компании Cloudera.как Sqoop.SqoopOptions; импортировать com.компании Cloudera.как Sqoop.инструмент.ImportTool;

Ref Библиотеки

  1. как Sqoop-1.4.4 банку /Sqoop и
  2. ojdbc6.jar/sqoop / lib (для oracle)
  3. commons-logging-1.1.1.jar hadoop/lib
  4. hadoop-core-1.2.1.сосуд /Hadoop с
  5. commons-cli-1.2.jar hadoop/lib
  6. commmons-io.2.1.jar hadoop/lib
  7. commons-конфигурация-1.6.jar hadoop/lib
  8. commons-lang-2.4.jar hadoop/lib
  9. jackson-core-asl-1.8.8.jar hadoop/lib
  10. jackson-mapper-asl-1.8.8.jar hadoop/lib
  11. commons-httpclient-3.0.1.jar hadoop/lib

системная библиотека JRE

1.ресурсы.jar jdk/jre / lib 2.rt.jar jdk/jre / lib 3. по jsse.сосуд с JDK/JRE и/Либ 4. око.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

иногда u получает ошибку, если ваш проект eclipse использует JDK1.6 и библиотеки, которые вы добавляете, - JDK1.7 для этого случая настройте JRE при создании проекта в eclipse.

Викас, если я хочу поместите импортированные файлы в hive, если я использую параметры.параметр ("--hive-import")?