標籤:環境變數   com   表名   資料庫伺服器   擷取   使用者密碼   ring   sts   一個   
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(二)