1 Star 7 Fork 0

yiidata / prestodb-hbase-connector

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README
Apache-2.0

易观presto-hbase-connector组件

组件基于Presto Connector接口规范实现,用来给Presto增加查询HBase的功能。

相比其他开源版本的HBase Connector,我们的性能要快10到100倍以上。

此版本基于 dev_prestodb-0.220_0.1.2 分支开发

变化:

  1. 此版本基于 dev_prestodb-0.220_0.1.2 分支开发
  2. 采用了最新的 prestodb 依赖,升级 hadoop/hbase 依赖到较新版本。
  3. hbase.properties 修改为以下:
   connector.name=hbase
   hbase.config.resources=/path/hbase/conf/hbase-site.xml,/path/hbase/conf/core-site.xml
   meta-dir=/path/presto-hbase-connector/example
  1. 此版本支持了 hbase 表名称模糊匹配 meta的能力。如hbase表,gxdata_202007 每月一张HBase表,如果没有 gxdata_202007.json 则会匹配 gxdata.json。意味着:如果没有确切名字的meta描述信息,则会采用前缀匹配,尽可能的获取 meta json。
  2. 支持 meta json 自动刷新,修改 meta json 不重启 presto 亦可获得新的schema;
  3. hbase result 反序列化 时增加 storageType 参数。序列化类型。默认 text。支持 binary(二进制值)、text(字面量);
  4. 删除了支持 Snapshot 相关,毕竟 HBase 就是一个基于key-value系统, 支持get,scan(prefix) 足以。其他的方式都不足以体现其特性,更不能作为常规使用。
  5. 添加 HBase 列转行特性, 见 explode_data.json;

列转行,一般用于 HBase 一个 row key 包含多个带有序列的COL,可以支持列转的行。如

row1   a_1:va1  b_1:va2  dt_1:1 col:val
       a_2:va4  b_2:va5  dt_2:2 col:val
       a_3:va6  b_3:va7  dt_3:3 col:val

row2   a_1:va8  b_1:va9  dt_1:3 col:val

如上数据,对于 row1 有 3 行,row2 有 1 行。 在 hbase 中是 2 个rowkey,但是在 presto 我们希望能查询出 4 行数据。如:

rowkey a    b    dt col
row1   va1  va2  1  val
row1   va4  va5  2  val
row1   va6  va7  3  val
row2   va8  va9  3  val

列转行对于 HBase ROW-KEY 多值的,但是需要在 schema 上展开来查询时非常有效。由 explodeColumn 配置按照那个列展开。如 上述数据 dt 列。 可知第一行数据有:1,2,3 个取值,则在获取Hbase result 时会组装 a_${num}, b_${num}, c_${num} 列进行取值。

当然,优先采用json设置的列名进行,如果cell 中没有改名称的列,则会采用上述行转列进行。

性能对比

环境 明细
数据量 事件表500万条数据,90个字段
节点数 3
硬件 16逻辑核 64G内存(其中Presto和HBase各占16G内存) 4T*2硬盘

analysys-hb-performance.png

详细测试结果参见:https://github.com/analysys/public-docs/blob/master/Attachment5(Presto-HBase-Connector-PerformanceTesting).xlsx

功能点对比

功能点 易观 其他
加盐查询 支持 不支持
拼接StartKey/EndKey 支持 不支持
批量Get查询 支持 不支持
谓词下推(Filter) 支持 不支持
ClientSideScan 支持 支持
Insert 支持 支持
Delete 支持 支持
建表语句 后续支持 支持

使用条件

  1. Mac OS X 或者 Linux
  2. Java 8 Update 161 或更高 (8u161+), 64-bit.
  3. Maven 3.3.9+ (编译)
  4. PrestoSql 315+

构建组件

mvn clean package

组件安装

1.配置hbase.properties

在{Presto_Config_Dir}/catalog目录下创建hbase.properties文件。配置完成后同步到所有worker节点。

以下是一个比较简单的配置样例,供大家参考:

connector.name=hbase
hbase.config.resources=/path/hbase/conf/hbase-site.xml
meta-dir=/path/presto-hbase-connector/example

参数说明如下:

  • connector.name

       该配置固定设置为hbase。
  • meta-dir

       存放HBase表元数据信息的目录。
  • hbase.config.resources

       配置 hbase site 文件地址的绝对路径或者相对路径 hbase-site.xml
2.配置namespace

完成hbase.properties的配置之后,需要在{meta-dir}目录创建HBase的namespace目录结构

  • {meta-dir}目录用来存放表的元数据信息。
  • 该目录下,首先按照hbase的namespace名创建目录。
  • 每一张表会有一个单独的json文件来保存它的表结构信息,json文件以{表名}.json来命名。
  • 不同namespace的表分别存放在各自的namespace目录下。

