2012-02-10 10 views
19

मुझे पता है कि कमांड लाइन के माध्यम से sqoop का उपयोग कैसे करें। लेकिन जावा प्रोग्राम का उपयोग करके sqoop कमांड को कॉल करने के बारे में नहीं पता। क्या कोई भी कुछ कोड दृश्य दे सकता है?जावा प्रोग्राम में स्क्वाप का उपयोग कैसे करें?

+1

Runtime.exec (आदेश); क्या आप यही खोज रहे हैं? Http: //docs.oracle.com/javase/1.5.0/docs/api/java/lang/Runtime.html – kosa

उत्तर

18

आप अपने क्लासपाथ में स्क्वाप जार समेत अपने जावा कोड के अंदर से स्कूप चला सकते हैं और Sqoop.runTool() विधि को कॉल कर सकते हैं। प्रोग्रामिंग के रूप में आपको आवश्यक पैरामीटर बनाना होगा जैसे कि यह कमांड लाइन था (उदा। --connect इत्यादि)।

कृपया निम्नलिखित पर ध्यान देना:

  • सुनिश्चित करें कि sqoop उपकरण नाम (उदाहरण के आयात/निर्यात आदि) पहले पैरामीटर है।
  • क्लासपाथ ऑर्डरिंग पर ध्यान दें - निष्पादन विफल हो सकता है क्योंकि sqoop को लाइब्रेरी के संस्करण X की आवश्यकता होती है और आप एक अलग संस्करण का उपयोग करते हैं। सुनिश्चित करें कि जिन पुस्तकालयों को स्क्वाइप की आवश्यकता है, वे आपकी निर्भरताओं से प्रभावित नहीं हैं। मुझे कॉमन्स-आईओ (एसक्यूओपी को v1.4 की आवश्यकता है) के साथ ऐसी समस्या का सामना करना पड़ा है और जब मैं कॉमन्स-आईओ v1.2 का उपयोग कर रहा था तब से NoSuchMethod अपवाद था।
  • प्रत्येक तर्क को एक अलग सरणी तत्व पर होना आवश्यक है। उदाहरण के लिए, "- कनेक्ट करें jdbc: mysql: ..." को सरणी में दो अलग-अलग तत्वों के रूप में पारित किया जाना चाहिए, एक नहीं।
  • स्क्वाप पार्सर जानता है कि डबल-उद्धृत पैरामीटर कैसे स्वीकार करें, इसलिए यदि आपको आवश्यकता है तो डबल कोट्स का उपयोग करें (मैं हमेशा सुझाव देता हूं)। एकमात्र अपवाद फ़ील्ड-सीमित है-पैरामीटर द्वारा जो एक सिंगल की अपेक्षा करता है, इसलिए इसे डबल-कोट न करें।
  • मैं कमांड लाइन-तर्क निर्माण तर्क और वास्तविक निष्पादन को विभाजित करने का सुझाव दूंगा ताकि आपके तर्क को वास्तव में उपकरण चलाने के बिना ठीक से परीक्षण किया जा सके।
  • पर्यावरण पर निर्भरता को रोकने के लिए - हाडोप-होम पैरामीटर का उपयोग करना बेहतर होगा।
  • Sqoop.runTool() का लाभ Sqoop.Main() के विपरीत यह तथ्य है कि runTool() निष्पादन के त्रुटि कोड को वापस कर दें।

आशा है कि मदद करता है।

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

आर एल

+0

धन्यवाद ... मैं प्रत्येक विधि के विवरण देखने के लिए नेट पर स्क्वाप डॉक्स की खोज कर रहा था ... लेकिन नहीं मिला .... क्या आप मुझे स्कूप डॉक्स – pradeep

+0

के बारे में बता सकते हैं जो दस्तावेज़ मैंने उपयोग किए हैं http: // archive.cloudera.com/cdh/3/sqoop/SqoopUserGuide.html#_controlling_the_hadoop_installation। हालांकि, वे स्क्वाप निष्पादित करने की विधि का वर्णन नहीं करते हैं। मैंने उस के लिए एसक्यूओपी स्रोत कोड का उपयोग किया है, ओजी परियोजना से कुछ मदद के साथ (http://incubator.apache.org/oozie/) –

