ORM-HBASE軽量マッピングフレームワーク

6186 ワード

背景
HBAseはbillionレベルを処理する能力に疑問はなく、mongodb、cassandra、redisなど、他のnosqlデータベースよりも優れており、強力なrowkeyクエリー、fileter、コプロセッサなどに合わせて、大量のデータベースで強力な機能を発揮しています.しかしHBAseはCAPの原則でCとPを満たすため,クエリ中に文のサポートが弱く,使用過程が複雑である.下の痛みがあります.
痛い点
  • まずHBAseはbyte配列のデータしか格納できず、hbaseにデータを格納する際には対応する変換が必要であり、読み取ったデータも対応する変換が必要であり、使用が面倒である.
  • 第二に、HBAseは使用中、filter、協処理の使用に関し、APIに詳しくなければ、手をつけることができない.
  • 第3に、hbase自体はページング機能を提供しておらず、ページングごとに現在読み込まれているrowkeyをコードに記録し、PageFilterを使用して一定数のrowkeyを読み取り、読み取りを継続し、プログラミングの複雑さが高い.
  • 最後に、hbaseに詳しくない開発者は、nosql、hbaseのno schemaを理解できず、リレーショナル・データベースでhbaseを操作することを望んでいる.

  • HBAse ORMフレームワーク
    以上の理由から、hibernateのようなオブジェクト関係マッピングフレームワーク(ORM)を書きたいという考えがあり、操作オブジェクトのように操作しやすいHBAseデータベースを書きたいのですが、軽量級で侵入がなく、CURD、ページング、マッピング機能の単純な機能しか提供していません.
    いくつかの特性:
  • 注釈方式を用いてPO(Persistent Object)をHBAse対応テーブル
  • にマッピングする.
  • CRUDを提供する方法:createresearchupdatedelete
  • ページングクエリを提供する機能
  • は、hibernateにおけるCriteriaスタイルと同様の操作方法
  • を提供する.
    Demo:
    1、poオブジェクトに対応する注釈を追加する:@Table@RowKey@Column
     @Table(name = "user")</br>
     public class User {
    
      @RowKey
      private int id;
    
      @Column(family = "info")
      private int userId;
    
      @Column(family = "info", name = "user_name1")
      private String userName;
    
      @Column(family = "info")
      private long age;

    2.HBAseColumnarClientインスタンスを使用してPOオブジェクトを操作する
      HBaseColumnarClient client = new    HBaseColumnarClient(scanCaching, scanBatch);
      DataSourceConfig config = new DataSourceConfig("hbase.properties");
      HBaseSource source = new HBaseSource(config.getProperties());
      client.setHBaseSource(source);
    
      //create
      client.putObject(user);
    
      //delete
      client.deleteObject(user);
    
      //query
      User user = client.findObject(Bytes.toBytes(1), User.class);

    3、Hibernate Criteriaのようなスタイルの操作hbaseを提供する
      // count the data
      Filter[] filters = null;
      long count =
                   Criteria.aggregate(User.class).fromRow(startRow).toRow(endRow)
                                   .filters(filters).build().count(client);
    
      // sum the column value
      long sum =
                   Criteria.aggregate(User.class).fromRow(startRow).toRow(endRow)
                                   .filters(filters).propertyName("age").build().sum(client);
    
       // query by rowKey
                 User queryUser =
                             Criteria.find(User.class).byRowKey(Bytes.toBytes(id)).build().query(client);
    
       // query from startRow to endRow
      List<User> queryList =
                   Criteria.find(User.class).fromRow(startRow).toRow(endRow).build()
                                   .queryList(client);
    
      // query by page
      PageBean<User> pageBean = new PageBean<User>() {};
      pageBean.setPageSize(10);
      pageBean.setStartRow(startRow);
      pageBean.setStopRow(endRow);
      PageBean<User> queryPage =
                   Criteria.find(User.class).pageBean(pageBean).build().queryPage(client);
    
      // delete data
      byte[] rowKey = Bytes.toBytes(id);
      Criteria.delete(User.class).byRowKey(rowKey).build().excute(client); 

    このフレームワークが好きで、多くの意見項目の住所を提出することを望んでいます.https://github.com/zacharyzhanghao/orm-hbase