2012-02-10 25 views
19

Sé cómo usar sqoop a través de la línea de comandos. Pero no sé cómo llamar al comando sqoop usando programas java. ¿Alguien puede dar alguna vista de código?¿Cómo usar Sqoop en el programa Java?

+1

Runtime.exec (comando); ¿Es eso lo que estás buscando? Http: //docs.oracle.com/javase/1.5.0/docs/api/java/lang/Runtime.html – kosa

Respuesta

18

Puede ejecutar sqoop desde dentro de su código java incluyendo el jar sqoop en su classpath y llamando al método Sqoop.runTool(). Debería crear los parámetros necesarios en sqoop mediante programación como si fuera la línea de comando (por ejemplo, --connect, etc.).

Por favor, preste atención a lo siguiente:

  • Asegúrese de que el nombre de la herramienta Sqoop (por ejemplo, importación/exportación, etc.) es el primer parámetro.
  • Preste atención al pedido de classpath: la ejecución puede fallar porque sqoop requiere la versión X de una biblioteca y utiliza una versión diferente. Asegúrese de que las bibliotecas que requiere sqoop no se vean eclipsadas por sus propias dependencias. Me he encontrado con un problema con commons-io (sqoop requiere v1.4) y tenía una excepción NoSuchMethod ya que estaba usando commons-io v1.2.
  • Cada argumento debe estar en un elemento de matriz por separado. Por ejemplo, "--connect jdbc: mysql: ..." se debe pasar como dos elementos separados en el conjunto, no uno.
  • El analizador de sqoop sabe cómo aceptar los parámetros de doble cita, así que utilice comillas dobles si es necesario (sugiero siempre). La única excepción es el parámetro delimitado por campos que espera un único carácter, por lo que no lo cite por partida doble.
  • Sugiero dividir la lógica de creación de argumentos de línea de comandos y la ejecución real para que su lógica se pueda probar correctamente sin ejecutar realmente la herramienta.
  • Sería mejor utilizar el parámetro --hadoop-home, para evitar la dependencia del entorno.
  • La ventaja de Sqoop.runTool() frente a Sqoop.Main() es el hecho de que runTool() devuelve el código de error de la ejecución.

Espero que ayude.

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

RL

+0

gracias ... Estaba buscando Sqoop Docs en la red para ver los detalles de cada método ... pero no pude encontrarlo ... ¿me puede decir algo sobre los documentos de sqoop – pradeep

+0

Los documentos que he utilizado están en http: // archive.cloudera.com/cdh/3/sqoop/SqoopUserGuide.html#_controlling_the_hadoop_installation. Sin embargo, no describen ese método de ejecución de Sqoop. He usado el código fuente de Sqoop para eso, con la ayuda del proyecto oozie (http://incubator.apache.org/oozie/) –

+2

Oye si tuvieras un ejemplo de código ... eso ayudaría. –

0

Si conoce la ubicación del archivo ejecutable y los argumentos de la línea de comandos, puede usar un ProcessBuilder, esto puede ejecutarse por separado Process que Java puede supervisar para completar y devolver el código.

+0

En general, si hay un punto de integración api, es mejor usarlo que engendrar procesos secundarios. – Turbo

11

Encuentra debajo de un código de ejemplo para usar en Sqoop programa Java para importar datos de MySQL a HDFS/HBase. Asegúrese de que tiene frasco Sqoop en la ruta de clases:

 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 sugiere Harel, podemos utilizar la salida del método run() para el tratamiento de errores. Esperando que esto ayude.

0

Por favor, siga el código dado de Vikas que trabajó para mí y para incluir estos archivos jar en la ruta de clase e importar estos paquetes

com.cloudera.sqoop.SqoopOptions de importación; import com.cloudera.sqoop.tool.ImportTool;

Ref Bibliotecas

  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. hadoop
  6. commons-cli-1.2.jar/lib
  7. hadoop
  8. Commmons-io.2.1.jar/lib
  9. commons-configuración-1.6.jar hadoop/lib
  10. commons-lang-2.4.jar hadoop/lib
  11. hadoop Jackson-core-ASL-1.8.8.jar/lib
  12. Jackson-mapper-asl- 1.8.8.jar hadoop/lib
  13. commons-httpclient-3.0.1.jar hadoop/lib

biblioteca del sistema 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. juegos de caracteres, tarro 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

A veces obtienes un error si tu proyecto eclipse usa JDK1.6 y las bibliotecas que agregas son JDK1.7 para este caso configura JRE al crear un proyecto en eclipse.

Vikas si quiero poner los archivos importados en la colmena debería usar options.parameter ("--hive-import")?

2

Hay un truco que funcionó para mí bastante fácil. A través de ssh puede ejecutar el comando Sqoop directamente. Solo tiene que usar una biblioteca SSH Java

Tiene que seguir este paso.

descarga Biblioteca sshxcute java: https://code.google.com/p/sshxcute/ y añadirlo a la trayectoria de la estructura de su proyecto de Java que contiene el siguiente código de 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(); 
} 
} 
+0

funciona bien, pero el registro parece ser incorrecto. El trabajo de Sqoop se ejecuta con éxito y la consola muestra que el trabajo ha fallado. 'Compruebe si el éxito es ejecutivo o no ... Error de ejecución al ejecutar el comando: sqoop import --connect .... Mensaje de error: sras

Cuestiones relacionadas