2012-01-22 33 views
10

Tôi cần phải viết một công việc MapReduce mà Gets tất cả các hàng trong một phạm vi ngày nhất định (nói cuối cùng một tháng). Nó đã là một lối đi chơi bánh có My Row Key bắt đầu với Date. Nhưng truy vấn Hbase thường xuyên của tôi là trên các giá trị bắt đầu của khóa.Làm thế nào để quét HBase hàng hiệu quả

Phím Hàng của tôi chính xác là A | B | C | 20120121 | D. Trường hợp kết hợp của A/B/C cùng với ngày (theo định dạng YearMonthDay) tạo một ID hàng duy nhất.

Bảng HBase của tôi có thể có tối đa vài triệu hàng. Mapper của tôi có nên đọc tất cả các bảng và lọc từng hàng nếu nó nằm trong phạm vi ngày nhất định hay Quét/Bộ lọc có thể giúp xử lý tình huống này không?

Ai đó có thể đề xuất (hoặc một đoạn mã) một cách để xử lý tình huống này một cách hiệu quả?

Cảm ơn -Panks

+0

Tại sao bạn không sao chép nội dung của bảng sang bảng mới có khóa được sắp xếp lại và xóa phần cũ? – Mario

+0

@Mario nếu bảng có một nghìn tỷ khóa thì sao? Và anh ta cần phải làm điều này thường xuyên? – markg

Trả lời

5

Bạn có thể sử dụng số RowFilter với số RegexStringComparator. Bạn cần phải đưa ra một RegEx để lọc ngày tháng của bạn một cách thích hợp. This page có một ví dụ bao gồm việc đặt Bộ lọc cho máy quét MapReduce.

+1

Nếu Rowkey là tiện dụng, hiệu suất tốt nhất là với Get. Nếu kết quả trả về là quá lớn đối với một hàng, thì Scan with get và batchSize là tùy chọn tốt hơn/an toàn hơn. –

0

Tôi chỉ bắt đầu với HBase, bloom filters có thể giúp đỡ.

+1

Bộ lọc Bloom sẽ không trợ giúp ở đây trừ khi anh ta biết chính xác khóa. –

+0

Cảm ơn Chris - bộ lọc nở lưu trữ dữ liệu tiêu hóa thay vì dữ liệu thực tế để sử dụng bộ nhớ một cách hiệu quả - vì vậy, việc so khớp mẫu không thể thực hiện được. –

0

Bạn có thể sửa đổi Quét mà bạn gửi vào Công cụ lập bản đồ để bao gồm một bộ lọc. Nếu ngày của bạn cũng là dấu thời gian ghi, thật dễ dàng:

Scan scan = new Scan(); 
scan.setTimeRange(minTime, maxTime); 
TableMapReduceUtil.initTableMapperJob("mytable", scan, MyTableMapper.class, 
    OutputKey.class, OutputValue.class, job); 

Nếu ngày trong khóa hàng khác nhau, bạn sẽ phải thêm bộ lọc vào quá trình quét. Bộ lọc này có thể hoạt động trên một cột hoặc một khóa hàng. Tôi nghĩ rằng nó sẽ được lộn xộn với chỉ là chìa khóa hàng. Nếu bạn đặt ngày trong cột, bạn có thể tạo FilterList trong đó tất cả các điều kiện phải đúng và sử dụng CompareOp.GREATERCompareOp.LESS. Sau đó, sử dụng scan.setFilter(filterList) để thêm bộ lọc của bạn vào quá trình quét.

+0

bộ lọc setTimeRange trên tem thời gian, không phải khóa hàng. –

10

Bộ lọc RowFilter có Bộ lọc RegEx sẽ hoạt động nhưng không phải là giải pháp tối ưu nhất. Hoặc bạn có thể thử sử dụng các chỉ mục phụ.

Một giải pháp khác là thử FuzzyRowFIlter. Một FuzzyRowFilter sử dụng một loại chuyển tiếp nhanh, do đó bỏ qua nhiều hàng trong quá trình quét tổng thể và do đó sẽ nhanh hơn một quét RowFilter. Bạn có thể đọc thêm về nó here.

Hoặc BloomFilters cũng có thể trợ giúp tùy thuộc vào lược đồ của bạn. Nếu dữ liệu của bạn là rất lớn, bạn nên làm một phân tích so sánh về chỉ số thứ cấp và Bloom Filters.

Các vấn đề liên quan