2014-01-08 1 views
2

'A'라는 한 열 패밀리가있는 테이블이 있습니다. 런타임에 (키 - 값) 쌍을 테이블에 삽입합니다. 내 디자인에, 멀리 RowKey를 남겨, 열 규정그래서, 열 qualifers 동적을 생성 (키) MD5, 그리고 의지는 해당 값이 포함되어 있습니다.동적으로 생성 된 열 한정자가 많은 HBase 성능 (열 패밀리 내)

예 : 각 차량에 번호판이 있습니다. HBase의 모든 테이블을 하나의 테이블에 삽입하고 싶습니다. 차량 A는 rowkey에게 R1을 갖고, 열 규정가 C1이고, 은 A. 차 B의 번호판 R2는, 열 규정는 C2이다 rowkey가 가의 번호판이다 갖는다이고, 그 반대의 경우도 마찬가지입니다. 스키마를 사용하여 명령을 실행할 때 행 키 = R1은 열 한정자 C2 반환에 포함 된 셀입니다 (이 경우 명확한 null입니다)?

좀 공연에 대한 질문 물어보고 싶은

:이 스키마 디자인

  1. 스캔 명령의 성능 감소를합니까? (테이블의 모든 값을 스캔하려고합니다). 각 행에서 모든 열이 반환됩니까?

  2. 위의 요구 사항을 충족하면 누구든지이 테이블을 디자인하는 올바른 방법을 가르쳐 줄 수 있습니까?

대단히 감사합니다.

답변

2

아니요, 스캔 성능이 저하되지 않습니다. HBASE의 아름다움입니다.

비슷한 종류의 구조와 거대한 데이터 세트를 처리했으며 검색 속도가 놀라 울 정도로 빨랐습니다.

그런 시나리오를 처리하기 위해 HBFER에 다른 filters이 많은 도움이 될 것이라고 생각합니다.

또한 HBASE 필터를 참조 할 수도 있습니다. HBASE:Defenitive guide. HBASE의 좋은 필터 중 하나는 접두사 필터입니다. 당신이 자바에서 작업하는 경우 여기

Scan s = new Scan(); 
Filter filter = new PrefixFilter(Bytes.toBytes("car_"+i)); 
s.setFilter(filter); 

다른 자동차의 대한 rowkeys이 될 수 다소 같을 것이다 "car_ [liscence 번호 또는 자동차 번호]."그래서 당신은 단지 하나를 추출 할 경우에도 행의 lakhs 밖으로 행이 몇 초 안에 할 수 있습니다.

1

HBase는 데이터를 스파 스 형식으로 저장합니다. 모든 셀은 '키, 열 패밀리, 열 수식어, 버전, 값'으로 저장됩니다. 테이블을 검사하면 값이있는 열 한정자 만 생성됩니다. 디자인이 전체 테이블에서 본질적으로 고유 한 컬럼 한정자를 지정하더라도 테이블을 스캔하는 동안 각 행은 설명에 따라 정확히 하나의 값을 생성하며 열 한정자에 대한 관련없는 null 값은 반환되지 않습니다 다른 행에 정의되어 있습니다.

이미 테이블에 대한 디자인을 설명했습니다. 더 이상의 문제없이 구현할 수 있습니다. 디자인 문제는 잘 수행 할 디자인을 선택했는지 이해하기 위해 유스 케이스 측면에서 표현해야합니다.

2

행 키, 패밀리 및 한정자 (실제 "키"를 만들기 위해 결합 된)가 많이 복제 될 수 있으므로 많은 경우 미세 입자 셀이적일 수 있습니다. 이렇게하면 데이터 공간이 차지하는 공간이 늘어나고 액세스 속도에 영향을줍니다. 이 문제가 당신에 적용되는 경우, 당신은 몇 가지 다른 방법으로 더 큰 신체적, "다중 셀"에 함께 논리적 세포를 병합 고려할 수

:

  • "구조체"에 형제 필드를 포장함으로써, 방법 필드 멤버를 클래스로 결합 할 수 있습니다.
  • 공통 한정자 접두사 (예 : 각 MD5의 첫 번째 절반)가있는 셀을 조인합니다. 접두어 유사성이 액세스 지역을 의미하는 경우 특히 유용합니다.

비슷한 아이디어가 포함 된 방법을 설명하는 OpenTSDB slide deck이 있습니다.

최신 버전의 HBase에서는 trie 기반 데이터 블록 인코딩을 사용할 수 있습니다. 이 데이터 구조는 자연스럽게 디스크상의 접두사 중복을 제거하여 이러한 종류의 스키마 트릭에 대한 필요성을 덜어줍니다. HBASE-4676HBASE-7162을 참조하십시오.

0

나는 공연에 대한 몇 가지 질문을 물어보고 싶은 :이 스키마 디자인으로

  1. 를 스캔 명령의 성능 감소를합니까? (모든 값을 테이블에서 스캔하고 싶습니다). 각 행에서 모든 열이 반환됩니까?

  2. 위의 요구 사항을 충족하면 누구든지이 테이블을 디자인하는 올바른 방법을 가르쳐 줄 수 있습니까? 특정 행의 키 추가되었습니다

  1. 호 열만.
  2. 동적으로 생성 된 한정자가 필요한 이유는 무엇입니까? 모든 행 키에 동일한 한정자 이름을 사용하는 것이 좋습니다. 예를 들어, 열 가족 'car-info'와 한정자 'license-plate'뿐 아니라 'make', 'model', 'year'등을 가질 수 있습니다.
관련 문제