Apache Hadoop — HDFS 와 YARN 을 한 파드에 세우고 운영한다 · 쿼터 · 实验
1바이트 파일이 30MB 쿼터에 막히는 이유를 재현한다
목표
디렉터리에 이름 쿼터와 공간 쿼터를 걸고, 이름 쿼터가 디렉터리 자신까지 센다는 것과 공간 쿼터가 블록 크기 × 복제 계수만큼 미리 예약한다는 것을 거절 메시지로 확인한다. 블록 크기를 줄여 같은 파일을 들여보내고, 쿼터가 옮기기(mv)까지 막는다는 것도 본다.
왜 중요한가
여러 팀이 한 HDFS 를 나눠 쓰면 한 팀의 실수(무한히 파일을 만드는 잡, 작은 파일 수백만 개)가 NameNode 의 힙과 디스크를 모두의 것에서 빼앗는다. 쿼터는 그 피해를 디렉터리 하나에 가두는 장치다. 이름 쿼터는 파일과 디렉터리의 개수를, 공간 쿼터는 복제본까지 포함한 바이트를 제한한다.
공간 쿼터에는 함정이 하나 있다. 파일을 쓰기 시작할 때 NameNode 는 아직 몇 바이트를 쓸지 모르므로 블록 하나를 통째로(블록 크기 × 복제 계수) 예약한다. 그래서 남은 쿼터가 128MB 보다 작으면 1바이트 파일도 들어가지 못한다. 쓰기가 끝나면 실제 크기로 정산되지만, 시작조차 못 하면 소용없다. 운영에서 "쿼터가 남았는데 왜 못 쓰냐" 는 문의의 대부분이 이것이다.
쿼터는 새 이름이 생기는 모든 일에 걸린다. 다른 디렉터리에서 옮겨 오는 것도 그 디렉터리 입장에서는 새 이름이다.
단계
1. HDFS /quota/team-a 를 만들고 이름 쿼터 10 을 거세요(hdfs dfsadmin -setQuota).
2. 작은 로컬 파일을 하나씩 team-a 에 올려 거절될 때까지 채우고, 거절된 put 의 오류 출력을 /root/hdp/quota/quota_err.txt 에 저장하세요.
3. /quota/team-b 를 만들고 공간 쿼터 30MB 를 거세요(hdfs dfsadmin -setSpaceQuota 30m).
4. 1바이트짜리 로컬 파일 /root/hdp/quota/one.txt 를 만들어 /quota/team-b/one.txt 로 올려 보고, 오류 출력을 /root/hdp/quota/space_err.txt 에 저장하세요.
5. 같은 파일을 블록 크기 1MiB(-D dfs.blocksize=1048576)로 /quota/team-b/one-1m.txt 에 올리세요.
6. hdfs dfs -count -q -v /quota/team-a /quota/team-b 출력을 /root/hdp/quota/count.txt 에 저장하세요.
7. /quota/staging 을 만들어 파일 하나(/quota/staging/f.txt)를 올린 뒤, 그것을 team-a 로 -mv 해 보고 오류 출력을 /root/hdp/quota/mv_err.txt 에 저장하세요.
8. /root/hdp/quota/report.md 에 ## 이름 쿼터 ## 공간 쿼터 ## 쿼터가 막는 것 세 절을 쓰세요. 첫 절에 team-a 에 실제로 들어간 파일 수를, 둘째 절에 예약하려던 바이트 수(134217728)를 넣으세요.
참고
- 쿼터를 거는 것은 관리자 명령(
hdfs dfsadmin)이고 슈퍼유저만 할 수 있습니다. 이 파드에서는 root 입니다. - 공간 쿼터의 단위는 바이트이고
30m·1g같은 접미사를 쓸 수 있습니다. 복제본도 셉니다 — 복제 계수 3 이면 1MB 파일이 3MB 를 씁니다. -count -q의 칸: QUOTA · REM_QUOTA · SPACE_QUOTA · REM_SPACE_QUOTA · DIR_COUNT · FILE_COUNT · CONTENT_SIZE · PATHNAME.- 흔한 실수: 이름 쿼터 10 이면 파일 10개가 들어간다고 여기는 것, 공간 쿼터의 남은 양만 보고 쓸 수 있다고 판단하는 것.
- 공식 문서: [HDFS Quotas Guide](https://hadoop.apache.org/docs/r3.5.0/hadoop-project-dist/hadoop-hdfs/HdfsQuotaAdminGuide.html) · [HDFS Commands — dfsadmin](https://hadoop.apache.org/docs/r3.5.0/hadoop-project-dist/hadoop-hdfs/HDFSCommands.html#dfsadmin) · [FileSystem Shell — count](https://hadoop.apache.org/docs/r3.5.0/hadoop-project-dist/hadoop-common/FileSystemShell.html#count) · [WebHDFS — Get Content Summary](https://hadoop.apache.org/docs/r3.5.0/hadoop-project-dist/hadoop-hdfs/WebHDFS.html#Get_Content_Summary_of_a_Directory)
8个步骤
- 이름 쿼터 걸기
- 10 인데 몇 개가 들어가나
- 공간 쿼터 걸기
- 1바이트가 막힌다
- 블록을 작게 잡으면 들어간다
- count -q 로 두 쿼터 읽기
- 옮기기도 쿼터에 걸린다
- 쿼터 문의에 답할 수 있게