hdfs dfs -ls / 를 실행했는데 HDFS 가 아니라 로컬 디렉터리 내용이 나온다.
Hadoop 클라이언트는 기본 파일시스템을 core-site.xml 의 fs.defaultFS 에서 읽는다. 설정 파일을 찾지 못하면 이 값이 file:/// 로 기본 설정되어, 모든 경로가 로컬 파일시스템으로 해석된다. 오류가 나지 않고 조용히 로컬을 보여 주기 때문에 알아채기 어렵다.
hdfs getconf -confKey fs.defaultFS
이 명령이 file:/// 를 돌려주면 설정을 못 찾은 것이다.
설정 디렉터리를 환경 변수로 지정한다.
export HADOOP_CONF_DIR=/etc/hadoop/conf
Cloudera 배포판이면 보통 /etc/hadoop/conf 가 심볼릭 링크로 실제 설정 디렉터리를 가리킨다.
ls -l /etc/hadoop/conf
ls /etc/hadoop/conf
core-site.xml 과 hdfs-site.xml 이 그 안에 있어야 한다. 계정 로그인 때마다 적용하려면 셸 프로파일에 넣는다.
echo 'export HADOOP_CONF_DIR=/etc/hadoop/conf' >> ~/.bashrc
. ~/.bashrc
hdfs getconf -confKey fs.defaultFS
일회성으로는 URI 를 전부 적어도 된다.
hdfs dfs -ls hdfs://nameservice1/user/
로컬과 HDFS 를 함께 다루는 스크립트에서는 스킴을 적어 두면 이런 혼동이 없다.
hdfs dfs -ls file:///tmp
hdfs dfs -ls hdfs://nameservice1/user
hdfs dfs -put file:///tmp/a.csv hdfs://nameservice1/user/me/
hdfs dfs -ls -h /user/me
hdfs dfs -ls -R /user/me
hdfs dfs -du -h -s /user/me
hdfs dfs -count -q -h /user/me
hdfs dfs -find /user/me -name "*.parquet"
hadoop fs 와 hdfs dfs 는 같은 기능을 한다. hadoop fs 는 HDFS 외의 파일시스템에도 쓰는 일반 명령이고, hdfs dfs 는 HDFS 용으로 정리된 이름이다. 새로 쓰는 스크립트는 hdfs dfs 쪽을 쓴다.
HADOOP_CONF_DIR 이 잘못된 디렉터리를 가리키면 오류 대신 로컬 파일시스템으로 조용히 넘어간다. 스크립트 앞부분에서 fs.defaultFS 를 확인하는 한 줄을 넣어 두면 사고를 막을 수 있다.kinit 이 필요하다. 티켓이 없으면 인증 오류가 난다.