目录结构的样例如下:

--meta-dir:
	--namespace_a:
		table_a1.json
		table_a2.json
	--namespace_b:
		table_b1.json
		table_b2.json
	--default:
		table_c.json

这个例子中分别定义了namespace_a:table_a1、namespace_a:table_a2、namespace_b:table_b1、namespace_b:table_b2以及default命名空间下的 table_c这5张表。

此版本支持了 hbase 表名称模糊匹配 meta的能力。如hbase表,gxdata_202007 每月一张HBase表,如果没有 gxdata_202007.json 则会匹配 gxdata.json。意味着:如果没有确切名字的meta描述信息,则会采用前缀匹配,尽可能的获取 meta json。

3.配置表结构json

namespace目录创建完成之后,我们需要配置表结构json文件,下面讲解一下json文件中的属性:

表json:

属性名 描述
tableName 表名
schemaName Namespace
rowKeyFormat RowKey是由哪些字段组成,用英文逗号分隔。字段组成有序。
rowKeySeparator RowKey字段之间的分隔符,默认是\001
rowKeySaltUpperAndLower RowKey的盐值范围。上界和下界不能小于0,值之间用英文逗号分隔。例如:0,29
describe 表格描述
columns 字段列表
storageType 序列化类型。默认 text。支持 binary、text

columns json:

属性名 描述
family 列族名
columnName 字段名
isRowKey 是否行键
type 字段类型(大小写不敏感): string、int、bigint、double、boolean(用int存储,0代表false,1代表false)、array< string >
comment 字段备注

说明:isRowKey为true,表示我们把表的行键抽象成为了一个具体的字段。无论是查询、写入还是其他各种复杂操作,他在表面上与一个普通的字段没有任何区别,只不过在底层他作为表的行键有着其特殊的含义。

RowKey字段的类型必须为varchar。

以下是一个简单的json文件示例:

{
  "tableName": "t_event_test",
  "schemaName": "db_test",
  "rowKeyFormat": "xwhat,xwho",
  "rowKeySaltUpperAndLower": "0,29",
  "describe": "Table for test!",
  "columns": [{
    "family": "",
    "columnName": "rowkey",
    "comment": "The RowKey column of table!",
    "type": "varchar",
    "isRowKey": true
  }, {
    "family": "f",
    "columnName": "xwho",
    "comment": "Column for test!",
    "type": "varchar",
    "isRowKey": false
  }, {
    "family": "f",
    "columnName": "ds",
    "comment": "Column for test!",
    "type": "varchar",
    "isRowKey": false
  }],
  "rowKeySeparator": "-"
}

根据表的namespace找到它在{meta-dir}中对应的目录,按照上述说明创建以表名命名的json文件。

4.编译组件jar包

完成上述步骤之后,接下来需要编译组件jar包

// 下载组件源码
// 使用maven构建组件的jar包
mvn clean package
5.部署组件jar包

在{plugin.dir}目录下创建插件目录hbase(目录名称可任意设置)。

将构建好的prestodb-hbase-{version.num}.jar拷贝到该目录下,并同步到所有的worker节点上。

6.重启presto集群

Insert操作

在dev_0.1.1版本支持了写入操作。写入操作需要用户以字段拼接或者固定值的方式,指定数据的row_key。如下:

insert into hbase.db_test.test_event(row_key, xwho, distinct_id, ds, xwhen, xwhat, attri_1) select '01-test_rowkey' as row_key, xwho, distinct_id, ds, xwhen, xwhat, attri_1 from hbase.db_test.test_event_v2 where xwhen=1562057346821;

insert into hbase.db_test.test_event(row_key, xwho, distinct_id, ds, xwhen, xwhat, attri_1) select concat('01-', xwho, '-', xwhat, '-', xwhen) as row_key, xwho, distinct_id, ds, xwhen, xwhat, attri_1 from hbase.db_test.test_event_v2 where xwhat='login';

Delete操作

在meta_0.1.1版本支持了删除操作。删除操作不需要用户在sql中指明数据的row_key的值,但是要求所操作的表在定义其元数据的json文件中,必须设置了row_key字段。connector在筛选出所要删除的数据时,会获取到数据的row_key,然后根据row_key的值删除指定的数据。sql示例如下:

delete from hbase.db_test.test_event where xwhen >= 1562139516028;

查询优化

1.使用盐值

盐值就是指给每个RowKey增加一组可逆向还原的随机数字作为前缀。这样可以将数据分散到多个region存储,查询时也可以通过多线程并发查找。在presto中就可以利用这个机制将数据切分成多个split并发查找。经过验证,使用盐值可以使性能提升几十倍以上。

