티스토리 뷰

반응형

인증이 없는 하둡끼리의 distcp 처리를 할 때는 특별히 해줄일이 없다. 굳이 해줘야한다면 다른 nameservice 를 등록해서 처리하면 namenode 의 active/standby 문제를 해결할 수있다는 정도? 하지만, kerberos 인증이 있는 하둡과 인증이 없는 하둡, 혹은 다른 kerberos 인증서버를 사용하는 클러스터간 데이터 복제는 생각보다 해결방법이 잘 안나오는거 같다.

그래서 케이스별 distcp 사용 사례를 정리하고자 한다. 보통 회사에서 팀별로 하둡클러스터를 각자 운영할 때 이런일을 겪을것이다.

 

1. 인증없는 하둡간 복제

특별히 해줄게 없다. hadoop 명령에서 distcp 명령을 쓰고, src, target 경로만 적어주면 된다.

hadoop distcp hdfs://myservice/user/foo/sample/ymd=2023-01-01 hdfs://youservice/user/bar/sample/

 

굳이 뭔가 더한다고 치면 편의를 위해 내 하둡클러스터가 아닌 다른 클러스터의 nameservice 를 hdfs-site.xml 에 추가해주면 사용이 편하다 정도랄까? 

2021.11.18 - [데이터처리/Hadoop] - [팁] 다른 hdfs 클러스터의 nameservice 등록하는 방법

 

 

[팁] 다른 hdfs 클러스터의 nameservice 등록하는 방법

개요 하둡클러스터가 부서별로 여러대를 운영할 경우 rpc-address 를 기반으로 접근하는 경우가 많다. 하지만 HA구성이 되어있다면 리더를 담당하는 서버가 변경되서 동작이 안되는 경우가 존재한

ngela.tistory.com

 

2. 내 하둡은 kerberos 인증, 딴 클러스터는 인증없다면?

내 하둡은 kerberos 인증을 하고 있고, 연결하려는 외부 하둡클러스터는 인증이 없는 하둡이라면?

SIMPLE auth 어쩌구 하면서 오류가 발생된다. 이때 "-Dipc.client.fallback-to-simple-auth-allowed=true"  옵션을 추가해주면 연결이 가능하고 이런경우 복사가 가능하다.

$ hadoop fs -ls hdfs://youservice-no-auth/
ls: Call From host.myhome.com/10.10.10.1 to nn01.myhome.com:8020 failed: Server asks us to fall back to SIMPLE auth, but this client is configured to only allow secure connections.
 
$ hadoop fs -Dipc.client.fallback-to-simple-auth-allowed=true -ls hdfs://youservice-no-auth/
Found 2 items
drwxrwxrwx   - yarn   hadoop          0 2018-11-08 18:56 hdfs://youservice-no-auth/app-log
drwxrwxrwx   - hdfs   hadoop          0 2019-11-08 18:56 hdfs://youservice-no-auth/apps

 

즉, distcp 할때 해당 옵션을 추가해주면 된다. (즉, source 클러스터가 kerberos 인증, target 이 인증없는 케이스)

이때 주의할점은 source 서버는 kerberos 인증을 받기때문에 권한 오류가 발생되 우려가 있다. 만약, 아래와 같은 에러 메시지가 나온다면, target 폴더의 권한을 777 로 다 쓸수 있게 바꾸면 일단 복사가 가능하다.

org.apache.hadoop.security.AccessControlException: Permission denied: user=계정명

 

hadoop distcp -Dipc.client.fallback-to-simple-auth-allowed=true \
  hdfs://myservice/user/foo/sample/ymd=2023-01-01 \
  hdfs://youservice-no-auth/export/sample

 

3. 클러스터 모두 kerberos 인증을 쓰는데 인증서버가 다른경우

클러스터가 다른데, kerberos 의 인증서버가 다른 경우가 존재할 수 있다. 이런경우 2개의 인증정보를 활용해야 하기 때문에 어떻게 해야할지 감을 잡기 어렵다. 이때 사용하는 방법이 hdfs fetchdt 명령으로 토큰을 만들고, HADOOP_TOKEN_FILE_LOCATION 을 지정하여 기본인증과 티켓으로 인증된 정보 2개를 이용하여 distcp 를 사용할 수 있다.

 

  • hdfs fetchdt 명령으로 티켓파일 생성
  • HADOOP_TOKEN_FILE_LOCATION 환경변수에 해당 티켓파일 지정

예를 들면 아래와 같다.

# ---------------------------------------------------------
# target 클러스터의 인증과 티켓생성 - hdfs://youservice-krb-auth
# ---------------------------------------------------------
export KRB5_CONFIG=/user/home/youservice-krbs.conf
kinit -f -a -r 3600m -k -t /user/home/keytab/youservice-foo.keytab you@YOUHOME.COM
hdfs fetchdt  -fs hdfs://youservice-krb-auth /tmp/youservice-ticket.token

# ---------------------------------------------------------
# source 클러스터 인증 후 티켓파일 지정
# ---------------------------------------------------------
export KRB5_CONFIG=/user/home/myservice-krbs.conf
kinit -f -a -r 3600m -k -t /user/home/keytab/myservice-bar.keytab my@MYHOME.COM
export HADOOP_TOKEN_FILE_LOCATION=/tmp/youservice-ticket.token

# ---------------------------------------------------------
# source -> target distcp
# ---------------------------------------------------------
hadoop distcp \
  hdfs://myservice/user/foo/sample/ymd=2023-01-01 \
  hhdfs://youservice-krb-auth/export/sample

 

여기서 주의할건, hadoop fs -ls 같은 명령은 저 2가지 방법으로 확인이 바로 되는데, distcp 는 source 클러스터에서 map/reduce 가 동작해야 하고, 이때 RULE 정보와도 영향을 받는다. 그래서 core-site.xml 파일의 "hadoop.security.auth_to_local" 정보에 kerberos 인증시 사용하는 인증정보룰을 추가해줘야한다. 안그러면 아래와 같은 오류가 발생된다.

Caused by: org.apache.hadoop.yarn.exceptions.YarnException: Failed to submit application_1649422657081_43422 to YARN : Illegal principal name bar@YOUHOME.COM: org.apache.hadoop.security.authentication.util.KerberosName$NoMatchingRule: No rules applied to bar@YOUHOME.COM
        at org.apache.hadoop.yarn.client.api.impl.YarnClientImpl.submitApplication(YarnClientImpl.java:336)
        at org.apache.hadoop.mapred.ResourceMgrDelegate.submitApplication(ResourceMgrDelegate.java:304)
        at org.apache.hadoop.mapred.YARNRunner.submitJob(YARNRunner.java:331)
        ... 12 more
반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함