TeraSort 벤치마크는 세 단계로 이루어진다. teragen 이 정렬할 데이터를 만들고, terasort 가 정렬하며, teravalidate 가 결과가 실제로 정렬됐는지 확인한다. 세 프로그램 모두 Hadoop 예제 jar 에 들어 있다.
레코드는 100바이트 고정 길이(키 10바이트 + 값 90바이트)다. 그래서 레코드 수에 100을 곱하면 대략의 생성 크기가 나온다. 1억 개면 약 10GB, 10억 개면 약 100GB 다.
ls /opt/cloudera/parcels/CDH/lib/hadoop-mapreduce/hadoop-mapreduce-examples.jar
ls $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar
Cloudera 배포판은 parcel 경로 아래에 있고, 아파치 배포본은 share/hadoop/mapreduce 아래에 버전이 붙은 이름으로 있다.
JAR=/opt/cloudera/parcels/CDH/lib/hadoop-mapreduce/hadoop-mapreduce-examples.jar
OUT=/user/$(whoami)/terasort
hdfs dfs -rm -r -skipTrash ${OUT}-in ${OUT}-out ${OUT}-val 2>/dev/null
hadoop jar $JAR teragen \
-Dmapreduce.job.maps=100 \
-Dmapreduce.map.memory.mb=2048 \
-Dmapreduce.map.java.opts=-Xmx1638m \
100000000 ${OUT}-in
hadoop jar $JAR terasort \
-Dmapreduce.job.reduces=100 \
${OUT}-in ${OUT}-out
hadoop jar $JAR teravalidate ${OUT}-out ${OUT}-val
출력 디렉터리가 이미 있으면 작업이 시작도 하지 않고 실패한다. 매번 지우고 시작한다.
teragen 은 map 만 있는 작업이라 맵 수가 곧 병렬도다. 클러스터 코어 수에 맞춰 잡는다. terasort 는 리듀스 수가 출력 파일 수가 되며, 이 값이 작으면 정렬 단계가 병목이 된다.
hdfs dfs -du -h -s /user/$(whoami)/terasort-in
hdfs dfs -ls /user/$(whoami)/terasort-out | head
yarn application -list -appStates FINISHED
경과 시간은 ResourceManager 웹 UI 나 mapred job -history 에서 본다. teravalidate 의 출력 디렉터리에 오류 파일이 비어 있으면 정렬이 정상이다.
teragen 은 쓰기 위주라 HDFS 쓰기 대역과 DataNode 디스크 성능을 본다. terasort 는 셔플이 크게 일어나므로 네트워크와 로컬 디스크(중간 결과 저장) 성능이 함께 드러난다. 둘의 결과를 나누어 보면 병목이 저장소인지 네트워크인지 가늠할 수 있다.
같은 클러스터에서 반복 비교할 때만 의미가 있다. 다른 클러스터와의 절대 비교는 노드 수·디스크 종류·복제 계수가 모두 달라 성립하지 않는다.