oracle表增量同步到hive分区表

本文以shell脚本,通过传参的的形式,将服务器ip,oracle的库名表名以及作为分区字段的字段名称,hive的库名,表名作为参数传入,这样可以做到灵活变更,提高通用性与方便性,通过定时器调度此脚本即可。

脚本包含三步:

   一:通过sqoop将oracle数据导入到hive临时表,临时表需创建,无分区表

   二:将hive临时表数据insert到hive正式表,以传入的分区字段作为分区,此脚本中分区有 年xxxx,月xxxx-xx,日xxxx-xx-xx

   三:因为我有用到impala,所以在第三步加上了impala刷新操作,如不刷新,impala将识别不到新增hive数据   

#!/bin/bash
#

# import table from oracle into hive

nargs=$#
echo "argument num: $nargs "

today=`date +%Y-%m-%d`
one_day=`date +%Y-%m-%d -d'-1 day'`
coll_db=''
coll_tab=''
coll_host_ip=''
coll_host_port=1521
coll_tab_username=''
coll_tab_passwd=''

hive_db=''
hive_tab=''
#hive_tab_cols=''
hive_map_cols=''

start_dt=''
end_dt=''

pt_col='' 

/usr/bin/kinit -kt /opt/yarn.keytab yarn

# argument parse
argParse()
{
    echo "argument num: $nargs "

    for ag in $@
    do
    #    echo $ag
        arg_key=${ag%=*}
        arg_val=${ag#*=}
#        echo "${ag%=*}--- ${ag#*=}"        
#        echo "$arg_key---- $arg_val"
        case ${arg_key} in
            "coll_host_ip")     coll_host_ip=$arg_val    ;;
            "coll_db")         coll_db=$arg_val    ;;
            "coll_tab")         coll_tab=$arg_val    ;;
            "hive_db")         hive_db=$arg_val    ;;
            "hive_tab")         hive_tab=$arg_val    ;;
            #"hive_tab_cols")     hive_tab_cols=$arg_val    ;;
            "hive_map_cols")     hive_map_cols=$arg_val    ;;
            "start_dt")         start_dt=$arg_val    ;;
            "end_dt")         end_dt=$arg_val    ;;
            "pt_col")         pt_col=$arg_val    ;;
        esac
    done
}

# parse the arguments key:value paire
argParse $@
# pring argument
printArgs()
{
    echo "coll_host_ip:$coll_host_ip"
    echo "coll_db:$coll_db"
    echo "coll_tab:$coll_tab"
    echo "hive_db:$hive_db"
    echo "hive_tab:$hive_tab"
    #echo "hive_tab_cols:$hive_tab_cols"
    echo "hive_map_cols:$hive_map_cols"
    echo "start_dt:$start_dt"
    echo "end_dt:$end_dt"
    echo "pt_col:$pt_col"
        echo "one_day:$one_day"
        echo "today:$today"
}

# print the value of argument
printArgs

