[데이터] EMR -> Hue 데이터 확인

JunMyung Lee·2022년 4월 11일
0

데이터

목록 보기
2/14

해당 페이지에 이전까지의 클러스터 생성부터 수정한 사항에 대해 서술한다.

클러스터 생성

클러스터 생성시, EMR에서 제공하는 가장 최신의 버전으로 구성을 진행하였다.
초기의 기본설정에서 몇가지 어플리케이션이 없는것과, 용량에 대한 문제로 재구축을 하였다.

EMR클러스터 CLI 실행문

# 초기 설정에서 /data의 mount될 위치로 먼저 잡고 테스트를 진행하였는데
# 해당 클러스터가 실행되질 않고 종료되었다.
# 해서 데이터 노드(core-node)에 따로 설정파일을 변경하였다.
aws emr create-cluster --termination-protected \
--applications Name=Hadoop Name=Hive Name=Hue Name=JupyterHub Name=Oozie Name=Zeppelin Name=Spark Name=Sqoop Name=HCatalog Name=HBase \
--ec2-attributes '보안 그룹관련' \
--release-label emr-6.5.0 \
--log-uri 's3n://lific-log/prod/emr/' \
--auto-scaling-role EMR_AutoScaling_DefaultRole \
--ebs-root-volume-size 40 \
--service-role EMR_DefaultRole \
--enable-debugging \
--name 'hadoop-cluster' \
--scale-down-behavior TERMINATE_AT_TASK_COMPLETION \
--region ap-northeast-2 \
--configurations '
[
  {
    "Classification": "hive-site",
    "Properties": {
      "hive.execution.engine": "mr"
    }
  },
  {
    "Classification": "hdfs-site",
    "Properties": {
      "dfs.permissions.enabled": "false",
      "dfs.webhdfs.enabled": "true"
    }
  }
]' \
--instance-groups '
[
    {
      "InstanceCount": 1,
      "EbsConfiguration": {
        "EbsBlockDeviceConfigs": [
          {
            "VolumeSpecification": {
              "SizeInGB": 32,
              "VolumeType": "gp2"
            },
            "VolumesPerInstance": 2
          }
        ]
      },
      "InstanceGroupType": "MASTER",
      "InstanceType": "r6g.xlarge",
      "Name": "마스터 인스턴스 그룹"
    },
    {
      "InstanceCount": 2,
      "InstanceGroupType": "CORE",
      "InstanceType": "r6g.xlarge",
      "Name": "코어 인스턴스 그룹"
    },
    {
      "InstanceCount": 1,
      "InstanceGroupType": "TASK",
      "InstanceType": "r6g.xlarge",
      "Name": "작업 인스턴스 그룹"
    }
  ]
'

모든 인스턴스 UTC → KST로 시간변경

인스턴스 기동시 서버의 기본 시간은 UTC로 되어있다. 이것을 모든 인스턴스에 다음과 같이 적용하여 KST시간으로 변경한다.

sudo timedatectl set-timezone Asia/Seoul
#[hadoop@ip ~]$ date
#2022. 04. 06. (수) 16:57:48 KST

클러스터 설정 - 데이터노드 (Core Node 1/2)

클러스터가 모두 정상적으로 동작하면, 코어노드의 hdfs 영역에 s3의 저장소를 추가로 잡아주어야 한다.

# 루트 사용자 전환
sudo su
# yum 전체 업데이트
yum update -y
# s3fs-fuse 설치를 위한 epel 설치
amazon-linux-extras install epel -y
# s3로 마운트를 할 수 있는 바이너리 설치
yum install s3fs-fuse -y
# 아마존 계정 정보 파일 생성 -> 
ID:PASSWORD
vi /etc/passwd-s3fs
# 계정 파일 권한 변경
chmod 640 /etc/passwd-s3fs
# 마운트 폴더 생성
mkdir /data
# 사용자 권한 변경
chown -R hadoop:hadoop /data
# s3 버킷 생성 hadoop-master.lific.io/core-node-data-1, 2
# s3 마운트
s3fs [S3_URL]:/[FOLDER_NAME] /data -o passwd_file=/etc/passwd-s3fs -o allow_other -o url=https://[AWS_REGION_URL] -o use_path_request_style
# 인스턴스 재기동시, 마운트 옵션이 해제되지 않도록 fstab 추가
# s3fs#[S3_URL]:/[FOLDER_NAME] /data fuse rw,_netdev,passwd_file=/etc/passwd-s3fs,url=https://[AWS_REGION_URL],allow_other,use_path_request_style 0 0
vi /etc/fstab

