Я знаю, как использовать sqoop через командную строку. Но не знаю, как вызвать команду sqoop с помощью java-программ. Может кто-нибудь дать некоторый вид кода?
Как использовать Sqoop в Java-программе?
Ответ 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" )?