2012-04-01 36 views
7

Tóm tắt:

Có thể:Có thể đọc dữ liệu MongoDB, xử lý dữ liệu với Hadoop và xuất nó vào một RDBS (MySQL) không?

  1. nhập dữ liệu vào Hadoop với «MongoDB Connector cho Hadoop».
  2. Xử lý bằng Hadoop MapReduce.
  3. Xuất khẩu bằng Sqoop trong một giao dịch.

Tôi đang xây dựng một ứng dụng web với MongoDB. Trong khi MongoDB làm việc tốt cho hầu hết công việc, trong một số phần, tôi cần đảm bảo giao dịch mạnh hơn, mà tôi sử dụng cơ sở dữ liệu MySQL.

Vấn đề của tôi là tôi muốn đọc một bộ sưu tập MongoDB lớn để phân tích dữ liệu, nhưng kích thước của bộ sưu tập có nghĩa là công việc phân tích sẽ mất quá nhiều thời gian để xử lý. Thật không may, khung công tác giảm bản đồ tích hợp của MongoDB sẽ không hoạt động tốt cho công việc này, vì vậy tôi muốn thực hiện phân tích với Apache Hadoop.

Tôi hiểu rằng có thể đọc dữ liệu từ MongoDB vào Hadoop bằng cách sử dụng «MongoDB Connector for Hadoop», đọc dữ liệu từ MongoDB, xử lý nó với MapReduce trong Hadoop và cuối cùng đưa kết quả trở lại vào cơ sở dữ liệu MongoDB.

Vấn đề là tôi muốn đầu ra của MapReduce đi vào cơ sở dữ liệu MySQL, thay vì MongoDB, vì kết quả phải được hợp nhất với các bảng MySQL khác.

Vì mục đích này, tôi biết rằng Sqoop có thể xuất kết quả của một Hadoop MapReduce thành MySQL.

Cuối cùng, tôi muốn đọc dữ liệu MongoDB sau đó xử lý dữ liệu bằng Hadoop và cuối cùng xuất kết quả vào cơ sở dữ liệu MySQL.

Điều này có khả thi không? Những công cụ có sẵn để làm điều này?

+0

câu hỏi của bạn có thể được thực hiện rõ ràng hơn nhiều. Tôi không chắc chắn về những gì bạn đang cố gắng làm. Tôi sẽ chỉnh sửa câu hỏi của bạn để phản ánh những gì tôi nghĩ rằng bạn đang cố gắng để nói, nhưng làm rõ của bạn sẽ là hữu ích quá. – brice

+0

Tôi cập nhật câu hỏi của mình để làm rõ – paganotti

+0

có xem xét câu trả lời cập nhật của tôi, điều này sẽ giải thích cách bạn có thể làm những gì bạn đang yêu cầu. – brice

Trả lời

10

TL; DR: Đặt định dạng ngõ ra ghi vào một RDBs trong công việc Hadoop của bạn:

job.setOutputFormatClass(DBOutputFormat.class); 

