Como usar o Sqoop no programa Java?

Eu sei como usar o sqoop através da linha de comando. Mas não sei como chamar o comando sqoop usando programas java. Alguém pode dar alguma visão de código?

Você pode executar o sqoop de dentro do seu código java incluindo o jar do sqoop no seu classpath e chamando o método Sqoop.runTool() . Você teria que criar os parâmetros necessários para o sqoop programaticamente, como se fosse a linha de comando (por exemplo, --connect etc.).

Por favor, preste atenção ao seguinte:

  • Certifique-se de que o nome da ferramenta sqoop (por exemplo, importação / exportação, etc.) seja o primeiro parâmetro.
  • Preste atenção à ordenação do caminho de class – A execução pode falhar porque o sqoop requer a versão X de uma biblioteca e você usa uma versão diferente. Certifique-se de que as bibliotecas que o sqoop requer não sejam ofuscadas por suas próprias dependencies. Eu encontrei um problema com commons-io (sqoop requer v1.4) e tinha uma exceção NoSuchMethod desde que eu estava usando o commons-io v1.2.
  • Cada argumento precisa estar em um elemento de matriz separado. Por exemplo, “–connect jdbc: mysql: …” deve ser passado como dois elementos separados na matriz, não um.
  • O analisador sqoop sabe como aceitar parâmetros com aspas duplas, portanto, use aspas duplas se precisar (sugiro sempre). A única exceção é o parâmetro delimitado por campos, que espera um único caractere, portanto, não faça aspas duplas.
  • Eu sugiro dividir a lógica de criação de argumentos de linha de comando e a execução real para que sua lógica possa ser testada adequadamente sem executar a ferramenta.
  • Seria melhor usar o parâmetro –hadoop-home, para evitar a dependência do ambiente.
  • A vantagem de Sqoop.runTool() em oposição a Sqoop.Main() é o fato de que runTool() retorna o código de erro da execução.

Espero que ajude.

 final int ret = Sqoop.runTool(new String[] { ... }); if (ret != 0) { throw new RuntimeException("Sqoop failed - return code " + Integer.toString(ret)); } 

RL

Encontre abaixo um exemplo de código para usar o sqoop no Programa Java para importar dados do MySQL para o HDFS / HBase. Certifique-se de ter o jar do sqoop no seu classpath:

  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); 

Como sugerido por Harel, podemos usar a saída do método run () para tratamento de erros. Esperando que isso ajude.

Há um truque que funcionou muito fácil para mim. Via ssh você pode executar o comando Sqoop diretamente. Só você tem que usar é uma biblioteca Java SSH

Você tem que seguir este passo.

Faça o download da biblioteca java sshxcute: https://code.google.com/p/sshxcute/ e adicione-a ao caminho de compilation do seu projeto java que contém o seguinte código 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(); } } 

Se você souber a localização do executável e os argumentos da linha de comandos, poderá utilizar um ProcessBuilder , que poderá então ser executado em um Process separado Process que o Java pode monitorar a conclusão e o código de retorno.

Por favor siga o código dado pelo vikas que funcionou para mim e inclua estes arquivos jar no classpath e importe estes pacotes

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

Bibliotecas de referência

  1. Sqoop-1.4.4 jar / sqoop
  2. ojdbc6.jar / sqoop / lib (para oracle)
  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

Biblioteca do sistema JRE

1.jts / jre / lib 2.rt.jar jdk / jre / lib 3. jsse.jar jdk / jre / lib 4. jce.jar jdk / jre / lib 5. conjuntos de caracteres, jar jdk / jre / lib 6. jd.jar jdk / jre / lib 7.dnsns.jar jdk / jre/lib/ext 8. sunc.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

Às vezes, você recebe um erro se seu projeto do eclipse estiver usando o JDK1.6 e as bibliotecas que você adicionar forem JDK1.7 para este caso, configure o JRE ao criar o projeto no eclipse.

Vikas se eu quiser colocar os arquivos importados no ramo, devo usar options.parameter (“–hive-import”)?