[데이터] Hue에서 Workflow 구성하기

JunMyung Lee·2022년 4월 29일
0

데이터

목록 보기
4/14

해당 페이지에서는 현재 재직중인 회사 라이픽에서 데이터 통계를 내기 위해 진행했던 작업에 대해 기술 하고자 한다.
작업 순서는 다음과 같다.

  • PostgreSQL의 DB 테이블을 Hive로 이관(Import)한다.
    • 프로세스 실행시마다 증분되거나 변경되는 데이터를 최신데이터로 업데이트해야 한다.
  • Hive 쿼리로 조회된 통계 데이터를 Hive 테이블에 Insert 한다.
  • Web UI와의 연동을 위해 통계 테이블을 PostgreSQL DB 테이블로 방출(Export)한다.

여기서는 Hive 테이블에 Insert하는 단계까지 진행이 되며, 추후 관리를 위해 Hue에서 Workflow를 구성하여 작업을 한다.
Hue에서 oozie workflow를 작업하면 action 네임이 랜덤으로 지정되어 불편하긴 하다...

구성하면서 굉장히 많은 삽질을 하였지만 해당 페이지에서는 결과만 작성한다.

[SQOOP] PostgreSQL Hive로 Import하기

Static Table Import 작성

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

--fields-terminated-by \001

  • 필드별 구분자를 지어줘야 하는데 일반 특수문자로 지정할 경우, 필드값이 틀어지는 문제가 있다. 해서 직접 유니코드값으로 지정해야 한다.
  • 설정을 하지 않으면 기본값으로 지정된다고 하였는데, 증분되는 데이터를 merge하려고 하면 직접적으로 명시해줘야 한다.

--hive-drop-import-delims

  • 간혹 컬럼데이터에 개행문자가 들어올 수 있다. 그 개행으로 인하여 필드값이 틀어지는 문제가 있다. 해당 옵션으로 개행값을 지워야 한다.

Dynamic Table Import 작성

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 

--merge-key

  • 증분되는 데이터를 병합하기 위한 테이블의 PK값을 입력해야 한다.

--target-dir

  • 증분되는 데이터와 초기 만들어졌던 데이터의 위치는 같아야 한다.
  • 만들어진 데이터의 위치는 초기에 값을 넣지 않았으므로 기본값으로 설정되며 /user/hive/warehouse에 생성된다.

--incremental lastmodified

  • 여기서는 Update가 되어야 하므로 lastmodified로 작성한다. (Add만을 가진 목적이라면 append로 작성)

--last-value ${wf:actionData('[action name]')['field name']}

  • sqoop으로만 Job으로 등록하여 사용하면 자동으로 마지막 날짜를 갱신하여 처리한다.
  • ozzie를 통해서 Job으로 등록하면 등록이 제대로 이루어지지 않았다. (각각의 노드에서 처리가 되는듯하다 할때마다 다르게 나온다.)
  • 이전 oozie action을 통해 특정 날짜값을 파라미터로 하여 처리한다.

last-value를 가져오기 위해 업데이트할 테이블의 날짜값을 LIMIT 1로 지정하여 가져온다.
그 값을 sqoop action값으로 전달하고자 하였는데 값이 전달되지 않았다. workflow.xml에서 <capture-output / >이 걸려 있어야만
actionData Map에 저장할 수가 있는데 hive action은 capture-output 태그를 사용할 수 없다.
shell action은 저장이 가능하므로 해당 방식으로 이용하며 shell + sh + beeline + hive 의 조합으로 처리한다.

[Shellscript] 테이블의 마지막 컬럼 날짜 가져오기

Hive Query 작성

SELECT
    REPLACE([Update date column], ' ', '_')
FROM [Hive table name]
ORDER BY [Update date column] DESC
LIMIT 1

REPLACE([Update date column], ' ', '_')

  • oozie를 통해 값을 전달할때, arguments의 구분자는 띄어쓰기이다. 적재된 날짜 값은 띄어쓰기가 포함되어 있으므로 치환을 한다.
  • 데이터의 비교는 PostgreSQL에서 날짜값의 비교가 이루어지기 때문에 포맷이 달라도 비교가 된다.

Shellscript 작성

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}"

beeline

shell action으로 실행이 되면, 마스터 노드에서 실행되는 것이 아닌, 다른 노드에서 해당 작업을 실행하게 된다.
그렇게 되면 다른 클러스터에는 beeline이 설치되어 있지 않으므로 beeline command not found가 발생하게 된다.
해결방안으로 ssh로 마스터노드가 실행되게 하였다. 여기서 중요한 부분은 다음과 같다.

  • ssh시에 pem의 위치가 /mnt로 잡았는데, 이는 유저의 권한 때문이다.
    • hue에서 작업하고 실행을 하면, hue의 유저가 아니라 yarn의 유저로 접근이 되어서 권한을 yarn으로 변경해야 한다.
  • ssh는 마스터를 제외한 모든 노드의 인스턴스에 pem을 위치 시켜야 한다.
  • 더 간단하게 hive -e 명령어로 실행해도 될듯 하나, mapreduce로 실행이 되어야 하는 쿼리는 예외가 발생한다.
    • hive는 mapreduce를 사용하지 않는 쿼리에서는 동작
    • beeline은 hiveserver2에 요청하는것이여서 mapreduce가 동작하는것으로 보임

showHeader=false

  • beeline으로 요청한 결과는 +------------------+ 의 형태로 이쁘게 출력된다. 그런데 actionData에 주입할때 이값이 들어와서 false로 지정해야한다.

outputformat=csv

  • 해당값을 지정하지 않으면 다른 포맷으로 나와서 날짜값만 세팅되질 않는다.
  • 그렇게 되면 shell내에서 문자열처리하는 작업이 필요한데 csv로 지정하면 값만 노출된다.(물론 여러 컬럼일때는 콤마가 구분자로 들어간다)

HDFS에 삽입

[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

oozie 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'
=======================

[OOZIE] Workflow 작성하기

직접 workflow.xml을 작성하지 않고 HUE를 통한 UI로만 작성한다.

테이블 증분데이터 workflow 작성하기

getLastDateTable의 결과값 전달 확인

Sqoop command arguments :
             import
             --last-value
             '2022-04-28_19:31:55.736974'
          ...

HDFS 변경 확인

-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

라이픽 통계 처리 workflow 예시

0개의 댓글