2012-09-09 11 views

उत्तर

2

आप 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 कनेक्टर के कार्यान्वयन पर भी ध्यान देने योग्य है।

1

क्या आपने Sqoop देखा है? यह हैडोप और एसक्यूएल/नोएसक्यूएल डेटाबेस के बीच डेटा को स्थानांतरित करना बहुत आसान बनाना है। This article भी इसे हाइव के साथ उपयोग करने का एक उदाहरण देता है।

+1

Sqoop केवल पल के लिए Hadoop और संबंधपरक डेटाबेस के बीच हस्तांतरण का समर्थन करता है: http://sqoop.apache.org/docs/1.4.2/SqoopUserGuide.html#_supported_databases –

+0

रूप @Jp बॉन्ड ने बताया Sqoop JDBC के साथ इस्तेमाल किया जा सकता -कंपति डीबी, लेकिन मोंगोडीबी के लिए कोई जेडीबीसी समर्थन नहीं है: https://jira.mongodb.org/browse/JAVA-539 –

1

hadoop-MongoDB कनेक्टर परियोजना पर एक नज़र डालें:

http://api.mongodb.org/hadoop/MongoDB%2BHadoop+Connector.html

"यह कनेक्टिविटी Hadoop की Hadoop (MapReduce नौकरियों में इस्तेमाल के लिए दोनों को पढ़ने MongoDB डेटा के साथ-साथ अन्य घटकों की अनुमति के रूप लेता है पारिस्थितिकी तंत्र), साथ ही साथ मोंडो डीबी के लिए हडोप नौकरियों के परिणाम लिखना। "

सुनिश्चित नहीं है कि यह आपके उपयोग के मामले के लिए काम करेगा, लेकिन यह देखने लायक है।

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

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