시퀀스 파일에 저장된 많은 작은 파일을 처리하기 위해 Hadoop을 사용하려고합니다. 내 프로그램은 입출력 제한이이므로 IO 입출력이 충분히 높도록하고 싶습니다.HDFS 시퀀스 파일 성능 튜닝
시퀀스 파일에서 작은 샘플 파일을 읽고이 파일을 램 디스크 (/ dev/shm/test /)에 쓰는 MR 프로그램을 작성했습니다. 아무런 계산없이 RAM 디스크에 기록 된 파일을 삭제하는 또 다른 독립 실행 형 프로그램이 있습니다. 따라서 테스트는 거의 순수 IO 바운드이어야합니다. 그러나 IO 처리량이 예상 한만큼 좋지 않습니다.
나는 5 개의 데이터 노드를 가지고 있으며 각 데이터 노드에는 5 개의 데이터 디스크가 있습니다. 각 디스크는 약 100MB/s 처리량을 제공 할 수 있습니다. 이론적으로이 클러스터는 100MB/s * 5 (디스크) * 5 (시스템) = 2500MB/s를 제공 할 수 있어야합니다. 그러나, 나는 대략 600MB/s 만 얻는다. "iostat -d -x 1"을 5 대의 컴퓨터에서 실행하고 입출력로드 균형이 맞지 않음을 발견했습니다. 일반적으로 디스크의 일부만 100 %의 사용률을 가지며 일부 디스크의 사용률은 10 % 이하입니다. 그리고 어떤 머신은 잠시 동안 IO 로딩을하지 않습니다. 여기에 스크린 샷이 있습니다.
여기 명령 "최고 -cd1"에 의한 쇼의 CPU 사용량이 다른 스크린 샷입니다 (물론 각 디스크/시스템에 대한 부하를 신속하게 다름) :
바로 여기에 좀 더 내 케이스에 대한 세부 구성 :
Hadoop 클러스터 하드웨어 : 128GB RAM 및 32 코어 CPU (실제로 2 Xeon E5-2650)를 장착 한 5 대의 Dell R620 시스템. 2 HDD는 CentOS 용 RAID 1 디스크와 HDFS 용 5 데이터 디스크로 구성됩니다. 따라서 위의 스크린 샷에서 6 개의 디스크를 볼 수 있습니다.
하둡 설정 : 블록 크기 128MB; 데이터 노드 핸들러 카운트는 8이다. 작업 추적자 당 15 개의지도; 2GB Map 하위 힙 프로세스를 줄입니다.
테스트 파일 세트 : 약 400,000 개의 작은 파일, 총 크기 320GB. 160 개의 시퀀스 파일에 저장되며 각 seq 파일의 크기는 약 2GB입니다. 나는 모든 파일을 다양한 크기의 seq 파일 (1GB, 512MB, 256MB, 128MB)로 저장하려했지만 성능은 많이 변하지 않았습니다.
전체 시스템이 100 % IO 처리량 (2500MB/s)을 가질 것으로는 기대하지 않지만, 40 % (1000MB/s)는 이상이 적당해야한다고 생각합니다. 누구나 성능 조정을위한 가이드를 제공 할 수 있습니까?
첨부 된 스크린 샷이 크기가 조정 된 후 충분히 명확하지 않아서 스크린 샷을 imagesHack에 게시합니다. 디스크 : http://imageshack.us/photo/my-images/201/diskz.jpg/ CPU : http://imageshack.us/photo/my-images/28/cpuzo.jpg/ – avhacker