$ hdfs dfs -ls
ls: `.': No such file or directory
경로를 주지 않으면 HDFS 는 홈 디렉터리 /user/<사용자명> 을 본다. 이 오류는 그 디렉터리가 없다는 뜻이다.
Kerberos 인증을 쓰면 여기서 한 가지가 더 얽힌다. principal 이 hschoe@EXAMPLE.COM 일 때 HDFS 가 사용자명을 hschoe@EXAMPLE.COM 으로 잡아 /user/hschoe@EXAMPLE.COM 을 찾는 경우다. 원하는 것은 /user/hschoe 다.
Kerberos principal 을 OS 사용자명으로 바꾸는 규칙이 hadoop.security.auth_to_local 이다. 이 규칙이 realm 을 떼어내지 못하면 principal 전체가 사용자명이 된다.
<property>
<name>hadoop.security.auth_to_local</name>
<value>
RULE:[1:$1@$0](.*@EXAMPLE.COM)s/@.*//
RULE:[2:$1@$0](.*@EXAMPLE.COM)s/@.*//
DEFAULT
</value>
</property>
[1:...] 은 user@REALM 형식, [2:...] 는 service/host@REALM 형식에 적용된다. 여러 realm 을 쓰거나 신뢰 관계가 있으면 realm 별로 규칙을 추가한다.
적용 결과는 실행해서 확인할 수 있다.
hadoop org.apache.hadoop.security.HadoopKerberosName hschoe@EXAMPLE.COM
hschoe 가 나와야 정상이다. Cloudera Manager 환경에서는 이 값을 HDFS 설정에서 관리한다. 자세한 절차는 Cloudera 에서 Kerberos auth_to_local 규칙 설정 을 본다.
export HADOOP_USER_NAME=hschoe # Kerberos 환경에서는 무시된다
이 환경변수는 단순 인증(simple auth) 클러스터에서만 의미가 있다. Kerberos 가 켜진 클러스터에서는 티켓의 principal 이 신원을 결정하므로 아무 효과가 없다. 보안이 켜진 환경에서 이 값을 만지는 것은 해결이 아니라 혼란만 만든다.
규칙이 맞는데도 디렉터리가 없다면 만들어 준다.
sudo -u hdfs hdfs dfs -mkdir -p /user/hschoe
sudo -u hdfs hdfs dfs -chown hschoe:hschoe /user/hschoe
sudo -u hdfs hdfs dfs -chmod 700 /user/hschoe
Hue · Zeppelin 등은 첫 로그인 때 홈 디렉터리를 자동으로 만들어 주기도 한다. 배치 계정이나 CLI 전용 계정은 만들어지지 않으므로 운영 절차에 계정 생성 단계로 넣어 둔다.