web-dev-qa-db-fra.com

Comment utiliser Sqoop dans le programme Java?

Je sais comment utiliser sqoop en ligne de commande. Mais ne savez pas comment appeler la commande sqoop à l'aide de programmes Java. Quelqu'un peut-il donner une vue de code?

22
pradeep

Vous pouvez exécuter sqoop depuis votre code Java en incluant le fichier jar sqoop dans votre chemin de classe et en appelant la méthode Sqoop.runTool(). Vous devez créer les paramètres requis dans sqoop par programme, comme s'il s'agissait de la ligne de commande (par exemple, --connect, etc.).

S'il vous plaît prêter attention à ce qui suit:

  • Assurez-vous que le nom de l'outil sqoop (par exemple, import/export, etc.) est le premier paramètre.
  • Faites attention à l'ordre des chemins de classes - L'exécution peut échouer car sqoop requiert la version X d'une bibliothèque et que vous utilisez une version différente. Vérifiez que les bibliothèques requises par sqoop ne sont pas éclipsées par vos propres dépendances. J'ai rencontré un tel problème avec commons-io (sqoop requiert la v1.4) et j'avais une exception NoSuchMethod puisque j'utilisais commons-io v1.2.
  • Chaque argument doit figurer sur un élément de tableau distinct. Par exemple, "--connect jdbc: mysql: ..." doit être passé comme deux éléments distincts du tableau, pas un.
  • L'analyseur sqoop sait accepter les paramètres entre guillemets, utilisez donc des guillemets si vous en avez besoin (je suggère toujours). La seule exception à cette règle est le paramètre champs-délimitées par qui attend un seul caractère. Ne le doublez donc pas.
  • Je suggérerais de scinder la logique de création des arguments de ligne de commande et l'exécution réelle afin que votre logique puisse être testée correctement sans exécuter l'outil.
  • Il serait préférable d’utiliser le paramètre --hadoop-home afin d’éviter toute dépendance à l’environnement.
  • L'avantage de Sqoop.runTool() par rapport à Sqoop.Main() est le fait que runTool() renvoie le code d'erreur de l'exécution.

J'espère que cela pourra aider.

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

RL

22
Harel Ben Attia

Trouvez ci-dessous un exemple de code d'utilisation de sqoop dans Java. Programme d'importation de données de MySQL vers HDFS/HBase. Assurez-vous d'avoir sqoop jar dans votre chemin de classe:

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

Comme suggéré par Harel, nous pouvons utiliser le résultat de la méthode run () pour la gestion des erreurs. En espérant que cela aide.

12
VikasG

Il y a un truc qui a fonctionné assez facilement pour moi. Via ssh, vous pouvez exécuter la commande Sqoop directement. Vous devez juste utiliser une bibliothèque Java SSH

Vous devez suivre cette étape.

Téléchargez la bibliothèque sshxcute Java: https://code.google.com/p/sshxcute/ Et ajoutez-la au chemin de génération de votre projet Java contenant le code Java suivant

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();   
}
}
3
vineetv2821993

S'il vous plaît suivez le code donné par vikas cela a fonctionné pour moi et inclure ces fichiers jar dans classpath et importer ces paquets 

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

Bibliothèques Ref 

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

Bibliothèque système 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. jeux de caractères, 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

Parfois, vous obtenez une erreur si votre projet Eclipse utilise JDK1.6 et que les bibliothèques que vous ajoutez sont JDK1.7 pour ce cas configurez JRE lors de la création de projet dans Eclipse. 

Vikas si je veux mettre les fichiers importés dans Hive, dois-je utiliser options.parameter ("--Hive-import")? 

0
timma

Si vous connaissez l'emplacement de l'exécutable et les arguments de la ligne de commande, vous pouvez utiliser une variable ProcessBuilder. Cette dernière peut alors être exécutée avec une variable Process distincte que Java peut surveiller pour obtenir un code d'achèvement et de retour.

0
cdc