2012-02-10 16 views
19

Tôi biết cách sử dụng sqoop thông qua dòng lệnh. Nhưng không biết làm thế nào để gọi lệnh sqoop bằng cách sử dụng các chương trình java. Có ai có thể cung cấp một số chế độ xem mã không?Làm thế nào để sử dụng Sqoop trong Chương trình Java?

+1

Runtime.exec (lệnh); Có phải đó là những gì bạn đang tìm kiếm không? Http: //docs.oracle.com/javase/1.5.0/docs/api/java/lang/Runtime.html – kosa

Trả lời

18

Bạn có thể chạy sqoop từ bên trong mã java của bạn bằng cách bao gồm các bình sqoop trong classpath của bạn và gọi phương thức Sqoop.runTool(). Bạn sẽ phải tạo các tham số bắt buộc cho sqoop theo chương trình như thể đó là dòng lệnh (ví dụ: --connect v.v.).

Hãy chú ý đến những điều sau đây:

  • Hãy chắc chắn rằng tên công cụ sqoop (ví dụ nhập khẩu/xuất khẩu, vv) là tham số đầu tiên.
  • Chú ý đến thứ tự classpath - Việc thực thi có thể thất bại vì sqoop yêu cầu phiên bản X của thư viện và bạn sử dụng phiên bản khác. Đảm bảo rằng các thư viện mà sqoop yêu cầu không bị lu mờ bởi các phụ thuộc của riêng bạn. Tôi đã gặp phải một vấn đề như vậy với commons-io (sqoop yêu cầu v1.4) và đã có một ngoại lệ NoSuchMethod kể từ khi tôi đã sử dụng commons-io v1.2.
  • Mỗi đối số cần phải nằm trên một phần tử mảng riêng biệt. Ví dụ: "--connect jdbc: mysql: ..." phải được chuyển thành hai phần tử riêng biệt trong mảng, không phải là một phần tử.
  • Trình phân tích cú pháp sqoop biết cách chấp nhận tham số được trích dẫn kép, vì vậy hãy sử dụng dấu ngoặc kép nếu bạn cần (tôi đề xuất luôn luôn). Ngoại lệ duy nhất là tham số trường được phân cách bởi tham số mong đợi một char duy nhất, do đó, đừng trích dẫn kép nó.
  • Tôi muốn đề xuất tách logic tạo đối số dòng lệnh và thực thi thực tế để logic của bạn có thể được kiểm tra đúng cách mà không thực sự chạy công cụ.
  • Sẽ tốt hơn nếu sử dụng tham số --hadoop-home để ngăn chặn sự phụ thuộc vào môi trường.
  • Lợi thế của Sqoop.runTool() thay vì Sqoop.Main() là sự kiện runTool() trả lại mã lỗi của quá trình thực hiện.

Hy vọng điều đó sẽ hữu ích.

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

RL

+0

cảm ơn ... Tôi đã tìm kiếm tài liệu Sqoop trên mạng để xem chi tiết của từng phương pháp ... nhưng không thể tìm thấy .... bạn có thể cho tôi biết về tài liệu sqoop – pradeep

+0

Tài liệu tôi đã sử dụng có trong http: // không archive.cloudera.com/cdh/3/sqoop/SqoopUserGuide.html#_controlling_the_hadoop_installation. Tuy nhiên, chúng không mô tả phương thức thực thi Sqoop. Tôi đã sử dụng mã nguồn Sqoop cho điều đó, với một số trợ giúp từ dự án oozie (http://incubator.apache.org/oozie/) –

+2

Xin chào, nếu bạn có một ví dụ mã..điều đó sẽ hữu ích. –

0

Nếu bạn biết vị trí của tệp thực thi và đối số dòng lệnh bạn có thể sử dụng ProcessBuilder, thì sau đó có thể chạy riêng Process mà Java có thể theo dõi để hoàn thành và trả về mã.

+0

Nói chung nếu có điểm tích hợp api, tốt hơn nên sử dụng hơn là sinh ra các tiến trình con. – Turbo

11

Tìm dưới một mẫu mã cho việc sử dụng sqoop trong Chương trình Java để nhập dữ liệu từ MySQL sang HDFS/HBase. Hãy chắc chắn rằng bạn có sqoop jar trong classpath của bạn:

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

Như đề xuất của Harel, chúng ta có thể sử dụng đầu ra của phương thức run() để xử lý lỗi. Hy vọng điều này sẽ giúp.

0

Hãy làm theo mã do vikas nó làm việc cho tôi và bao gồm các tập tin jar trong classpath và nhập khẩu những gói

com.cloudera.sqoop.SqoopOptions nhập khẩu; nhập com.cloudera.sqoop.tool.ImportTool;

Ref Libraries

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

JRE thư viện hệ thống

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. bộ ký tự, 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

Đôi khi bạn gặp lỗi nếu dự án eclipse của bạn đang sử dụng JDK1.6 và các thư viện bạn thêm là JDK1.7 cho trường hợp này cấu hình JRE khi tạo dự án trong nhật thực.

Vikas nếu tôi muốn đặt các tệp đã nhập vào tổ ong, tôi có nên sử dụng tùy chọn.parameter ("--hive-import") không?

2

Có một mẹo làm việc cho tôi khá dễ dàng. Thông qua ssh bạn có thể thực hiện lệnh Sqoop trực tiếp. Chỉ cần bạn phải sử dụng là Thư viện Java SSH

Bạn phải làm theo bước này.

Tải sshxcute java thư viện: https://code.google.com/p/sshxcute/ và Thêm nó vào việc xây dựng con đường của dự án java của bạn mà có chứa mã java sau

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

hoạt động tốt, nhưng nhật ký có vẻ không chính xác. Công việc Sqoop được thực thi thành công và giao diện điều khiển hiển thị sai khi công việc thất bại. 'Kiểm tra xem exec có thành công hay không ... Thực hiện không thành công khi thực thi lệnh: sqoop import --connect .... Thông báo lỗi: sras