2017-05-20 2 views
0

안녕하십니까. 처음으로 TB 결재를 한 다음 20 밀리그램 증분을 삽입/업데이트/삭제와 같이 xml 형식으로 저장해야하는 애플리케이션을 개발했습니다. 이 5TB의 데이터 위에 적용됩니다. 그리고 마침내 요청에 따라 모든 데이터의 전체 스냅 샷을 생성하고 각 데이터가 해당 파일에 있어야하므로 논리를 기반으로 5K 텍스트 파일을 만들어야합니다.거대한 데이터를 저장하고 실시간으로 업데이트하기위한 HBase 솔루션이 없습니다.

HBase를 사용하여이 프로젝트를 수행했습니다. HBase에 10 개에서 500 개까지의 영역이있는 35 개의 테이블을 만들었습니다. HDFS에 데이터가 있고 mapreduce를 사용하여 데이터를 수용 Hbase 테이블에 대량로드합니다.

그 후 나는 모든 들어오는 XML 증분 파일을 구문 분석하고 HBase 테이블을 업데이 트하는 자바로 작성된 SAX 파서 응용 프로그램을 가지고 있습니다. XML 파일의 주파수는 분당 10 XML 파일과 2000 업데이 트의 총 있습니다. 증분 메시지가 엄격하게 정렬됩니다.

마지막으로 요청할 때 모든 마지막 Hbase 테이블을 스캔하고 5K 텍스트 파일을 만들어 클라이언트에 전달하기 위해 마지막 mapreduce 응용 프로그램을 실행합니다.

3 단계 모두 정상적으로 작동하지만 클러스터 된 공유 프로덕션 서버에 응용 프로그램을 배포하려고하면 HBase에서 전체 테이블 검사를 수행하기 때문에 인프라 팀에서 응용 프로그램을 실행할 수 없습니다.

나는 94 노드 클러스터를 사용했으며 가장 큰 HBase 테이블 데이터는 약 2 억입니다. 다른 모든 테이블은 수백만 개 미만의 데이터를 가지고 있습니다.

mapreduce가 텍스트 파일을 스캔하고 작성하는 데 걸리는 총 시간은 2 시간이 걸립니다.

이제 이것을 구현할 다른 해결책을 찾고 있습니다.

나는 레코드 레벨을 삽입/업데이트하고 매우 정확한 방식으로 삭제하기 때문에 HIVE를 사용할 수 있습니다.

또한 HBase 및 HIVE 테이블을 통합하여 증분 데이터 HBase 테이블이 사용되고 전체 테이블 스캔 HIVE가 사용됩니다. 그러나 HIVE가 Hbase 저장소 핸들러를 사용하기 때문에 HIVE 테이블에 파티션을 만들 수 없으므로 HIVE 전체 테이블 스캔이 매우 느리게도 10 배 더 느려집니다. 전체 테이블 스캔

현재 어떤 종류의 솔루션도 생각할 수 없습니다 붙어있어. HBase가 관련되지 않은 다른 솔루션을 도와주세요.

이 사용 사례에서는 AVRO 또는 파킹 파일을 사용할 수 있습니까?하지만 AVRO가 레코드 수준 업데이트를 지원하는 방법을 잘 모르겠습니다.

답변

0

나는 내 질문에 답할 것입니다. 내 문제는 지역 서버의 성능에 영향을 미치고 특히 공유 클러스터에서 HBase의 읽기 라이트 성능에 영향을주기 때문에 Hbase에서 전체 테이블 스캔을 수행하고 싶지 않다는 것입니다.

내 솔루션은 Hibernate를 사용하므로 열 업데이트 인 특별히 델타 업데이트에 유용합니다.

그래서 전체 테이블 스캔은 HBase 테이블의 스냅 샷을 HDFS로 내보내고 Hbase 테이블 스냅 샷에서 전체 테이블 스캔을 실행하지 않도록합니다. 여기

은 HBase를 스냅 샷에 럼 맵리 듀스 로컬 HDFS에

snapshot 'FundamentalAnalytic','FundamentalAnalyticSnapshot' 

수출 스냅 샷 과정

만들기 스냅 샷에 대한 자세한 단계

hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot -snapshot FundamentalAnalyticSnapshot -copy-to /tmp -mappers 16 

드라이버 작업 구성입니다

String snapshotName="FundamentalAnalyticSnapshot"; 
Path restoreDir = new Path("hdfs://quickstart.cloudera:8020/tmp"); 
String hbaseRootDir = "hdfs://quickstart.cloudera:8020/hbase"; 



TableMapReduceUtil.initTableSnapshotMapperJob(snapshotName, // Snapshot name 
         scan, // Scan instance to control CF and attribute selection 
         DefaultMapper.class, // mapper class 
         NullWritable.class, // mapper output key 
         Text.class, // mapper output value 
         job, 
         true, 
         restoreDir); 

또한 Hbase 스냅 샷에서 mapreduce를 실행하면 Hbase 테이블에서 스캔을 건너 뛰고 지역 서버에 영향을 미치지 않습니다.

-1

HBase를 효율적으로 사용하기위한 핵심은 DESIGN입니다. 좋은 디자인으로 전체 스캔을 할 필요가 없습니다. 그것은 HBase가 만들어진 것이 아닙니다. 대신 Filter를 사용하여 스캔을 수행 할 수있었습니다. HBase가 효율적으로 처리 할 수 ​​있도록 제작되었습니다.

디자인을 지금 확인할 수 없지만 꼭해야 할 것 같습니다.

아이디어는 HBase 테이블을 RDBMS 테이블을 가지고 키가 좋은 행 키를 디자인하는 방식으로 디자인하는 것이 아닙니다. rowKey가 잘 작성 되었다면 절대 전체 스캔을 수행하지 않아야합니다.

행 키가 아닌 다른 열을 사용하여 테이블에 액세스하려면 Apache Phoenix와 같은 프로젝트를 사용할 수도 있습니다. 그것은 또한 잘 수행됩니다.나는 Phoenix와 좋은 경험을했습니다.

+0

성능상의 문제가 없습니다. 400GB의 데이터 크기를 갖는 2 억 개의 레코드로 시도한 결과 좋은 성능을 얻었습니다. 12 분 내에 완료되었습니다.하지만 내 관심사는 전체 테이블입니다. 공유 클러스터에 배포됩니까? – SUDARSHAN

+0

물론 전체 테이블 스캔은 성능에 영향을 미칩니다. 행키를 다시 디자인하고 필터를 사용하려고합니다. 또는 Apache Phoenix를 배치 한 다음 RDBMS의 테이블처럼 HBase 테이블에 액세스하십시오. – okmich

관련 문제