क्या मोंगो डीबी में डेटा को स्थानांतरित करने के लिए एक सुरुचिपूर्ण, आसान और तेज़ तरीका है?हाइव से बाहर और मोंगोडीबी में डेटा को स्थानांतरित करने का सबसे प्रभावी तरीका क्या है?
उत्तर
आप Hadoop-MongoDB कनेक्टर के साथ निर्यात कर सकते हैं। बस अपने काम की मुख्य विधि में हाइव क्वेरी चलाएं। MongoDB
में डेटा डालने के लिए इस आउटपुट का उपयोग मैपर द्वारा किया जाएगा।
उदाहरण:
यहाँ मैं एक अर्धविराम विभाजित पाठ फ़ाइल डालने कर रहा हूँ (आईडी; firstname, lastname) एक MongoDB संग्रह के लिए एक सरल हाइव क्वेरी का उपयोग:
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;
import com.mongodb.hadoop.MongoOutputFormat;
import com.mongodb.hadoop.io.BSONWritable;
import com.mongodb.hadoop.util.MongoConfigUtil;
public class HiveToMongo extends Configured implements Tool {
private static class HiveToMongoMapper extends
Mapper<LongWritable, Text, IntWritable, BSONWritable> {
//See: https://issues.apache.org/jira/browse/HIVE-634
private static final String HIVE_EXPORT_DELIMETER = '\001' + "";
private IntWritable k = new IntWritable();
private BSONWritable v = null;
@Override
public void map(LongWritable key, Text value, Context context)
throws IOException, InterruptedException {
String [] split = value.toString().split(HIVE_EXPORT_DELIMETER);
k.set(Integer.parseInt(split[0]));
v = new BSONWritable();
v.put("firstname", split[1]);
v.put("lastname", split[2]);
context.write(k, v);
}
}
public static void main(String[] args) throws Exception {
try {
Class.forName("org.apache.hadoop.hive.jdbc.HiveDriver");
}
catch (ClassNotFoundException e) {
System.out.println("Unable to load Hive Driver");
System.exit(1);
}
try {
Connection con = DriverManager.getConnection(
"jdbc:hive://localhost:10000/default");
Statement stmt = con.createStatement();
String sql = "INSERT OVERWRITE DIRECTORY " +
"'hdfs://localhost:8020/user/hive/tmp' select * from users";
stmt.executeQuery(sql);
}
catch (SQLException e) {
System.exit(1);
}
int res = ToolRunner.run(new Configuration(), new HiveToMongo(), args);
System.exit(res);
}
@Override
public int run(String[] args) throws Exception {
Configuration conf = getConf();
Path inputPath = new Path("/user/hive/tmp");
String mongoDbPath = "mongodb://127.0.0.1:6900/mongo_users.mycoll";
MongoConfigUtil.setOutputURI(conf, mongoDbPath);
/*
Add dependencies to distributed cache via
DistributedCache.addFileToClassPath(...) :
- mongo-hadoop-core-x.x.x.jar
- mongo-java-driver-x.x.x.jar
- hive-jdbc-x.x.x.jar
HadoopUtils is an own utility class
*/
HadoopUtils.addDependenciesToDistributedCache("/libs/mongodb", conf);
HadoopUtils.addDependenciesToDistributedCache("/libs/hive", conf);
Job job = new Job(conf, "HiveToMongo");
FileInputFormat.setInputPaths(job, inputPath);
job.setJarByClass(HiveToMongo.class);
job.setMapperClass(HiveToMongoMapper.class);
job.setInputFormatClass(TextInputFormat.class);
job.setOutputFormatClass(MongoOutputFormat.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(Text.class);
job.setNumReduceTasks(0);
job.submit();
System.out.println("Job submitted.");
return 0;
}
}
एक दोष यह है कि इंटरमीडिएट हाइव आउटपुट को स्टोर करने के लिए 'स्टेजिंग एरिया' (/ उपयोगकर्ता/हाइव/टीएमपी) की आवश्यकता है। इसके अलावा जहां तक मुझे पता है कि मोंगो-हाडोप कनेक्टर अप्सर्ट का समर्थन नहीं करता है।
मैं काफी यकीन नहीं है लेकिन आप यह भी hiveserver
ताकि आप शायद कुछ भूमि के ऊपर बचा सकता है जो एक बचत सेवा को उजागर करता चलने के बिना Hive
से डेटा प्राप्त करने की कोशिश कर सकते हैं। हाइव की org.apache.hadoop.hive.cli.CliDriver#processLine(String line, boolean allowInterupting)
विधि का स्रोत कोड देखें जो वास्तव में क्वेरी निष्पादित करता है।
...
LogUtils.initHiveLog4j();
CliSessionState ss = new CliSessionState(new HiveConf(SessionState.class));
ss.in = System.in;
ss.out = new PrintStream(System.out, true, "UTF-8");
ss.err = new PrintStream(System.err, true, "UTF-8");
SessionState.start(ss);
Driver qp = new Driver();
processLocalCmd("SELECT * from users", qp, ss); //taken from CliDriver
...
साइड नोट: तो फिर तुम कुछ इस तरह एक साथ हैक कर सकते हैं
भी एक hive-mongo कनेक्टर कार्यान्वयन तुम भी जाँच कर सकते हैं नहीं है। के लिए एक समान कार्यान्वित करना चाहते हैं, तो कुछ विचार प्राप्त करने के लिए Hive-HBase कनेक्टर के कार्यान्वयन पर भी ध्यान देने योग्य है।
क्या आपने Sqoop देखा है? यह हैडोप और एसक्यूएल/नोएसक्यूएल डेटाबेस के बीच डेटा को स्थानांतरित करना बहुत आसान बनाना है। This article भी इसे हाइव के साथ उपयोग करने का एक उदाहरण देता है।
hadoop-MongoDB
कनेक्टर परियोजना पर एक नज़र डालें:
http://api.mongodb.org/hadoop/MongoDB%2BHadoop+Connector.html
"यह कनेक्टिविटी Hadoop की Hadoop (MapReduce नौकरियों में इस्तेमाल के लिए दोनों को पढ़ने MongoDB डेटा के साथ-साथ अन्य घटकों की अनुमति के रूप लेता है पारिस्थितिकी तंत्र), साथ ही साथ मोंडो डीबी के लिए हडोप नौकरियों के परिणाम लिखना। "
सुनिश्चित नहीं है कि यह आपके उपयोग के मामले के लिए काम करेगा, लेकिन यह देखने लायक है।
- 1. एनएसएससेट को सॉर्ट करने का सबसे प्रभावी तरीका क्या है?
- 2. विंडोज़ में पाइथन से दूसरे एप्लिकेशन में डेटा स्थानांतरित करने का सबसे अच्छा तरीका क्या है?
- 3. CMSampleBuffer सामग्री को संशोधित करने का सबसे प्रभावी तरीका
- 4. नेटवर्कएक्स में नोड को स्थानांतरित/नाम बदलने का सबसे प्रभावी तरीका क्या है?
- 5. स्ट्रीम से डेटा पढ़ने का सबसे प्रभावी तरीका
- 6. इंटरनेट पर डेटा स्थानांतरित करने का सबसे आसान तरीका, पायथन
- 7. "एचजी आयात" को संभालने का सबसे प्रभावी तरीका क्या है?
- 8. जावा से SQL सर्वर में थोक-प्रतिलिपि करने का सबसे प्रभावी तरीका क्या है?
- 9. ओपनजीएल में लाइनों का एक बड़ा सेट प्रबंधित करने का सबसे प्रभावी तरीका क्या है?
- 10. वैक्टर को सब्सट्रेट करने का सबसे प्रभावी तरीका
- 11. कोर डेटा में बड़ी संख्या (10.000+) ऑब्जेक्ट्स को हटाने का सबसे प्रभावी तरीका क्या है?
- 12. IE में जावास्क्रिप्ट/jQuery के साथ बड़े डेटासेट प्रबंधित करने का सबसे प्रभावी तरीका क्या है?
- 13. फोनेटिक खोज को लागू करने का सबसे प्रभावी तरीका
- 14. एकाधिक समान वस्तुओं को आकर्षित करने का सबसे प्रभावी तरीका?
- 15. लौटाए गए सरणी को इंडेक्स करने का सबसे प्रभावी तरीका?
- 16. कक्षा और विधि के नाम को लॉग करने का सबसे प्रभावी तरीका क्या है?
- 17. PHP में भाषा फ़ाइल करने का सबसे प्रभावी तरीका?
- 18. मोंगो में डेटा को सत्यापित करने का सबसे अच्छा तरीका क्या है?
- 19. पायथन में कई सबस्ट्रिंग्स में से एक को खोजने का सबसे प्रभावी तरीका क्या है?
- 20. MySQL में यूआरएल स्टोर करने का सबसे प्रभावी तरीका?
- 21. वीबीए (एक्सेल) में पंक्तियों के माध्यम से लूप करने का सबसे प्रभावी/तेज़ तरीका क्या है?
- 22. क्या WPF डेटा बाइंडिंग को प्रभावी रूप से डीबग करने का कोई तरीका है?
- 23. जे में हास्केल के फ़ोल्ड 1 को कार्यान्वित करने का सबसे प्रभावी तरीका क्या है?
- 24. एसक्यूएल डेटाबेस में पायथन शब्दकोश/सूचियों को सम्मिलित करने का सबसे प्रभावी तरीका क्या है?
- 25. डेटाबेस में एकल गैर-दोहराने वाले डेटा को स्टोर करने का सबसे अच्छा तरीका क्या है?
- 26. पायथन में एक पेड़ को पार करने का सबसे प्रभावी तरीका क्या है?
- 27. ओपनएल में वोक्सल्स (क्यूब्स) को आकर्षित करने का सबसे प्रभावी तरीका क्या है?
- 28. एक MySQL कॉलम में पूर्णांक की सरणी को स्टोर करने का सबसे प्रभावी तरीका क्या है?
- 29. क्या यह एनएसएआरएआरई से रिक्त स्ट्रिंग को हटाने का सही और सबसे प्रभावी तरीका है?
- 30. सूचियों को संयोजित करने का एक प्रभावी तरीका क्या है?
Sqoop केवल पल के लिए Hadoop और संबंधपरक डेटाबेस के बीच हस्तांतरण का समर्थन करता है: http://sqoop.apache.org/docs/1.4.2/SqoopUserGuide.html#_supported_databases –
रूप @Jp बॉन्ड ने बताया Sqoop JDBC के साथ इस्तेमाल किया जा सकता -कंपति डीबी, लेकिन मोंगोडीबी के लिए कोई जेडीबीसी समर्थन नहीं है: https://jira.mongodb.org/browse/JAVA-539 –