# 유저생성
useradd appuser -g hdfsadmingroup 
# hdfs 맵핑 리프레쉬
hdfs dfsadmin -refreshUserToGroupsMappings
# hdfs 유저 생성
hadoop fs -mkdir /user/appuser
# hdfs 유저 권한
hadoop fs -chown appuser:hdfsadmingroup /user/appuser

파일 수정

정상적으로 서비스를 하기 위해 변경해야할 파일들

hdfs-site.xml 파일 수정

클러스터 생성시 변경하고 싶었으나 마운트 이슈로 클러스터가 정상적으로 구동이 되질 않음

<property>
    <name>dfs.datanode.data.dir</name>
    <value>file:///mnt/hdfs,file:///mnt1/hdfs,file:///data/hdfs</value>
</property>
<property>
    <name>dfs.namenode.name.dir</name>
    <value>file:///mnt/namenode,file:///mnt1/namenode,file:///data/namenode</value>
</property>
<property>
    <name>dfs.name.dir</name>
    <value>/mnt/namenode,/mnt1/namenode,/data/namenode</value>
</property>
<property>
    <name>dfs.data.dir</name>
    <value>/mnt/hdfs,/mnt1/hdfs,/data/hdfs</value>
</property>

<!--
이후 재기동
sudo systemctl stop hadoop-hdfs-datanode.service
sudo systemctl start hadoop-hdfs-datanode.service
-->

SQOOP 이슈

DB 패스워드 파일

스쿱에서 직접적으로 password를 명시하면 정상적으로 기동이 되지만, hdfs내에 파일로 작성하여 처리할 경우, 제대로 인식이 안되는 에러가 발생한다.
해당 에러 사유는 에디터에서 작성시 발생하는 개행때문이며 이때 에디터를 통해 작성하지 않고 다음과 같이 처리하면 정상적으로 동작한다.

echo -n 'password' > file_name
# "로 묶으면 특수문자 인스턴스 내에서 처리가 안되는 에러가 발생한다.

HUE DB 연결 이슈

HUE를 통해서 운영 디비를 조회하여 데이터를 확인하고 싶었다. 그러나 연결이 제대로 되질 않는데, 이때 서버내에서 파이썬 관련 라이브러리를 설치하라고 한다. 하지만 psycopg2 를 설치하려고 하면 실패가 되는데 다음과 같이 설치가 진행되어야 정상적으로 진행된다.

sudo yum groupinstall "Development Tools"
sudo yum install python3-devel
sudo yum install postgresql-libs
sudo yum install postgresql-devel
pip3 install psycopg2

OOZIE 이슈

Make sure HIVE_CONF_DIR is set correctly 이슈

처음에 에러를 보고 당연히 권한 문제인줄 알았다. ( cannot run program ‘hive’ 로 기억함..)
oozie에서 sqoop을 실행하지만, 실제 sqoop의 lib를 이용하지 않고, oozie의 sharelib 를 이용하는것을 알게 되었다. EMR에서 sqoop의 라이브러리와 같이 지정되어 있으면 좋으려만 그렇지 않았고 이것을 여러 차례 시도 한 끝에 hive-exec.jar가 필요하다는것을 알게 되었다.

dfs dfs -copyFromLocal /usr/lib/hive/lib/hive-exec.jar /user/oozie/share/lib/lib_20220401073812/sqoop/
# oozie 서버를 재기동하지 않고 새로운 라이브러리를 업데이트
oozie admin -sharelibupdate
  • 여러 다른 이슈가 발생하여 하나둘씩 위의 방법으로 라이브러리를 넣어 최종적으로 만들어진 목록 리스트