Một số điều cần lưu ý:

  1. Xuất dữ liệu từ MongoDB đến Hadoop bằng Sqoop là không thể. Điều này là do Sqoop sử dụng JDBC cung cấp API cấp cuộc gọi cho cơ sở dữ liệu dựa trên SQL, nhưng MongoDB không phải là cơ sở dữ liệu dựa trên SQL. Bạn có thể xem «MongoDB Connector for Hadoop» để thực hiện công việc này. Đầu nối có sẵn on GitHub. (Chỉnh sửa: như bạn chỉ ra trong bản cập nhật của mình.)

  2. Xuất khẩu Sqoop không được thực hiện trong một giao dịch duy nhất theo mặc định. Thay vào đó, theo số Sqoop docs:

    Do Sqoop phá vỡ quy trình xuất thành nhiều giao dịch, có thể làm cho dữ liệu một phần được cam kết với cơ sở dữ liệu.Điều này có thể dẫn đến các công việc tiếp theo thất bại do chèn xung đột trong một số trường hợp hoặc dẫn đến dữ liệu trùng lặp ở những người khác. Bạn có thể khắc phục sự cố này bằng cách chỉ định bảng dàn theo tùy chọn --staging-table hoạt động như một bảng phụ được sử dụng cho dữ liệu xuất giai đoạn. Dữ liệu theo giai đoạn cuối cùng được chuyển đến bảng đích trong một giao dịch duy nhất.

  3. «MongoDB Connector for Hadoop» dường như không ép buộc luồng công việc bạn mô tả. Theo tài liệu:

    Kết nối này có dạng cho phép cả hai đọc dữ liệu MongoDB vào Hadoop (để sử dụng trong các công việc MapReduce), cũng như ghi kết quả công việc Hadoop ra MongoDB.

  4. Thật vậy, như xa như tôi hiểu từ «MongoDB Connector for Hadoop»: examples, nó sẽ có thể để xác định một org.apache.hadoop.mapred.lib.db.DBOutputFormat vào công việc Hadoop MapReduce của bạn để viết đầu ra vào một cơ sở dữ liệu MySQL. Theo ví dụ từ các kho lưu trữ kết nối:

    job.setMapperClass(TokenizerMapper.class); 
    job.setCombinerClass(IntSumReducer.class); 
    job.setReducerClass(IntSumReducer.class); 
    job.setOutputKeyClass(Text.class); 
    job.setOutputValueClass(IntWritable.class); 
    job.setInputFormatClass(MongoInputFormat.class); 
    /* Instead of: 
    * job.setOutputFormatClass(MongoOutputFormat.class); 
    * we use an OutputFormatClass that writes the job results 
    * to a MySQL database. Beware that the following OutputFormat 
    * will only write the *key* to the database, but the principle 
    * remains the same for all output formatters 
    */ 
    job.setOutputFormatClass(DBOutputFormat.class); 
    
0

tôi sẽ khuyên bạn hãy nhìn vào Apache Pig (chạy trên đầu trang của Hadoop của bản đồ giảm). Nó sẽ xuất ra MySql (không cần sử dụng Scoop). Tôi đã sử dụng nó để làm những gì bạn mô tả. Có thể làm một "upsert" với Pig và MySql. Bạn có thể sử dụng lệnh STORE của Pig với DBStorage của piggyBank và INSERT DUPLICATE KEY UPDATE (http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html) của MySql.

0

Sử dụng trình kết nối MongoHadoop để đọc dữ liệu từ MongoDB và xử lý dữ liệu bằng cách sử dụng Hadoop.

Link: https://github.com/mongodb/mongo-hadoop/blob/master/hive/README.md

Sử dụng kết nối này, bạn có thể sử dụng Pig và Hive để đọc dữ liệu từ Mongo db và xử lý nó bằng cách sử Hadoop.

Ví dụ về bảng Mongo Hive:

CREATE EXTERNAL TABLE TestMongoHiveTable 
    ( 
    id STRING, 
    Name STRING 
    ) 
    STORED BY 'com.mongodb.hadoop.hive.MongoStorageHandler' 
    WITH SERDEPROPERTIES('mongo.columns.mapping'='{"id":"_id","Name":"Name"}') 
    LOCATION '/tmp/test/TestMongoHiveTable/' 
    TBLPROPERTIES('mongo.uri'='mongodb://{MONGO_DB_IP}/userDetails.json'); 

Sau khi nó được xuất khẩu sang hive bảng bạn có thể sử dụng Sqoop hoặc lợn để xuất dữ liệu để mysql.

Đây là luồng.

Mongo DB -> Xử lý dữ liệu bằng kết nối Hadoop Mongo DB (Pig) -> Lưu trữ nó vào bảng hive/HDFS -> Xuất dữ liệu sang mysql bằng sqoop.

Các vấn đề liên quan