Как использовать Sqoop в программе Java? - PullRequest
22 голосов
/ 10 февраля 2012

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

Ответы [ 5 ]

23 голосов
/ 11 февраля 2012

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

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

  • Убедитесь, что имя инструмента 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

12 голосов
/ 29 апреля 2013

Ниже приведен пример кода для использования sqoop в программе Java для импорта данных из MySQL в HDFS / HBase.Убедитесь, что в вашем classpath есть 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 голосов
/ 27 июня 2014

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

Это не зависит от Java.Вам просто нужно включить любую библиотеку SSH и sqoop, установленные в удаленной системе, для которой вы хотите выполнить импорт.Теперь подключитесь к системе через ssh и выполните команды, которые будут экспортировать данные из MySQL в hive.

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

Загрузить библиотеку 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, the 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();   
}
}
0 голосов
/ 12 ноября 2013

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

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

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

  1. Sqoop-1.4.4 jar / sqoop
  2. ojdbc6.jar / sqoop / lib (для оракула)
  3. commons-logging-1.1.1.jar hadoop / lib
  4. hadoop-core-1.2.1.jar / hadoop
  5. commons-cli-1.2.jar hadoop / lib
  6. commmons-io.2.1.jar hadoop / lib
  7. commons-configuration-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.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 / ext8. 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

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

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

0 голосов
/ 10 февраля 2012

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

...