Mongodb同步資料到hive(二)

來源:互聯網
上載者:User

標籤:環境變數   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(二)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.