Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

Обратите внимание на следующее:

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

Ответ 2

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

Ответ 3

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

Вы должны выполнить этот шаг.

Загрузите 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();   
}
}

Ответ 4

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

Ответ 5

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

import com.cloudera.sqoop.SqoopOptions; import com.cloudera.sqoop.tool.ImportTool;

Библиотеки библиотек

  • Sqoop-1.4.4 jar/sqoop
  • ojdbc6.jar/sqoop/lib (для oracle)
  • commons-logging-1.1.1.jar hasoop/lib
  • hadoop-core-1.2.1.jar/hadoop
  • commons-cli-1.2.jar hadoop/lib
  • commmons-io.2.1.jar hadoop/lib
  • commons-configuration-1.6.jar hasoop/lib
  • commons-lang-2.4.jar hadoop/lib
  • jackson-core-asl-1.8.8.jar hadoop/lib
  • jackson-mapper-asl-1.8.8.jar hadoop/lib
  • commons-httpclient-3.0.1.jar hasoop/lib

Системная библиотека 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 для этого случая настраивают JRE при создании проекта в eclipse.

Vikas, если я хочу поместить импортированные файлы в улей, я должен использовать options.parameter( "--hive-import" )?