記一次實際sqoop業務的理解(註釋多)

最近梳理一項sqoop業務,整理如下(儘可能詳細註釋,表名,IP,賬戶密碼,以及實際代碼都做了處理,當作demo看完全可以的,可運行):


1、mysql -> hive(創建任務->執行任務)

  • 創建用戶任務腳本createUserJob.sh內容如下:
  • -
sqoop job --delete sqoop_job_1
sqoop job --create sqoop_job_1 -- import 
--connect jdbc:mysql://(mysql服務器ip):3307/ucenter 
--table mysql_table --columns "c_id,c_company_name" -m 1 
--username test --password test --fields-terminated-by '\0001' 
--hive-drop-import-delims --null-string '\\N' 
--null-non-string '\\N' --hive-import  
--hive-overwrite --hive-table hive_table 
-- --default-character-set=utf-8

解釋:

創建導入任務 sqoop_job,連接mysql測試用戶下的ucenter庫mysql_table表的”c_id,c_company_name”字段,開啓一個map進程,分隔符使用hive官方默認模式”/0001”,刪除數據中自帶的/r,/n,/01等符號。字符型非字符型空值(NULL)都設置爲”\N”,數據插入到hive中使用hive默認分隔符,開始導入hive,重寫到表hive_table中,寫入編碼方式爲utf-8。

  • 創建用戶任務腳本importUserData.sh內容如下:

sqoop job –exec sqoop_job_1

解釋:
與任務對應,直接在linux下執行,執行完畢使用sqoop job -list查看任務列表。


  • 全量導入
    創建用戶任務腳本scheduler-full_info.sh內容如下:


 #!/bin/bash 
>  sql=$(cat << !EOF  
>  USE bdw; 
>  DROP TABLE IF EXISTS hive_table;
> CREATE EXTERNAL TABLE hive_table(id string,areacode string) 
>  row format delimited   
>  fields terminated by '\t'  
>  stored as textfile;
> 
> insert overwrite hive_table select id,areacode,
> from_unixtime(unix_timestamp(update_time,'EEE MMM dd HH:mm:Ss z
> yyyy'),'yyyy-MM-dd HH:mm:ss') as n_update_time from mysql_table  where
> substr(from_unixtime(unix_timestamp(update_time, 'EEE MMM dd HH:mm:Ss
> z yyyy'),'yyyy-MM-dd HH:mm:ss'),1,10)!=
> date_sub(from_unixtime(unix_timestamp(),'yyyy-MM-dd'),1) or
> update_time is null; !EOF)
>  `$HIVE_HOME/bin/hive -e "$sql"` 
> 
> exitCode=$? 
> if [ $exitCode -ne 0 ];then
    echo "[ERROR] hive execute failed!"
>          exit $exitCode 
> fi

解釋:

EOF,即:END OF FILE(文件結束)
命令 << EOF 內容段 EOF,即:將“內容段”整個作爲命令的輸入不一定要用EOF也可以用比如!EOF或者其他內容段中沒有出現過的字符。
命令解釋:用cat命令讀入整段字符串並賦值給sql變量。
DROP TABLE IF EXISTS hive_table;, 如果hive表已經存在就刪除。
CREATE EXTERNAL TABLE hive_table創建託管表 hive_table(各字段值),行分隔符爲”\t”,存儲爲文本格式。
$HIVE_HOME/bin/hive -e "$sql",hive執行sql。

  • 增量導入
    創建用戶任務腳本scheduler-increment_info.sh內容如下

> #!/bin/bash 
> sql=$(cat << !EOF
> insert into table hive_table select id,areacode,
> from_unixtime(unix_timestamp(update_time,'EEE MMM
> dd HH:mm:Ss z yyyy'),'yyyy-MM-dd HH:mm:ss')
>  as n_update_time from
> company_business_info  where
> substr(from_unixtime(unix_timestamp(update_time,'EEE MMM dd HH:mm:Ss z
> yyyy'),'yyyy-MM-dd HH:mm:ss'),1,10)
> =date_sub(from_unixtime(unix_timestamp(),'yyyy-MM-dd'),1); 
> !EOF)
> 
> $HIVE_HOME/bin/hive -e $sql
> exitCode=$? 
> if [ $exitCode -ne 0 ];then
>    echo "[ERROR] hive execute failed!"
>    exit $exitCode 
> fi

解釋:

substr(from_unixtime(unix_timestamp(update_time,’EEE MMM dd HH:mm:Ss z yyyy’),’yyyy-MM-dd HH:mm:ss’),1,10)
即:
unix_timestamp(),返回自1970-1-1 8:00:00開始到當前系統時間爲止的秒數;
from_unixtime(unixtime),返回unix時間到系統時間(“1970-1-1 8:00:00”這種形式);
substr(),substr(string string,num start,num length);string爲字符串;start爲起始位置(mysql中從1開始),length爲字符串長度;
exitCode=\$?
$?”,即:最後一次執行命令的退出狀態返回碼,0表示全部執行,1~255表示有錯誤。
if [ $exitCode -ne 0 ];then
echo "[ERROR] hive execute failed!"
exit $exitCode
fi

即:if/then結構測試,不僅可以測試狀態,還可以測試任何命令。”-ne”表示不等於。

2、mysql->hive(創建本地表 -> 執行導出任務)

  • 創建本地表

DROP TABLE IF EXISTS mysql_table;
CREATE TABLE mysql_table (
date varchar(255) DEFAULT NULL COMMENT ‘時間’,
region_code varchar(255) DEFAULT NULL COMMENT ‘區域’,
KEY date (date) USING BTREE,
KEY region (region_code) USING BTREE,
KEY version (version) USING BTREE,
KEY site (site) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

舉個建數據庫表的demo。

  • 執行導出任務

sqoop export –connect jdbc:mysql://(數據庫服務器ip):3306/data_analyses
–username test –password test –table d_service_unit
–export-dir /user/hive/warehouse/edw.db/d_service_unit
–input-fields-terminated-by ‘\001’ –input-null-string ‘\N’ –input-null-non-string ‘\N’

解釋:
export -dir /user/hive/warehouse/edw.db/d_service_unit 爲導出路徑。其他參數參考導出到hive表。


至此階段性結束,學無止境。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章