로컬 파일을 HDFS 로 올리면 소유자와 권한이 원본과 달라진다. 또 다른 계정으로 올리고 싶은데 커버로스가 꺼진 클러스터에서 사용자를 어떻게 지정하는지가 불분명하다.
거의 같다. copyFromLocal 은 원본이 반드시 로컬이어야 한다는 제약이 있고, put 은 표준 입력이나 다른 파일시스템 경로도 받는다.
hdfs dfs -put localfile.csv /data/raw/
hdfs dfs -copyFromLocal localfile.csv /data/raw/
# put 만 되는 형태
cat localfile.csv | hdfs dfs -put - /data/raw/localfile.csv
-moveFromLocal 은 올린 뒤 로컬 원본을 지운다.
-p 를 주면 접근·수정 시각, 소유자·그룹, 권한을 유지하려 시도한다. 두 명령 모두 이 옵션을 받는다.
hdfs dfs -put -p localfile.csv /data/raw/
hdfs dfs -copyFromLocal -p localdir /data/raw/
다만 소유자를 바꾸는 것은 슈퍼유저만 할 수 있다. 일반 사용자가 -p 를 줘도 소유자는 올린 사람으로 찍히고 시각과 권한만 따라간다. 오류 없이 조용히 그렇게 되므로 결과를 확인해야 한다.
hdfs dfs -ls /data/raw/
슈퍼유저 그룹에 속한 계정으로 올리거나, 올린 뒤 바꾼다.
hdfs dfs -chown appuser:appgroup /data/raw/localfile.csv
hdfs dfs -chmod 640 /data/raw/localfile.csv
커버로스가 꺼진 클러스터에서 HDFS 클라이언트의 신원은 OS 계정 이름이다. 이것을 바꾸려면 환경변수를 쓴다.
HADOOP_USER_NAME=hive hdfs dfs -put localfile.csv /warehouse/tablespace/external/hive/
-D user.name=hive 형태로 넘기는 방식이 인터넷에 돌아다니지만, 이것은 자바 시스템 속성을 설정하는 것이고 최근 하둡 클라이언트는 HADOOP_USER_NAME 을 먼저 본다. 확실한 것은 환경변수 쪽이다.
커버로스가 켜져 있으면 이 방법은 통하지 않는다. 신원은 티켓이 정한다.
kinit -kt /etc/security/keytabs/app.keytab app@EXAMPLE.COM
klist
hdfs dfs -put localfile.csv /data/raw/
-D 는 설정값을 그때만 덮어쓰는 용도로 쓴다. 다른 네임서비스로 보낼 때는 URI 를 전체로 적는 편이 확실하다.
hdfs dfs -Dfs.defaultFS=hdfs://nn-other:8020 -put localfile.csv /data/raw/
hdfs dfs -put localfile.csv hdfs://nn-other:8020/data/raw/
대량이면 distcp 를 쓴다. -p 에 무엇을 유지할지 문자로 지정할 수 있어 세밀하다.
hadoop distcp -pugp hdfs://src:8020/data hdfs://dst:8020/data
p 뒤의 문자는 r(복제 계수) · b(블록 크기) · u(사용자) · g(그룹) · p(권한) · t(시각) 을 뜻한다.
크기와 권한을 함께 본다.
hdfs dfs -ls -h /data/raw/
hdfs dfs -du -s -h /data/raw/
hdfs dfs -stat '%n %u %g %a %b' /data/raw/localfile.csv
내용 무결성까지 보려면 체크섬을 비교한다. 로컬과 HDFS 의 체크섬 알고리즘이 다르므로 같은 방식으로 뽑아야 한다.
hdfs dfs -checksum /data/raw/localfile.csv
디렉터리에 걸린 ACL 이 있으면 새로 만든 파일이 기본 ACL 을 물려받아 -p 로 준 권한과 달라진다.
hdfs dfs -getfacl /data/raw
umask 도 작용한다. HDFS 는 fs.permissions.umask-mode 를 따로 가지며 기본은 022 다.
Ranger 가 걸린 클러스터에서는 파일 권한 비트보다 정책이 먼저다. 권한을 맞춰도 정책에서 막으면 못 읽는다.