# sqoop import table of mysql to hive tmp table
sqoopImpTempTab()
{
    echo  "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ [`date +\"%F %T\"`] sqoop import start @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ "
        if [ -n "${hive_map_cols}" ]
        then
        sqoop import -Dorg.apache.sqoop.splitter.allow_text_splitter=true -Dmapreduce.job.queuename=bf_yarn_pool.production \
                        --connect jdbc:oracle:thin:@$coll_host_ip:$coll_host_port/$coll_db \
                        --table $coll_tab --username $coll_tab_username --password $coll_tab_passwd \
                        --delete-target-dir \
                    --hive-import --hive-overwrite --hive-database tmp_${hive_db} --hive-table tmp_${hive_tab} --hive-drop-import-delims -m 1 \
                    --where "${pt_col} >=to_date('${one_day}','yyyy-mm-dd') and ${pt_col}<to_date('${today}','yyyy-mm-dd')" --fields-terminated-by '\001' \
            --split-by ${hive_map_cols} \
                    --null-string '\\N' --null-non-string '\\N' 
        else
        sqoop import -Dorg.apache.sqoop.splitter.allow_text_splitter=true -Dmapreduce.job.queuename=bf_yarn_pool.production \
                        --connect jdbc:oracle:thin:@$coll_host_ip:$coll_host_port/$coll_db \
                    --table $coll_tab --username $coll_tab_username --password $coll_tab_passwd \
            --delete-target-dir \
                        --hive-import --hive-overwrite --hive-database tmp_${hive_db} --hive-table tmp_${hive_tab} --hive-drop-import-delims -m 1 \
                        --where "${pt_col} >=to_date('${one_day}','yyyy-mm-dd') and ${pt_col}<to_date('${today}','yyyy-mm-dd')" --fields-terminated-by '\001' \
                        --null-string '\\N' --null-non-string '\\N' #&> /dev/null 

        fi
        RET=$?
        if [ $RET -eq 0 ]; then
                echo "`date +\"%F %T\"` [INFO] sqoop import database:$hive_db table:temp_$hive_tab successfully."
        else
                echo "`date +\"%F %T\"` [ERROR] sqoop import database:$hive_db table:temp_$hive_tab error."
                exit 5
        fi
        echo "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ [`date +\"%F %T\"`] sqoop import end @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ "

}
sqoopImpTempTab

# store tmp table to hive rcfile table
hiveStoreAsRc()
{

    #pt_col=create_time
        echo '---------------------------------------------------------- hive store as rcfile start  -------------------------------------------------------------------------------------'

    hsql="use ${hive_db};set hive.exec.dynamic.partition=true;set hive.exec.dynamic.partition.mode=nonstrict;
                set mapreduce.map.memory.mb=15000;set mapreduce.reduce.memory.mb=15000; set hive.merge.mapredfiles=true;set hive.exec.max.created.files=100000;
                SET hive.exec.max.dynamic.partitions=100000;SET hive.exec.max.dynamic.partitions.pernode=100000;from tmp_${hive_db}.tmp_${hive_tab} \
        INSERT OVERWRITE TABLE ${hive_db}.${hive_tab} PARTITION(pk_year,pk_month,pk_day) select *,substr(${pt_col}, 1, 4),substr(${pt_col}, 1, 7),substr(${pt_col}, 1, 10) \
        where ${pt_col} >='${one_day}' and ${pt_col}<'${today}' "

    #phsql=$hsql" INSERT INTO TABLE ${hive_db}.${hive_tab} PARTITION(partition_key='${sdt:0:7}') select $hive_tab_cols where $pt_col > '${sdt:0:7}';"    
    echo "#################### hsql: $hsql"
    #hive -S -e "${hsql}"
    beeline --hiveconf mapreduce.job.queuename=bf_yarn_pool.production --silent=true --showHeader=false --showWarnings=false -u 'jdbc:hive2://localhost:10000/default;' -n yarn -p *******  -e "${hsql}"    

    RET=$?
    if [ $RET -eq 0 ]; then
            echo "`date +\"%F %T\"` [INFO] ${hive_db}.${hive_tab}  store successfully." 
                #exit 0
    else
               echo "`date +\"%F %T\"` [ERROR] ${hive_db}.${hive_tab}  store failure." 
               exit 5
    fi
        echo '---------------------------------------------------------- hive store as rcfile end  -------------------------------------------------------------------------------------'
}

hiveStoreAsRc

# impala table refresh
impTabRefrsh()
{
    echo '********************************************************** impala refresh table start *****************************************************************************************'    
        beeline --silent=true --showHeader=false --showWarnings=false -u 'jdbc:hive2://localhost:21050/default;' -n yarn -p ******* -e "refresh ${hive_db}.${hive_tab}"

    RET=$?

    if [ ${RET} -eq 0 ]; then
        echo "`date +\"%F %T\"` [INFO] impala:refresh ${hive_db}.${hive_tab} success!"
        exit 0
    else    
        echo "`date +\"%F %T\"` [ERROR] impala:refresh ${hive_db}.${hive_tab} failure!"
        exit 5
    fi    
    echo '********************************************************** impala refresh table end *****************************************************************************************'    
}

impTabRefrsh 
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值