sqoop系列-sqoop MongoDB導入Hive方案

方案

最近數據異構的項目時需要將MongoDB的數據導入Hive數據倉庫中,總結了下,得出一下四種導入方案
1. mongoexport json文件導入
2. mongoexport csv文件導入
3. hive映射mongo庫
4. mongodump bson 導入


mongoexport json文件導入

缺點:mongo導出的json文件中,存在“$”符號,這在hive中無法識別

方案實現

  • 準備
    準備這個3個jar包,版本根據自己的hive版本選定。
    json-hive-schema-1.0-jar-with-dependencies.jar
    json-serde-1.3.8-jar-with-dependencies.jar
    json-udf-1.3.8-jar-with-dependencies.jar

  • 配置

    • 將json-serde-1.3.8-jar-with-dependencies.jar和json-udf-1.3.8-jar-with-dependencies.jar放到/data/cloudera/var/lib/hive下

    • 在Hive的 hive-site.xml 的 Hive 服務高級配置代碼段(安全閥) 中添加以下參數,以便在beeline中可執行admin的操作

<property>
    <name>hive.server2.authorization.external.exec</name>
    <value>true</value>
</property>
<property>
    <name>hive.security.authorization.enabled</name>
    <value>false</value>
</property>
<property>
    <name>hive.aux.jars.path</name>
    <value>/data/cloudera/var/lib/hive</value>
</property>
  • 步驟

    • 生成創建表的語句:java -jar json-hive-schema-1.0-jar-with-dependencies.jar students.dat(文件名) students_text1(表名)
    • 在hive命令行中:LOAD DATA LOCAL INPATH ‘/data/cloudera/students.dat’(數據文件) OVERWRITE INTO TABLE students_text1(導入的表)
  • 備註

    • 如導入數據時出現json格式不兼容,在創建表時可添加屬性:WITH SERDEPROPERTIES (“ignore.malformed.json” = “true”);
    • hive中無法支持$符號。
  • 參考
    https://github.com/rcongiu/Hive-JSON-Serde


mongoexport csv文件導入

缺點:mongo命令導出時無法指定分隔符,默認的分隔符“,”在數組列中無法分辨,導入時數據會出現錯亂

方案實現

  • 步驟

    • 使用mongo的工具導出csv文件,csv文件的分隔符不能使用“,”,因爲使用“,”時,導入數組列會識別錯;

    • 將csv文件寫入到HDFS中;

    • 創建Hive表:

CREATE EXTERNAL TABLE table (
`_id` string,
......
text string)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
WITH SERDEPROPERTIES (
"separatorChar" = "\;",
"quoteChar" = "'",
"escapeChar" = "\\"
)
STORED AS TEXTFILE
LOCATION '/user/hive/';

location不能與hdfs中的csv文件路徑一樣;
- 導入數據:LOAD DATA INPATH ‘/user/seewo/mongo.csv’ OVERWRITE INTO TABLE table;
- 使用select語句查看數據。Done!

  • 備註
    如使用mongoexport命令,無法指定csv文件的分隔符,需要寫js才能完成。

hive映射mongo庫

缺點: hive中無實體數據,如mongo數據丟失或無法訪問,hive就無法使用

方案實現

  • 準備
    準備這個3個jar包,版本根據自己的hive版本選定。
    mongo-hadoop-core-2.0.0.jar
    mongo-hadoop-hive-2.0.0.jar
    mongo-java-driver-3.4.2.jar

  • 步驟

    • 將mongo-hadoop-core-2.0.0.jar、mongo-hadoop-hive-2.0.0.jar和mongo-java-driver-3.4.2.jar放到/data/cloudera/var/lib/hive下,/data/cloudera/var/lib/hive是參數hive.aux.jars.path的值;

    • 在Hive中創建外部表,添加以下參數:

STORED BY 'com.mongodb.hadoop.hive.MongoStorageHandler'
WITH SERDEPROPERTIES('mongo.columns.mapping'='{"id":"_id"}') 
TBLPROPERTIES('mongo.uri'='mongodb://user:password@ip:port/db.collection');

例子:

CREATE EXTERNAL TABLE ep_class_student_performance_detail (
  `_id` string,
  app_key string,
  ......
  )
 STORED BY 'com.mongodb.hadoop.hive.MongoStorageHandler' 
 WITH SERDEPROPERTIES('mongo.columns.mapping'='{"id":"_id"}') 
 TBLPROPERTIES('mongo.uri'='mongodb://${ip}:${port}/${mongodb}.${mongo_collection}');

mongodump bson 導入

缺點:目前非沒發現缺點

方案實現

  • 準備
    準備一下3個jar包,版本根據hive和MongoDB版本選擇。
    mongo-hadoop-core-2.0.0.jar
    mongo-hadoop-hive-2.0.0.jar
    mongo-java-driver-3.4.2.jar
    將mongo-hadoop-core-2.0.0.jar、mongo-hadoop-hive-2.0.0.jar和mongo-java-driver-3.4.2.jar放到/data/cloudera/var/lib/hive下,/data/cloudera/var/lib/hive是參數hive.aux.jars.path的值

  • 步驟

    • 生成bson文件:mongodump -h host -d db -c collectio -o output_file,例子:
mongodump -h ${ip}:${port} -d ${db} -c ${collection} -o /data/cloudera/mongodump;
  • 將bson文件放入HDFS中:hdfs dfs -put output_file hdfs_file_path,例子:
hdfs dfs -put /data/cloudera/mongodump/${db}/${collection}.bson /user/hive/;
  • 創建Hive表:
CREATE TABLE ${table_name} (
`_id` string,
......
value int)
row format serde 'com.mongodb.hadoop.hive.BSONSerDe'
with serdeproperties('mongo.columns.mapping'='{"id":"_id"}')
stored as inputformat 'com.mongodb.hadoop.mapred.BSONFileInputFormat'
outputformat 'com.mongodb.hadoop.hive.output.HiveBSONFileOutputFormat'
location '/user/hive/';
  • 使用select語句查看數據。Done!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章