example - ¿Cómo usar Sqoop en el programa Java?
sqoop mysql (5)
Si conoce la ubicación del ejecutable y los argumentos de la línea de comando, puede usar un ProcessBuilder
, esto luego puede ejecutarse en un Process
separado que Java puede monitorear para completar y devolver el código.
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?
Encuentre a continuación un código de muestra para usar sqoop en el programa Java para importar datos de MySQL a HDFS / HBase. Asegúrate de tener el jar de sqoop en tu 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 sugiere Harel, podemos usar el resultado del método run () para el manejo de errores. Esperando que esto ayude.
Por favor, siga el código dado por vikas que funcionó para mí e incluya estos archivos jar en classpath e importe estos paquetes
import com.cloudera.sqoop.SqoopOptions; import com.cloudera.sqoop.tool.ImportTool;
Ref Bibliotecas
- Sqoop-1.4.4 jar / sqoop
- ojdbc6.jar / sqoop / lib (para oráculo)
- commons-logging-1.1.1.jar hadoop / 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 hadoop / 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 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. 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
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, ¿debo usar options.parameter ("--hive-import")?
Hay un truco que funcionó para mí bastante fácil. A través de ssh puede ejecutar el comando Sqoop directamente. Solo tienes que usar es una biblioteca SSH Java
Tienes que seguir este paso.
Descargue la biblioteca sshxcute java: https://code.google.com/p/sshxcute/ y agréguela a la ruta de compilación de su proyecto java que contiene el siguiente 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();
}
}
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 ej., --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.) sea 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 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 solo carácter, por lo tanto, no lo haga doblemente.
- Sugeriría dividir la lógica de creación de argumentos de línea de comandos y la ejecución real para que su lógica pueda probarse adecuadamente 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()
en comparación conSqoop.Main()
es el hecho de querunTool()
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