+2

अरे अगर आपके पास कोड उदाहरण था..यह मदद करेगा। –

0

आप निष्पादन के स्थान और आदेश पंक्ति तर्क आप एक ProcessBuilder उपयोग कर सकते हैं पता है, यह तो एक अलग Process कि जावा पूरा करने के लिए पर नजर रखने और लौट कोड कर सकते हैं चलाया जा सकता है।

+0

आम तौर पर यदि एपीआई एकीकरण बिंदु है, तो इसका उपयोग करना बेहतर होगा बाल प्रक्रियाओं को दूर करने से पहले। – Turbo

11

HDFS/HBase के लिए MySQL से डेटा आयात करने के लिए जावा कार्यक्रम में sqoop प्रयोग करने के लिए एक नमूना कोड नीचे का पता लगाएं। सुनिश्चित करें कि आप अपने classpath में sqoop जार किया हुआ है:

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

हारेल ने सुझाव दिया रूप में, हम त्रुटि से निपटने के लिए विधि रन() के उत्पादन में उपयोग कर सकते हैं। उम्मीद है कि यह मदद करता है।

0

विकास यह मेरे लिए काम किया द्वारा दिए गए कोड का पालन करें और classpath में इन जार फ़ाइलों में शामिल हैं और इन पैकेजों

आयात com.cloudera.sqoop.SqoopOptions आयात करें; आयात com.cloudera.sqoop.tool आयात करें।ImportTool;

रेफरी पुस्तकालय

  1. Sqoop-1.4.4 जार/sqoop
  2. ojdbc6.jar/sqoop/lib (ओरेकल के लिए)
  3. कॉमन्स-प्रवेश-1.1.1.jar Hadoop/lib
  4. Hadoop कोर-1.2.1.jar/Hadoop
  5. कॉमन्स-CLI-1.2.jar Hadoop/lib
  6. commmons-io.2.1.jar Hadoop/lib
  7. कॉमन्स-विन्यास-1.6.jar Hadoop/lib
  8. कॉमन्स-lang-2.4.jar Hadoop/lib
  9. जैक्सन कोर-ASL-1.8.8.jar Hadoop/lib
  10. जैक्सन-नक्शाकार-asl- 1.8.8.jar Hadoop/lib
  11. कॉमन्स-httpclient-3.0.1.jar Hadoop/lib

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

कभी-कभी आपको त्रुटि मिलती है यदि आपकी ग्रहण परियोजना जेडीके 1.6 का उपयोग कर रही है और आपके द्वारा जोड़े गए पुस्तकालय JDK1.7 हैं, इस मामले के लिए ग्रहण में परियोजना बनाते समय जेआरई को कॉन्फ़िगर करें।

विकास अगर मैं आयातित फ़ाइलों को छिद्र में रखना चाहता हूं तो क्या मुझे विकल्प का उपयोग करना चाहिए .parameter ("--hive-import")?

2

एक चाल है जो मेरे लिए बहुत आसान काम करती है। एसएसआई के माध्यम से आप सीधे स्क्वाप कमांड निष्पादित कर सकते हैं। बस आपको एक एसएसएच जावा लाइब्रेरी

का उपयोग करना है, आपको इस चरण का पालन करना होगा।

डाउनलोड sshxcute जावा पुस्तकालय: https://code.google.com/p/sshxcute/ और यह अपने जावा परियोजना के निर्माण पथ जो निम्नलिखित जावा कोड शामिल में जोड़े

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

ठीक काम कर रहा है, लेकिन लॉग गलत लगता है। स्क्वाप नौकरी सफलतापूर्वक निष्पादित की जाती है और कंसोल गलत दिखा रहा है कि नौकरी विफल रही है। 'जांच करें कि निष्पादन सफलता है या नहीं ... कमांड निष्पादित करते समय निष्पादन विफल: sqoop import --connect .... त्रुटि संदेश: sras

संबंधित मुद्दे