Hadoop Benchmarking

Hadoop Benchmarking

이 문서는 Hadoop이 제공하는 도구를 이용해 Hadoop의 성능(benchmark)을 측정하는 방법을 안내합니다. 특히 네임노드(NameNode)의 처리 성능을 측정하는 NNThroughputBenchmark를 중심으로, 명령어 사용법과 결과 해석 방법을 다룹니다.

출처: Hadoop Benchmarking

NNThroughputBenchmark

개요 (Overview)

NNThroughputBenchmark는 이름 그대로 네임노드 처리량(throughput) 벤치마크입니다. 단일 노드에서 여러 클라이언트 스레드를 실행해 네임노드에 요청을 보냅니다. 네임노드가 설정되어 있지 않으면 같은 프로세스 안에서 네임노드를 먼저 시작하는데, 이 경우 각 클라이언트는 네임노드 메서드를 직접 호출하며 동일한 작업을 반복 수행합니다(스탠드얼론 모드, standalone mode). 반대로 네임노드가 설정되어 있으면 클라이언트 프로토콜 RPC를 통해 원격 네임노드에 작업을 수행합니다(원격 모드, remote mode).

어느 경우든 모든 클라이언트는 서로 다른 노드가 아니라 단일 프로세스 안에서 로컬로 실행됩니다. RPC 연결과 직렬화(serialization)로 인한 통신 오버헤드를 없애 순수한 네임노드 성능의 상한을 드러내기 위해서입니다.

벤치마크는 먼저 각 스레드의 입력(input)을 생성하여, 입력 생성 오버헤드가 결과 통계에 영향을 주지 않게 합니다. 각 스레드가 수행하는 연산 수는 사실상 동일하며, 어느 두 스레드 사이의 연산 수 차이는 1을 넘지 않습니다. 그런 다음 지정된 스레드 수로 지정된 연산 수를 실행하고, 네임노드가 초당 처리한 연산 수를 측정해 통계를 출력합니다.

명령어 (Commands)

일반적인 명령줄 구문은 다음과 같습니다.

hadoop org.apache.hadoop.hdfs.server.namenode.NNThroughputBenchmark [genericOptions] [commandOptions]

일반 옵션 (Generic Options)

이 벤치마크는 Hadoop 명령줄의 일반 옵션(Generic Options)을 지원해 동작을 바꿀 수 있습니다. 다른 도구와 마찬가지로 fs.defaultFS 설정을 따르며, 이 값은 -fs 명령 옵션으로 덮어쓸 수 있습니다. 이를 바탕으로 스탠드얼론 모드 또는 원격 모드가 결정됩니다.

fs.defaultFS의 scheme이 지정되지 않았거나 file(로컬)이면 스탠드얼론 모드로 실행합니다. 특히 원격 네임노드에서는 dfs.namenode.fs-limits.min-block-size를 16으로 설정해야 하며, 스탠드얼론 모드에서는 벤치마크가 내부 네임노드의 최소 블록 크기 검증을 끕니다.

명령 옵션 (Command Options)

지원되는 모든 명령 옵션은 다음과 같습니다.

옵션 설명
-op 수행할 연산을 지정합니다. 반드시 제공해야 하며 첫 번째 옵션이어야 합니다.
-logLevel 벤치마크 실행 시 로깅 레벨을 지정합니다. 기본값은 ERROR입니다.
-UGCacheRefreshCount 지정된 연산 수마다 네임노드의 사용자 그룹 캐시(user group cache)를 비웁니다. 기본적으로 갱신은 호출되지 않습니다.
-keepResults 지정하면 실행 후 네임스페이스(namespace)를 정리하지 않습니다. 기본적으로 테스트 후 네임스페이스는 제거됩니다.
-nonSuperUser 지정하면 super user가 아닌 사용자도 도구를 사용할 수 있으며, 인가(authorization) 시간을 벤치마크 계산에 포함시키는 데 도움이 됩니다.
지원되는 연산 (Operations Supported)

