采坑:java調(diào)shell腳本執(zhí)行hive語句

最近有個(gè)需求,就是SpringBoot提供一個(gè)web接口給業(yè)務(wù)方,業(yè)務(wù)方傳入?yún)?shù)調(diào)接口,接口去執(zhí)行hive離線計(jì)算,一般可能是說直接用jdbc去連hive執(zhí)行hive操作,但是這種方案,對(duì)于單個(gè)任務(wù)可能還是可以的,如果對(duì)于10個(gè)維度的數(shù)據(jù)統(tǒng)計(jì),那這個(gè)代碼寫起來就坑了。。所以還是想著,把所有hive腳本都放一個(gè)shell腳本里,java調(diào)接口的時(shí)候直接去執(zhí)行這個(gè)腳本,而且不需要等待結(jié)果,所以我采取這種方案。

但是,想法是好的,現(xiàn)實(shí)很殘酷。

問題拋出:java無法調(diào)hive腳本無法執(zhí)行。

這個(gè)問題卡了一天了,期間也問了一些朋友,都沒遇到過這種需求,所以沒有辦法,只能自己來搞??ǖ脑蛟谀睦锬??如果直接在java代碼里調(diào)hive腳本執(zhí)行的話,會(huì)出現(xiàn)如下問題:

error.png

百度、谷歌也搜了,都沒搜到我要的答案。真是坑。期間我也想過是不是權(quán)限的問題、或者是不是沒找到hadoop路徑之類的問題,都配置上去了,不起作用。。

main.png

所執(zhí)行的test.sh腳本中,只放了一個(gè)清空hive表的語句

test.png

搞了一天,不行,該試的方法都試過了,咋辦呢?甚至連直接通過java代碼去執(zhí)行hive語句,但是因?yàn)樯a(chǎn)環(huán)境中是一個(gè)離線統(tǒng)計(jì)的腳本,腳本語句就大幾百行,如果轉(zhuǎn)成java去調(diào)用,這工作量可想而知。。而且,腳本中不單單是hive語句的腳本,還有hadoop的腳本,比如刪除hdfs某個(gè)文件夾、執(zhí)行某個(gè)已經(jīng)寫好的mapreduce任務(wù)……等等這些,反正就是通過java好干難(方言:艱難的意思),所以我心想,不行,得解決這個(gè)問題。所以我又重新梳理了一下問題,報(bào):“Unable to determine Hadoop version information”,這個(gè)錯(cuò)誤是在hive啟動(dòng)腳本中的,所以問題還是回到了原來的思路:是不是直接通過java調(diào)這個(gè)腳本,可能無法加載hadoop環(huán)境,既然不能直接調(diào),那間接的是否可以呢?

問題解決:間接法

解決思路:
① Java先調(diào)一個(gè)腳本,在這個(gè)腳本中專門接收參數(shù),并將參數(shù)寫入指定文件中;
② 然后再寫一個(gè)shell腳本來實(shí)時(shí)監(jiān)控這個(gè)參數(shù)文件的變化,如果文件內(nèi)容有變化,則直接調(diào)用真正的hive腳本取執(zhí)行
代碼如下:
第一步:創(chuàng)建一個(gè)接收參數(shù)的腳本acceptParam.sh:

rm -rf /root/single_prod/data/single.txt
echo $1 >> /root/single_prod/data/single.txt
step1.png

第二步:通過java代碼去調(diào)用,看看能否將參數(shù)寫入指定的文件中

step2.png

第三步:最重要的一步,寫一個(gè)實(shí)時(shí)監(jiān)控腳本monitor.sh:

step3.png
#!/bin/bash
# $param1 需要監(jiān)測的文件
# $param2 存放文件md5值,用于判斷文件是否更改

param1='/root/single_prod/data/single.txt'
param2='/root/single_prod/data/single.txt.md5'

 if [ ! $param1 ] || [ ! $param2 ] || [ ! -e $param1 ] ; then
    echo "\$1 or \$2 is file"
    exit
 fi
 # 生成md5驗(yàn)證文件
 function creatMd5file()
 {
    md5sum -b $param1 > $param2
 }
 
 # 判斷文件是否存在
 if [ ! -e $param2 ] ; then
    creatMd5file $param1 $param2
 fi
 
 while(true) ; do
    # 檢測文件是否修改,$?返回1 表示修改, 0表示未修改
    md5sum -c $param2 --status
    
    if [ $? -gt 0 ] ; then
        echo "執(zhí)行吧"
        for line in $(cat $param1)
        do
           echo "讀取文件內(nèi)容為:"$line
           sh /root/single_prod/test.sh $line >> /root/single_prod/logs/test.log
        done    
    creatMd5file $param1 $param2
    
    fi
    # 每過3秒檢測一次
    sleep 3
 done

第四步:驗(yàn)證
[root@master1 single_prod]# nohup sh monitor.sh >> monitor.log &

step4.png

終于大功告成了,真是不容易,搞了一天半。。。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Zookeeper用于集群主備切換。 YARN讓集群具備更好的擴(kuò)展性。 Spark沒有存儲(chǔ)能力。 Spark的Ma...
    Yobhel閱讀 7,605評(píng)論 0 34
  • hive.ddl.output.format:hive的ddl語句的輸出格式,默認(rèn)是text,純文本,還有json...
    博弈史密斯閱讀 2,100評(píng)論 0 6
  • 說明:不少讀者反饋,想使用開源組件搭建Hadoop平臺(tái),然后再部署Kylin,但是遇到各種問題。這里我為讀者部署一...
    大詩兄_zl閱讀 2,184評(píng)論 0 2
  • 中國人口是第一大國,因?yàn)橐簿驮斐芍贫群凸芾砩系囊欢ㄕ系K,在一線城市可能交通規(guī)則會(huì)比較嚴(yán)格,而相對(duì)于三線城市...
    稗子悠悠閱讀 122評(píng)論 0 0
  • 聲聲汽笛穿墻進(jìn) 綿綿鄉(xiāng)愁破窗飛 久佇臺(tái)前 雪花漫,歇風(fēng)寒 片片思念落不盡 款款深情吹不散 愁容不知其所起 惟愿一生伴君行
    心晴日記閱讀 161評(píng)論 0 0

友情鏈接更多精彩內(nèi)容