2015-10-19 17 views
5

Thiết lập:

Tôi có bảng HBase, với 100M + hàng và 1 Triệu + cột. Mỗi hàng có dữ liệu chỉ từ 2 đến 5 cột. Chỉ có 1 cột gia đình.Chúng ta có thể lấy tất cả các tên cột từ bảng HBase không?

Vấn đề:

Tôi muốn tìm hiểu tất cả các biệt qualifiers (cột) trong column family này. Có cách nào nhanh chóng để làm điều đó không?

Tôi có thể nghĩ đến việc quét toàn bộ bảng, sau đó nhận được familyMap cho mỗi hàng, nhận qualifier và thêm nó vào Set<>. Nhưng điều đó sẽ rất chậm, vì có 100M + hàng.

Chúng ta có thể làm tốt hơn không?

Trả lời

1

HBase có thể được hình dung như một phân NavigableMap<byte[], NavigableMap<byte[], NavigableMap<byte[], NavigableMap<Long, byte[]>>>>

không "siêu dữ liệu" (nói điều gì đó lưu trữ tập trung tại các nút chính) về danh sách của tất cả các vòng loại đó là có sẵn trong tất cả các máy chủ khu vực.

Vì vậy, nếu bạn có trường hợp sử dụng một lần, cách duy nhất để bạn có thể quét toàn bộ bảng và thêm tên định danh vào một Set<>, như bạn đã đề cập.

Nếu đây là trường hợp sử dụng lặp lại (cộng với nếu bạn có ý định thêm thành phần vào ngăn xếp công nghệ của mình), bạn có thể cân nhắc thêm Redis. Đặt vòng loại có thể được duy trì theo kiểu phân phối bằng cách sử dụng Redis Set.

0

Bộ xử lý HBase có thể được sử dụng cho trường hợp này. Bạn có thể viết triển khai EndPoint tùy chỉnh hoạt động như Thủ tục lưu sẵn trong RDBMS. Nó thực thi mã của bạn ở phía máy chủ và nhận các cột riêng biệt cho mỗi vùng. Trên máy khách, bạn có thể nhận được các cột riêng biệt trên tất cả các vùng.

Lợi ích hiệu suất: Tất cả các cột không được chuyển cho khách hàng dẫn đến giảm cuộc gọi mạng.

2

Bạn có thể sử dụng Mapreduce cho việc này. Trong trường hợp này, bạn không cần phải cài đặt một lib tùy chỉnh cho hbase như trong trường hợp đối với bộ xử lý đồng bộ. Bên dưới mã để tạo tác vụ Mapreduce.

thiết lập Job

Job job = Job.getInstance(config); 
    job.setJobName("Distinct columns"); 

    Scan scan = new Scan(); 
    scan.setBatch(500); 
    scan.addFamily(YOU_COLUMN_FAMILY_NAME); 
    scan.setFilter(new KeyOnlyFilter()); //scan only key part of KeyValue (raw, column family, column) 
    scan.setCacheBlocks(false); // don't set to true for MR jobs 


    TableMapReduceUtil.initTableMapperJob(
      YOU_TABLE_NAME, 
      scan,   
      OnlyColumnNameMapper.class, // mapper 
      Text.class,    // mapper output key 
      Text.class,    // mapper output value 
      job); 

    job.setNumReduceTasks(1); 
    job.setReducerClass(OnlyColumnNameReducer.class); 
    job.setReducerClass(OnlyColumnNameReducer.class); 

Mapper

public class OnlyColumnNameMapper extends TableMapper<Text, Text> { 
    @Override 
    protected void map(ImmutableBytesWritable key, Result value, final Context context) throws IOException, InterruptedException { 
     CellScanner cellScanner = value.cellScanner(); 
     while (cellScanner.advance()) { 

      Cell cell = cellScanner.current(); 
      byte[] q = Bytes.copy(cell.getQualifierArray(), 
           cell.getQualifierOffset(), 
           cell.getQualifierLength()); 

      context.write(new Text(q),new Text()); 

     } 
} 

}

Giảm

public class OnlyColumnNameReducer extends Reducer<Text, Text, Text, Text> { 

    @Override 
    protected void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException {  
      context.write(new Text(key), new Text());  
    } 
} 
Các vấn đề liên quan