지원되는 연산과 각 연산 전용 파라미터(모두 선택 사항) 및 기본값은 다음과 같습니다.

연산 옵션 연산 전용 파라미터
all 다른 연산들의 옵션
create [-threads 3] [-files 10] [-filesPerDir 4] [-close] [-baseDirName /nnThroughputBenchmark]
mkdirs [-threads 3] [-dirs 10] [-dirsPerDir 2] [-baseDirName /nnThroughputBenchmark]
open [-threads 3] [-files 10] [-filesPerDir 4] [-useExisting] [-baseDirName /nnThroughputBenchmark]
delete [-threads 3] [-files 10] [-filesPerDir 4] [-useExisting] [-baseDirName /nnThroughputBenchmark]
append [-threads 3] [-files 10] [-filesPerDir 4] [-useExisting] [-appendNewBlk] [-baseDirName /nnThroughputBenchmark]
fileStatus [-threads 3] [-files 10] [-filesPerDir 4] [-useExisting] [-baseDirName /nnThroughputBenchmark]
rename [-threads 3] [-files 10] [-filesPerDir 4] [-useExisting] [-baseDirName /nnThroughputBenchmark]
blockReport [-datanodes 10] [-reports 30] [-blocksPerReport 100] [-blocksPerFile 10] [-baseDirName /nnThroughputBenchmark]
replication [-datanodes 10] [-nodesToDecommission 1] [-nodeReplicationLimit 100] [-totalBlocks 100] [-replication 3] [-baseDirName /nnThroughputBenchmark]
clean N/A
연산 옵션 (Operation Options)

위 연산들로 벤치마크를 실행할 때는 다음처럼 연산 전용 파라미터를 제공합니다.

옵션 설명
-threads 해당 연산을 실행할 총 스레드 수.
-files 해당 연산에서 사용할 총 파일 수.
-dirs 해당 연산에서 사용할 총 디렉터리 수.
-filesPerDir 디렉터리당 파일 수.
-close 파일 생성 후 파일을 닫습니다.
-dirsPerDir 디렉터리당 디렉터리 수.
-useExisting 지정하면 네임스페이스를 다시 만들지 않고 기존 데이터를 사용합니다.
-datanodes 시뮬레이션할 총 데이터노드 수.
-reports 보낼 총 블록 리포트(block report) 수.
-blocksPerReport 리포트당 블록 수.
-blocksPerFile 파일당 블록 수.
-nodesToDecommission 폐기(decommission)할 시뮬레이션 데이터노드 수.
-nodeReplicationLimit 데이터노드의 최대 아웃바운드 복제 스트림 수.
-totalBlocks 작업할 총 블록 수.
-replication 복제 계수(replication factor). 데이터노드 수보다 크면 데이터노드 수로 조정됩니다.
-baseDirName 벤치마크의 기본 디렉터리 이름. 여러 클라이언트가 동시에 벤치마크를 제출할 수 있도록 지원합니다.
-blockSize 새 파일의 블록 크기.

리포트 (Reports)

벤치마크는 네임노드가 초당 수행한 연산 수를 측정합니다. 구체적으로 테스트한 각 연산에 대해 총 실행 시간(초, Elapsed Time), 연산 처리량(Ops per sec), 연산 평균 시간(Average Time)을 보고합니다. 값이 높을수록 좋습니다.

다음은 1K 스레드로 원격 네임노드에 100K 파일을 여는 명령을 실행했을 때의 리포트 예시입니다. 실제 벤치마크 통계는 "HDFS scalability: the limits to growth"를 참고하세요.

$ hadoop org.apache.hadoop.hdfs.server.namenode.NNThroughputBenchmark -fs hdfs://nameservice:9000 -op open -threads 1000 -files 100000

--- open inputs ---
nrFiles = 100000
nrThreads = 1000
nrFilesPerDir = 4
--- open stats  ---
# operations: 100000
Elapsed Time: 9510
 Ops per sec: 10515.247108307045
Average Time: 90

더 알아보기 (Learn more)