[Available ShareLib]
sqoop
        hdfs://[IP].ap-northeast-2.compute.internal:8020/user/oozie/share/lib/lib_20220401073812/sqoop/antlr-runtime-3.5.2.jar
        hdfs://[IP].ap-northeast-2.compute.internal:8020/user/oozie/share/lib/lib_20220401073812/sqoop/avro-1.8.1.jar
        hdfs://[IP].ap-northeast-2.compute.internal:8020/user/oozie/share/lib/lib_20220401073812/sqoop/avro-ipc-1.8.2.jar
        hdfs://[IP].ap-northeast-2.compute.internal:8020/user/oozie/share/lib/lib_20220401073812/sqoop/avro-mapred-1.8.1.jar
        hdfs://[IP].ap-northeast-2.compute.internal:8020/user/oozie/share/lib/lib_20220401073812/sqoop/commons-codec-1.10.jar
        hdfs://[IP].ap-northeast-2.compute.internal:8020/user/oozie/share/lib/lib_20220401073812/sqoop/commons-collections-3.2.1.jar
        hdfs://[IP].ap-northeast-2.compute.internal:8020/user/oozie/share/lib/lib_20220401073812/sqoop/commons-compress-1.8.1.jar
        hdfs://[IP].ap-northeast-2.compute.internal:8020/user/oozie/share/lib/lib_20220401073812/sqoop/commons-io-2.4.jar
        hdfs://[IP].ap-northeast-2.compute.internal:8020/user/oozie/share/lib/lib_20220401073812/sqoop/commons-lang-2.4.jar
        hdfs://[IP].ap-northeast-2.compute.internal:8020/user/oozie/share/lib/lib_20220401073812/sqoop/hive-cli.jar
        hdfs://[IP].ap-northeast-2.compute.internal:8020/user/oozie/share/lib/lib_20220401073812/sqoop/hive-common.jar
        hdfs://[IP].ap-northeast-2.compute.internal:8020/user/oozie/share/lib/lib_20220401073812/sqoop/hive-exec.jar
        hdfs://[IP].ap-northeast-2.compute.internal:8020/user/oozie/share/lib/lib_20220401073812/sqoop/hsqldb-1.8.0.10.jar
        hdfs://[IP].ap-northeast-2.compute.internal:8020/user/oozie/share/lib/lib_20220401073812/sqoop/jackson-annotations-2.10.5.jar
        hdfs://[IP].ap-northeast-2.compute.internal:8020/user/oozie/share/lib/lib_20220401073812/sqoop/jackson-core-2.10.5.jar
        hdfs://[IP].ap-northeast-2.compute.internal:8020/user/oozie/share/lib/lib_20220401073812/sqoop/jackson-core-asl-1.9.13.jar
        hdfs://[IP].ap-northeast-2.compute.internal:8020/user/oozie/share/lib/lib_20220401073812/sqoop/jackson-databind-2.10.5.1.jar
        hdfs://[IP].ap-northeast-2.compute.internal:8020/user/oozie/share/lib/lib_20220401073812/sqoop/jackson-mapper-asl-1.9.13.jar
        hdfs://[IP].ap-northeast-2.compute.internal:8020/user/oozie/share/lib/lib_20220401073812/sqoop/jetty-6.1.26.jar
        hdfs://[IP].ap-northeast-2.compute.internal:8020/user/oozie/share/lib/lib_20220401073812/sqoop/jetty-util-6.1.26.jar
        hdfs://[IP].ap-northeast-2.compute.internal:8020/user/oozie/share/lib/lib_20220401073812/sqoop/jline-2.12.jar
        hdfs://[IP].ap-northeast-2.compute.internal:8020/user/oozie/share/lib/lib_20220401073812/sqoop/json-20220320.jar
        hdfs://[IP].ap-northeast-2.compute.internal:8020/user/oozie/share/lib/lib_20220401073812/sqoop/libfb303-0.9.3.jar
        hdfs://[IP].ap-northeast-2.compute.internal:8020/user/oozie/share/lib/lib_20220401073812/sqoop/libgplcompression.a
        hdfs://[IP].ap-northeast-2.compute.internal:8020/user/oozie/share/lib/lib_20220401073812/sqoop/libgplcompression.so
        hdfs://[IP].ap-northeast-2.compute.internal:8020/user/oozie/share/lib/lib_20220401073812/sqoop/libgplcompression.so.0
        hdfs://[IP].ap-northeast-2.compute.internal:8020/user/oozie/share/lib/lib_20220401073812/sqoop/libgplcompression.so.0.0.0
        hdfs://[IP].ap-northeast-2.compute.internal:8020/user/oozie/share/lib/lib_20220401073812/sqoop/log4j-api-2.10.0.jar
        hdfs://[IP].ap-northeast-2.compute.internal:8020/user/oozie/share/lib/lib_20220401073812/sqoop/log4j-core-2.10.0.jar
        hdfs://[IP].ap-northeast-2.compute.internal:8020/user/oozie/share/lib/lib_20220401073812/sqoop/mariadb-connector-java.jar
        hdfs://[IP].ap-northeast-2.compute.internal:8020/user/oozie/share/lib/lib_20220401073812/sqoop/netty-3.10.5.Final.jar
        hdfs://[IP].ap-northeast-2.compute.internal:8020/user/oozie/share/lib/lib_20220401073812/sqoop/oozie-sharelib-sqoop-5.2.1.jar
        hdfs://[IP].ap-northeast-2.compute.internal:8020/user/oozie/share/lib/lib_20220401073812/sqoop/paranamer-2.7.jar
        hdfs://[IP].ap-northeast-2.compute.internal:8020/user/oozie/share/lib/lib_20220401073812/sqoop/postgresql-jdbc.jar
        hdfs://[IP].ap-northeast-2.compute.internal:8020/user/oozie/share/lib/lib_20220401073812/sqoop/servlet-api-2.5-20081211.jar
        hdfs://[IP].ap-northeast-2.compute.internal:8020/user/oozie/share/lib/lib_20220401073812/sqoop/snappy-java-1.1.1.3.jar
		hdfs://[IP].ap-northeast-2.compute.internal:8020/user/oozie/share/lib/lib_20220401073812/sqoop/sqoop-1.4.7-hadoop260.jar
        hdfs://[IP].ap-northeast-2.compute.internal:8020/user/oozie/share/lib/lib_20220401073812/sqoop/velocity-1.7.jar
        hdfs://[IP].ap-northeast-2.compute.internal:8020/user/oozie/share/lib/lib_20220401073812/sqoop/xz-1.5.jar
    ```
    

### 로그파일에 SLA관련 이슈

SLA는 모니터 관련이라고 한다.. 권한 때문에 경고를 하는것 같은데 다음과 같이 처리한다.

```bash
# vi JAVA_HOME/jre/lib/security/java.policy
# append
permission javax.management.MBeanTrustPermission "register";