在组件中使用盐值需要在json文件中设置以下两个属性:

  • rowKeySaltUpperAndLower

    该属性用来定义盐值的数值范围,如果设置为"0,29",则会从00到29依次生成30对startKey和endKey,每一对startKey和endKey会交给一个split去做数据扫描。如下:
    (00, 00|)
    (01, 01|)
    (02, 02|)
    ......
    (29, 29|)
  • rowKeySeparator

    RowKey的不同组成部分之间的分隔符,默认是\001
2.根据RowKey的组成拼接StartKey和EndKey

这是指根据RowKey是由哪些字段组成的,以及当前查询的谓词来拼接查询StartKey和EndKey。

例如,当RowKey的构成如下:

xwhat-xwho

而SQL是:

select xwhat, xwho, date, xwhen from t_event_test where xwhat='login' and xwho in ('drew', 'george');

这样就会生成如下两对StartKey和EndKey:

(login-drew, login-drew|)
(login-george, login-george|)

要实现这样的查询优化机制,我们需要配置以下两个参数:

  • rowKeyFormat

       定义RowKey是由哪些字段有序组成。以刚才的例子来说,这里应该配置为"xwhat,xwho"
  • rowKeySeparator

       RowKey的不同组成部分之间的分隔符,默认是\001。以刚才的例子来说,这里应该配置为"-"

如果想查看sql具体切分出了哪些split,可以将日志级别设置为info,在server.log中查看。

3.批量get

批量get就是HBase的API中将所要查询的多个RowKey封装成一个List< Get >,然后请求这个列表以获取数据的查询方式。

这种查询方式使用起来非常便利,可以直接将要查询的RowKey作为等值匹配的查询条件放到SQL中即可。

select * from t_event_test where rk in ('rk1', 'rk2', 'rk3');

当系统解析谓词时,会根据字段名是否与RowKey字段一致判断是否执行这一查询模式。

使用这个查询模式,要求必须在表的json文件中通过isRowKey指定RowKey字段。

注意:因为我们定义的RowKey字段是虚拟字段,所以对它做除等值查询之外的其他类型的查询都是没有逻辑意义的。

4.ClientSideRegionScanner

ClientSideRegionScanner是HBase在0.96版本新增的Scanner,他可以在Client端直接扫描HDFS上的数据文件,不需要发送请求给RegionServer,再由RegionServer扫描HDFS上的文件。 这样减少了RegionServer的负担,并且即使RegionServer处于不可用状态也不影响查询。同时,因为是直接读取HDFS,所以在负载较为均衡的集群中,可以基本实现本地读策略,避免了很多网络负载。

下图是本组件使用ClientSideRegionScanner与普通RegionScanner的性能对比,通过比较可以得出,大部分查询都有了30%以上的提升,尤其是接近全表扫描的查询性能提升更为明显:

ClientSide&NormalScanner.png

详细测试结果参见:https://github.com/analysys/public-docs/blob/master/Attachment6(Presto-HBase-Connector-PerformanceTesting-ClientSide).xlsx

使用ClientSide查询需要设置以下三个参数:

  • hbase-rootdir

    这个参数与hbase-site.xml的hbase.rootdir保持一致即可。

  • enable-clientSide-scan

    是否开启ClientSide查询模式。

  • clientside-querymode-tablenames

    定义哪些表需要使用ClientSide查询,表名之间用英文','间隔,例如:

    namespace_a:table_a,namespace_a:table_b,namespace_b:table_c

    如果所有表都要使用ClientSide查询,可以配置成*。

除以上三个参数之外,打包时还需要将运行环境中hadoop的core-site.xml和hdfs-site.xml两个配置文件拷贝到project的src/main/resources目录下

需要注意的是,ClientSideRegionScanner的查询是依赖Snapshot的,所以为了查询能获取到最新的数据,每次查询时都会自动创建一个命名规则如下的Snapshot:

"ss-" + schemaName + "." + tableName + "-" + System.nanoTime()

HBase最大可支持的Snapshot数为65536个,所以在使用ClientSideRegionScanner时最好能够做到定时清理过期Snapshot。

问题解决

1.如何让ClientSideRegionScanner可以查询Snappy压缩格式的HBase表?

你需要解决以下几个问题:

1) SnappyCodec找不到的问题

这是因为在Presto的classPath中缺少hadoop-common-2.7.3.jar这个jar包。因为我们是基于ambari搭建的presto,所以需要将这个jar包拷贝到/usr/lib/presto/lib目录下。

2) SnappyCodec无法转换为CompressionCodec的问题

经过定位发现Presto加载插件的类是采用自定义的PluginClassLoader,而SnappyCodec是采用AppClassLoader加载的。二者classLoader不同导致父类和子类不具备父子继承关系。

