neptune의 read 최대 성능

Hbase와 neptune 성능 비교 테스트 중 read에 대한 최대 성능이 어떻게 될까 하는 의문점에 다음과 같은 내용을 테스트 하였습니다.
Hbase, neptune 등과 같이 hadoop을 데이터 파일 저장소로 이용하는 데이터 관리 시스템의 경우 최대 성능은 전적으로 hadoop의 성능에 의존됩니다. write의 경우 memory에 먼저 기록한 다음에 백그라운드에서 hadoop에 쓰거나 neptune의 경우 change log filesystem에 직접 쓰기 때문에 hadoop의 write 성능과는 무관합니다. 반대로 read의 경우에는 모든 데이터 파일이 hadoop에 저장되어 있고 read 요청이 올 때 hadoop으로부터 데이터를 읽기 때문에 hadoop의 성과 밀접한 관계를 가지고 있습니다.
hbase, neptune과 같은 데이터 관리 시스템의 read 연산은 다음과 같은 순서로 진행됩니다.

1. data file open
2. seek(index off set)
3. read record
4. file close

이런 방식으로 처리할 경우 hadoop의 최대 성능이 어느 정도 인지 테스트를 해 보았습니다.

FileSystem fs = FileSystem.get(new Configuration());

Path path = new Path("/test/map.dat");
long fileLen = fs.getFileStatus(path).getLen();
Random rand = new Random();
long startTime = System.currentTimeMillis();
for(int i = 0; i < 1000; i++) {
  FSDataInputStream in = new FSDataInputStream(fs.open(path));
  int skip = rand.nextInt((int)fileLen - 2000);
  in.seek(skip);
 
  byte[] buf1 = new byte[20];
  in.readInt();
  in.readFully(buf1);
  in.readInt();
  byte[] buf2 = new byte[1000];
  in.readFully(buf2);
  in.close();
}
System.out.println((System.currentTimeMillis() - startTime));



1000건 데이터 처리하는데 평균 1500 ~ 2000 ms 정도 소요됩니다. 다시 말해 1건 처리하는데 1.5 ~ 2 ms, TPS로 바꾸면 500 ~ 666 TPS가 나옵니다.
hadoop의 경우 file을 open하기 위해서도 RPC 통신을 하기 때문에 file open 처리하는 부분은 for loop 밖에 둘 경우에도 1000 ms 정도 소요되었습니다. 이 경우 최대 처리 가능한 속도는 1000 TPS 입니다.
Hbase 0.18 버전이나 neptune의 read 속도가 500  tps 정도가 나오는 것이 어찌보면 당연한 것 같습니다.
Hbase 0.19는 이런 단순 물리적인 한계를 극복하기 위해 cache를 사용하고 있습니다. 이부분에 대해서는 다음 글에서 자세하게 다루기로 하겠습니다.

크리에이티브 커먼즈 라이센스
Creative Commons License

Posted by 김형준


Trackback URL : http://www.jaso.co.kr/trackback/320

Leave a comment
« Previous : 1 : ... 117 : 118 : 119 : 120 : 121 : 122 : 123 : 124 : 125 : ... 388 : Next »