背景:
公司核心業務庫現存在MongoDB中,分布在6台MongoDB節點。現面臨如下問題:
1.最大的一張表有10多個G,MongoDB在查詢方面尚能勝任,但是涉及到復雜計算時會比較吃力。
2.MongoDB中有三張表,分別記錄了最終用戶在三個不同系統(電話,游戲,桌牌等)的行為,需要按用戶匯聚成一張表。
考慮到MongoDB集成Hadoop來獲得計算能力,先要讓hadoop能訪問到MongoDB中數據,下面討論各個方案:

一)一個不安全的方案--MongoDB-connector for hadoop
支持通過Hive建表直接訪問MongoDB中的數據:
CREATE TABLE default.caller_intent ( id STRING merchantId INT, effective BOOLEAN, level STRING, status STRING, canceled BOOLEAN, levelId INT, sendMsg BOOLEAN ) STORED BY 'com.mongodb.hadoop.hive.MongoStorageHandler' WITH SERDEPROPERTIES('mongo.columns.mapping'='{"id":"_id"}') TBLPROPERTIES('mongo.uri'='mongodb://root:changme@10.1.1.1:27017/caller.caller_intent');
問題:
1)mongo數據庫需要暴露密碼給hadoop平台,兩個平台是不同團隊維護。
2)hadoop對mongo的操作是難以預料的,在不當時間內做不當操作可能會影響mongodb負載。
如果你的團隊沒有這樣的問題,可以考慮這個方案。
二)一個好想法,但只是“想法”--MongoDB-oplog同步到hadoop
通過oplog來同步數據是一個好想法,不過目前沒有好的工具包支持同步到Hive(倒是有同步到solr和ElasticSearch的),自己開發成本太高,作罷。
三)一個可行方案:寫入MongoDB的同時寫入到kafka,然后通過flume到HDFS。
問題:
在這個方案施行以前的歷史數據需要手動導入。
四)另一個想法:另建一個備MongoDB集群同步主集群數據,hadoop平台擁有該備Mongo集群權限。
問題:增加一台服務器資源,卻只是為了安全的考慮,成本-效益不高。

