隨着我司的應用都開始容器化,相應的ETL流程也需要遷移到容器中。常規的SQL和shell腳本遷移之后執行基本沒有問題,主要的問題在於數據接入使用kettle的場景下,kettle啟動異常。
kettle部署方式
kettle掛載在某台主機的路徑下,該路徑映射到一個裝有Azkaban容器的路徑,日常任務通過Azkaban執行pan.sh
導入各種源數據。
執行遇到的問題
spoon.sh: line 230: 18976 Killed "$_PENTAHO_JAVA" $OPT -jar "$STARTUP" -lib $LIBPATH "${1+$@}" 2>&1
分析和解決
因為pan.sh
執行時會調用spoon.sh
,所以直接從錯誤提示的spoon.sh
的230行開始分析。
225 OS=`uname -s | tr '[:upper:]' '[:lower:]'`
226 if [ $OS = "linux" ]; then
227 (((("$_PENTAHO_JAVA" $OPT -jar "$STARTUP" -lib $LIBPATH "${1+$@}" 2>&1; echo $? >&3 ) | grep -viE "Gtk-WARNING|GLib-GObject|GLib-CRITICAL|^$" >&4 ) 3>&1)| inputtoexitstatus ) 4>&1
228 else
229 "$_PENTAHO_JAVA" $OPT -jar "$STARTUP" -lib $LIBPATH "${1+$@}"
230 fi
231 EXIT_CODE=$?
從這段shell代碼看,報錯的信息時第229行,原因是第225行查詢失敗。在Azkaban中單獨調用uname -s | tr '[:upper:]' '[:lower:]'
語句,會提示uname: extra operand '|'
。
因為我這邊沒有容器的訪問方式 ,在確定容器后台是Linux的情況下。
直接注釋掉第225行到第231行,並將227行復制到231行后面。
225 #OS=`uname -s | tr '[:upper:]' '[:lower:]'`
226 #if [ $OS = "linux" ]; then
227 # (((("$_PENTAHO_JAVA" $OPT -jar "$STARTUP" -lib $LIBPATH "${1+$@}" 2>&1; echo $? >&3 ) | grep -viE "Gtk-WARNING|GLib-GObject|GLib-CRITICAL|^$" >&4 ) 3>&1)| inputtoexitstatus ) 4>&1
228 #else
229 # "$_PENTAHO_JAVA" $OPT -jar "$STARTUP" -lib $LIBPATH "${1+$@}"
230 #fi
231 #EXIT_CODE=$?
232 (((("$_PENTAHO_JAVA" $OPT -jar "$STARTUP" -lib $LIBPATH "${1+$@}" 2>&1; echo $? >&3 ) | grep -viE "Gtk-WARNING|GLib-GObject|GLib-CRITICAL|^$" >&4 ) 3>&1)| inputtoexitstatus ) 4>&1
再次使用Azkaban調用時就可以順利執行kettle數據導入。