修改hbase-common-1.1.2.jar中代码,将SnappyCodec改为使用PluginClassLoader的方式加载解决了这个问题。需要修改的代码为hbase-common模块的org.apache.hadoop.hbase.io.compress.Compression类,修改方法如下:

  /**
   * Returns the classloader to load the Codec class from.
   */
  private static ClassLoader getClassLoaderForCodec() {
    /*修改前:
    ClassLoader cl = Thread.currentThread().getContextClassLoader();
    if (cl == null) {
      cl = Compression.class.getClassLoader();
    }*/
    // 修改后:
    ClassLoader cl = Compression.class.getClassLoader();
    if (cl == null) {
      cl = Thread.currentThread().getContextClassLoader();
    }
    
    if (cl == null) {
      cl = ClassLoader.getSystemClassLoader();
    }
    if (cl == null) {
      throw new RuntimeException("A ClassLoader to load the Codec could not be determined");
    }

用修改后的代码重新install maven仓库,再重新打组件jar包即可。

3) java.lang.UnsatisfiedLinkError: org.apache.hadoop.util.NativeCodeLoader.buildSupportsSnappy()Z

这是需要在jvm中增加hadoop的native snappy库。可以在presto的jvm.config中,增加如下配置:

-Djava.library.path={path to hadoop native lib}
4) java.io.IOException: java.lang.NoSuchMethodError: com.google.common.base.Objects.toStringHelper(Ljava/lang/Object;)Lcom/google/common/base/Objects$ToStringHelper;

这是因为guava在v20.0以上的版本去掉了com.google.common.base.Objects中实现的内部类ToStringHelper,以及几个toStringHelper的方法。

可以从低版本中将这些删除的代码增加到高版本的guava源码中,重新编译更新maven库中的guava-24.1-jre.jar之后,再重新构建presto-hbase.jar包。

并将guava-24.1-jre.jar上传到PrestoWorker的lib目录中。

或者使用maven的shade插件来解决这类jar包冲突的问题。

5) Stopwatch的构造函数找不到

将guava的com.google.common.base.Stopwatch类中的构造函数改为public即可。

或者使用shade来解决这类jar包冲突的问题。

6)Caused by: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.security.AccessControlException): Permission denied: user=presto, access=WRITE, inode="/apps/hbase/data/data/db_moredatatest/multifamily_90cq_7cf_500w_snappy2/dee9b34c5cd8ee34f74ff5fc5446432a/.tmp":hbase:hdfs:drwxr-xr-x

权限不足,因为hbase对自身的数据文件权限都是hbase用户之下,而我们通过presto查询使用的是presto用户,需要给presto用户授予读取权限。

2.如何在Idea中debug开发ClientSideRegionScanner查询以Snappy格式进行压缩的HBase表?

你需要解决以下几个问题:

1) 找不到类CanUnbuff

在presto-hbase-connector模块中增加如下dependency:

<dependency>
	<groupId>com.facebook.presto.hadoop</groupId>
	<artifactId>hadoop-apache2</artifactId>
	<version>2.7.4-1</version>
</dependency>
2) 使用hbase-shaded-client和hbase-shaded-server依赖
3) 参考“SnappyCodec无法转换为CompressionCodec的问题”部分,修改hbase-common模块的代码,并重新编译更新maven库。其中hbase-shade-client、hbase-shade-server和hbase-common这三个模块必须重新编译。
4) 在idea的run->Edit Configuration中配置-Djava.library.path到PrestoServer的VM options中。java.library.path就是hadoop的native snappy库路径。

更新说明

1. meta-0.1.1
  • 支持ClientSide查询功能。
2. meta-0.1.2
  • 实现写入和删除的功能。
  • 解决使用ClientSide方式查询default命名空间下的表报错表名不一致的问题。
  • 将参数enable-clientSide-scan默认设置为false。将参数hbase-rootdir的值设置为可空。
  • 增加参数zookeeper-znode-parent。
3. meta-0.1.3
  • 将connector迁移到PrestoSql-315版本。
  • 提供一个基于PrestoDb-0.221实现的可用版本,分支名为dev_prestodb-0.221_0.1.2。
  • 修改doc文档。
Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

简介

易观 presto-hbase 连接器,prestodb 分支。 https://github.com/analysys/presto-hbase-connector/ 采用了最新的 prestodb 依赖,升级 hadoop/hbase 依赖到较新版本。 展开 收起
Java
Apache-2.0
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
1
https://gitee.com/yiidata/prestodb-hbase-connector.git
git@gitee.com:yiidata/prestodb-hbase-connector.git
yiidata
prestodb-hbase-connector
prestodb-hbase-connector
master

搜索帮助