Mongodb同步數據到hive(二)
Mongodb同步數據到hive(二)
1、 概述
上一篇文章主要介紹了mongodb-based,通過直連mongodb的方式進行數據映射來進行數據查詢,但是那種方式會對線上的數據庫產生影響,所以今天介紹第二種方式—BSON-based,即使用mongoexport將所需要的表導出到本地文件,文件個是默認為bson。然後將導出的bson文件put到HDFS文件系統裏面,最後在hive裏面創建相應的表來使用hive sql進行查詢。
2、 導出文件
使用mongoexport命令,導出所需要的collection或字段。常用的命令如下:
1)#mongoexport -uhuoqiu -phuoqiuapp -h 127.0.0.1:27017 -d saturn -c mycol -o /root/data/mycol-`date +%F_%H-%M-%S`.json
!-u :指定用戶,用於備份的用戶必須對數據庫有讀的權限。
!-p: 指定用戶密碼
!-h:指定數據庫服務器ip和端口,例如:ip:port
!-d: 指定數據庫名稱
!-c: 指定要備份的collection的名稱
!-o:指定輸出的文件,
!--type: 指定輸出類型,默認為json格式。
2)備份某個collection裏面的某個字段
例如導出mycol裏面的id字段,導出為csv文件
#mongoexport -uhuoqiu -phuoqiuapp -h 127.0.0.1:27017 -d saturn -c mycol --type csv -f "id" -o /root/data/mycol-`date +%F_%H-%M-%S`.csv
! -d 數據庫名
! -c collection名
! -o 輸出的文件名
! --type 輸出的格式,默認為json
! -f 輸出的字段,如果--type為csv,則需要加上 -f "字段名"
!-q 過濾某個條件:例如:-q ‘{"function" : "test100"}‘
#mongoexport -h127.0.0.1:27017 -uhuoqiu -phuoqiuapp -d saturn -c mycol --csv -f id,function -q ‘{"function" : "test100"}‘ -o /root/data/oplog.rs-`date +%F_%H-%M-%S`.csv
3)如果mongodb與hadoop和hive是分開部署的,那麽需要在hadoop服務器上部署一個mongodb,此服務不用運行,只是為了使用mongoexport命令copy數據。
3、 將文件導入到HDFS
1)首先需要在HDFS裏面創建相應的目錄,用來存儲相應的表文件。
2)註意,每個表需要對應創建一個目錄
3)命令如下(我已經將hadoop的bin加到環境變量裏面了):
#hdfs dfs -mkdir /myjob
#hdfs dfs -mkdir /myjob/job1
!!註意,hdfs的目錄必須一級一級的創建,不能一次創建多級。
#將文件傳入到HDFS
#hdfs dfs -put /data/job1 /myjob/job1
@/data/job1 為本地路徑,即導出的mongodb的文件的路徑
@/myjob/job1 為HDFS的路徑
4)查看已經上傳到HDFS的文件
#hdfs dfs -ls /myjob/job1
5)修改權限
#hdfs dfs -chmod 777 /myjob/job1
6)獲取hdfs裏面的文件
#hdfs dfs –get /myjob/job1 /data/job1
7)刪除文件
#hdfs dfs -rm /myjob/job1
刪除目錄
#hdfs dfs -rm -r /myjob
Myjob目錄需要為空,如果要強制刪除非空目錄,需要加上-f。
4、 hive裏面創建表
#hive
hive>create table if not exists ${table_name}
(
Id string,
Userid string,
.
.
.
comment ‘描述’
row format serd ‘com.mongodb.hadoop.hive.BSONSerDe’
with serdeproperties(‘mongo.columns.mapping‘=‘{hive字段與mongo字段的映射關系}‘)
stored as inputformat ‘com.mongodb.hadoop.mapred.BSONFileInputFormat‘
outputformat ‘com.mongodb.hadoop.hive.output.HiveBSONFileOutputFormat‘
location ‘HDFS的目錄’
#location指示的是bson文件所在的HDFS目錄,即/myjob/job1.
5、為了方便使用,將導出mongodb到本地,並將文件導入到HDFS裏面。做了一個腳本。
#cat hdfs.sh
#!/bin/bash
#此腳本用於將mongodb裏面的collection到處為BSON文件,並將文件上傳到HDFS裏面
#定義要導出的表名
list="
merchants
martproducts
products
coupons
couponlogs
reviews
orderoplogs
orders
"
#判斷文件是否存在,存在則刪除
for i in $list
do
if [ -e /data/mongodata/$i ];then
rm -rf /data/mongodata/$i
sleep 5s
fi
done
#從mongodb導出數據到本地
for a in $list
do
nohup /data/mongodb/bin/mongoexport -utest -ptestpwd -h 192.168.1.11:27017 -d saturn -c $a -o /data/mongodata/$a >>/data/nohup.out 2>&1 &
#sleep 5m
done
#將HDFS裏面的文件刪除
for b in $list
do
nohup /data/hadoop-2.7.3/bin/hdfs dfs -rm /$b/$b >>/data/nohuprm.out 2>&1 &
done
#將本地的文件導入到HDFS裏面
for c in $list
do
/data/hadoop-2.7.3/bin/hdfs dfs -put /data/mongodata/$c /$c
sleep 1m
done
5、將腳本添加計劃任務,有兩種方式:一種是使用crontab;一種是使用jenkins。
1)使用crontab
#crontab -e
0 00 * * * /data/hdfs.sh 2>&1 &
2)使用jenkins
1、創建一個項目,名稱自己定義,
2、創建運行周期
3)執行
Mongodb同步數據到hive(二)