oozie-site.xml에 다음내용을 추가 후 재기동 한다.

<property>
    <name>oozie.services.ext</name>
    <value>
         org.apache.oozie.service.EventHandlerService,
         org.apache.oozie.sla.service.SLAService
    </value>
</property>
<property>
    <name>oozie.service.EventHandlerService.event.listeners</name>
    <value>org.apache.oozie.sla.listener.SLAJobEventListener</value>
</property>

SecurityException: Intercepted System.exit(0) 이슈

OOZIE에서 정상적으로 프로세스가 종료되어도 다음과 같이 마지막에 에러가 발생한다. 여러 구글링을 통해 해당 이슈는 버그로 판명되었고 해당 이슈가 수정되려면 코드의 수정밖에 없어 보인다. 그러나 우리는 EMR을 통해 지정된 프로세스를 설치하므로 해당 이슈는 안고 가야할듯 하다.
참고로 해당 사이트에서 업데이트가 되었지만 버전이 5.3이다. ( EMR에서 제공하는 OOZIE 최고 버전은 5.2 )

java.lang.reflect.InvocationTargetException
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.apache.oozie.action.hadoop.LauncherAM.runActionMain(LauncherAM.java:412)
	at org.apache.oozie.action.hadoop.LauncherAM.access$400(LauncherAM.java:54)
	at org.apache.oozie.action.hadoop.LauncherAM$2.run(LauncherAM.java:225)
	at java.security.AccessController.doPrivileged(Native Method)
	at javax.security.auth.Subject.doAs(Subject.java:422)
	at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1730)
	at org.apache.oozie.action.hadoop.LauncherAM.run(LauncherAM.java:219)
	at org.apache.oozie.action.hadoop.LauncherAM$1.run(LauncherAM.java:155)
	at java.security.AccessController.doPrivileged(Native Method)
	at javax.security.auth.Subject.doAs(Subject.java:422)
	at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1730)
	at org.apache.oozie.action.hadoop.LauncherAM.main(LauncherAM.java:143)
Caused by: java.lang.SecurityException: Intercepted System.exit(0)
	at org.apache.oozie.action.hadoop.security.LauncherSecurityManager.checkExit(LauncherSecurityManager.java:57)
	at java.lang.Runtime.exit(Runtime.java:107)
	at java.lang.System.exit(System.java:973)
	at org.apache.sqoop.Sqoop.main(Sqoop.java:253)
	at org.apache.oozie.action.hadoop.SqoopMain.runSqoopJob(SqoopMain.java:165)
	at org.apache.oozie.action.hadoop.SqoopMain.run(SqoopMain.java:155)
	at org.apache.oozie.action.hadoop.LauncherMain.run(LauncherMain.java:107)
	at org.apache.oozie.action.hadoop.SqoopMain.main(SqoopMain.java:47)
	... 16 more

