해당 페이지에서는 현재 재직중인 회사 라이픽
에서 데이터 통계를 내기 위해 진행했던 작업에 대해 기술 하고자 한다.
작업 순서는 다음과 같다.
여기서는 Hive 테이블에 Insert하는 단계까지 진행이 되며, 추후 관리를 위해 Hue에서 Workflow를 구성하여 작업을 한다.
Hue에서 oozie workflow를 작업하면 action 네임이 랜덤으로 지정되어 불편하긴 하다...
구성하면서 굉장히 많은 삽질을 하였지만 해당 페이지에서는 결과만 작성한다.
sqoop import \
--connect jdbc:postgresql://[host]:[port]/[database]?currentSchema=[schema] \
--username [user] --password-file [hdfs url] --table [table] --hive-table [hivetable] \
--escaped-by \\ --fields-terminated-by \001 --hive-drop-import-delims --hive-import --create-hive-table
sqoop import \
--merge-key [primary key] --last-value ${wf:actionData('[action name]')['field name']} \
--target-dir /user/hive/warehouse/[hive database].db/[hive table] --incremental lastmodified\
--table [table] --connect [==] --username [==] --password-file [==] --hive-table [==] --check-column updated_at --escaped-by \\ --fields-terminated-by \001 --hive-drop-import-delims
/user/hive/warehouse
에 생성된다.lastmodified
로 작성한다. (Add만을 가진 목적이라면 append로 작성)last-value를 가져오기 위해 업데이트할 테이블의 날짜값을 LIMIT 1로 지정하여 가져온다.
그 값을 sqoop action값으로 전달하고자 하였는데 값이 전달되지 않았다. workflow.xml에서 <capture-output / >이 걸려 있어야만
actionData Map에 저장할 수가 있는데 hive action은 capture-output 태그를 사용할 수 없다.
shell action은 저장이 가능하므로 해당 방식으로 이용하며 shell + sh + beeline + hive 의 조합으로 처리한다.
SELECT
REPLACE([Update date column], ' ', '_')
FROM [Hive table name]
ORDER BY [Update date column] DESC
LIMIT 1
arguments
의 구분자는 띄어쓰기이다. 적재된 날짜 값은 띄어쓰기가 포함되어 있으므로 치환을 한다.MASTER_NODE="[MASTER IP]"
LAST_DATE=`ssh -i "/mnt/pem/[name].pem" hadoop@${MASTER_NODE} "beeline \
--showHeader=false \
--outputformat=csv \
-u jdbc:hive2://${MASTER_NODE}:10000/default -n hive -e \"\
SELECT \
REPLACE(${1}, ' ', '_') \
FROM ${2} \
ORDER BY ${1} DESC \
LIMIT 1 \
\""`
echo "last_date=${LAST_DATE}"
shell action으로 실행이 되면, 마스터 노드에서 실행되는 것이 아닌, 다른 노드에서 해당 작업을 실행하게 된다.
그렇게 되면 다른 클러스터에는 beeline이 설치되어 있지 않으므로 beeline command not found
가 발생하게 된다.
해결방안으로 ssh
로 마스터노드가 실행되게 하였다. 여기서 중요한 부분은 다음과 같다.
권한
때문이다. 모든 노드의 인스턴스에 pem을 위치
시켜야 한다.[hadoop@ip- shell]$ hdfs dfs -copyFromLocal getLastDateTable.sh /shell/
[hadoop@ip- shell]$ hdfs dfs -ls /shell
Found 1 items
-rw-r--r-- 1 hadoop hdfsadmingroup 336 2022-04-29 12:06 /shell/getLastDateTable.sh
=================================================================
>>> Invoking Shell command line now >>
Stdoutput last_date='2022-04-28_19:31:55.736974'
Exit code of the Shell command 0
<<< Invocation of Shell command completed <<<
<<< Invocation of Main class completed <<<
Oozie Launcher, capturing output data:
=======================
last_date='2022-04-28_19:31:55.736974'
=======================
직접 workflow.xml을 작성하지 않고 HUE를 통한 UI로만 작성한다.
Sqoop command arguments :
import
--last-value
'2022-04-28_19:31:55.736974'
...
-rw-r--r-- 1 hue hue 0 2022-04-29 12:28 /user/hive/warehouse/partner.db/db_table/_SUCCESS
-rw-r--r-- 1 hue hue 237237 2022-04-29 12:28 /user/hive/warehouse/partner.db/db_table/part-r-00000
-rw-r--r-- 1 hue hue 237796 2022-04-29 12:28 /user/hive/warehouse/partner.db/db_table/part-r-00001
-rw-r--r-- 1 hue hue 237656 2022-04-29 12:28 /user/hive/warehouse/partner.db/db_table/part-r-00002
-rw-r--r-- 1 hue hue 237133 2022-04-29 12:28 /user/hive/warehouse/partner.db/db_table/part-r-00003
-rw-r--r-- 1 hue hue 237866 2022-04-29 12:28 /user/hive/warehouse/partner.db/db_table/part-r-00004