MapReduce 연산시 com.hadoop.compression.lzo.LzoCodec not found 관련 이슈

최종 연산 수행에는 문제가 없으나, 자꾸 LZO 관련 Codec에 관련된 예외가 발생한다.
java.library.path가 지정이 안된다고 하는데 보니 .so파일 관련 지정 옵션인듯하다. 우리는 해당 옵션을 사용하지 않는 쪽으로 하였으며 다음과 같이 설정파일을 변경하였다.
그리고 재기동해야할 서비스가 많아 인스턴스 4대 전체 재기동하였다.

재기동시 마스터 노드에 꼭 안전모드 해제를 넣어주자

hadoop dfsadmin -safemode leave
<!-- 추가된 부분 -->
<property>
    <name>io.compression.codecs</name>
    <value>org.apache.hadoop.io.compress.GzipCodec,org.apache.hadoop.io.compress.DefaultCodec,org.apache.hadoop.io.compress.BZip2Codec,org.apache.hadoop.io.compress.SnappyCodec</value>
</property>

<!--
삭제된 부분
<property>
  <name>io.compression.codecs</name>
  <value>org.apache.hadoop.io.compress.GzipCodec,org.apache.hadoop.io.compress.DefaultCodec,org.apache.hadoop.io.compress.BZip2Codec,org.apache.hadoop.io.compress.SnappyCodec,com.hadoop.compression.lzo.LzoCodec,com.hadoop.compression.lzo.LzopCodec</value>
</property>

<property>
  <name>io.compression.codec.lzo.class</name>
  <value>com.hadoop.compression.lzo.LzoCodec</value>
</property>
-->

HUE 작동 확인

여기가지 진행이 되었다면 이제 HUE에 동작을 확인할 수 있다.

Editor 설정

불필요한 에디터는 삭제하고 에디터 탭별로 운영 디비를 연결하도록 하였다.

추가 및 변경 부분은 다음과 같다.

[[interpreters]]
	[[[member]]]
		name = Lific-member
		interface = rdbms
		options='{"url": "postgresql://[유저]:[패스워드]@[호스트]:[포트]/[데이터베이스]?currentSchema=[스키마]"}'

[[databases]]
  [[[member]]]
		nice_name=Lific-member
		engine = postgresql_psycopg2
		host = 호스트
		name = 데이터베이스
		schema= 스키마
		user = 유저
		password = 패스워드
		port = 포트
		case_insensitive_collation = utf8_unicode_ci
		options={}

webhdfs를 사용하기 위해 설정을 true로 변경되었는데 HUE의 기본설정에서는 포트가 다르게 적용되어 있다. (14000포트) 해서 이 포트를 변경한다.

webhdfs_url = http://[마스터노드내부IP]:9870/webhdfs/v1

Workflow 설정

이전의 워크플로우 결과값이 다음 워크플로우의 파라미터의 값으로 할당 되기를 원했다. 그런데 어찌 검색어를 넣어야 하는지 제대로 알수 없어서 자료가 나오질 않았고 예상되는 부분으로 처리하였다.
처리한 결과는 다음과 같다.

💡 SQOOP JOB을 이용하면 사실 이러한 워크플로우처리가 필요 없다.. 하지만 HUE에서 job을 등록할 경우, 세션이 존재하는듯 하다. 세션별, 유저별 잡 등록이 다르게 되는것 같고 ( 삭제된 Job이름이 다시 등장하다건가, 생성했는데 삭제시 삭제가 안되거나..)
해서 워크플로우로 나온 HDFS상의 마지막 update 날짜를 인자값으로 넘겨주려고 하는데 여기서 또 이슈가 editor에서 띄어쓰기를 모든 개행으로 받아들여서 집어 넣을 파라미터에 띄어쓰기가 있는 경우 ( 날짜 포맷에 띄어쓰기 존재) 이걸 제대로 인식하지 못한다...
해서 데이터 인자값은 _를 넣은 형태로 보내고 ( 데이터 타입으로 자동변환해서 비교해주는듯 ) 처리하고 있다.

# 여기서 hive-c6ce는 이전 작업의 네이밍
# 이전 작업의 결과 필드가 last_value여서 똑같이 작성했는데 해당 부분은 확인이 필요할듯
last_value=${wf:actionData("hive-c6ce")["last_value"]}

0개의 댓글