{"id":13849637,"url":"https://github.com/analysys/presto-hbase-connector","last_synced_at":"2026-01-24T21:41:23.473Z","repository":{"id":34351876,"uuid":"174451835","full_name":"analysys/presto-hbase-connector","owner":"analysys","description":"presto hbase connector 组件基于Presto Connector接口规范实现，用来给Presto增加查询HBase的功能。相比其他开源版本的HBase Connector，我们的性能要快10到100倍以上。","archived":false,"fork":false,"pushed_at":"2023-01-02T21:54:46.000Z","size":284,"stargazers_count":240,"open_issues_count":25,"forks_count":100,"subscribers_count":20,"default_branch":"master","last_synced_at":"2024-11-22T02:35:10.308Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/analysys.png","metadata":{"files":{"readme":"README-ch.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2019-03-08T02:03:09.000Z","updated_at":"2024-07-31T11:04:32.000Z","dependencies_parsed_at":"2023-01-15T06:30:40.986Z","dependency_job_id":null,"html_url":"https://github.com/analysys/presto-hbase-connector","commit_stats":null,"previous_names":[],"tags_count":6,"template":false,"template_full_name":null,"purl":"pkg:github/analysys/presto-hbase-connector","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/analysys%2Fpresto-hbase-connector","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/analysys%2Fpresto-hbase-connector/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/analysys%2Fpresto-hbase-connector/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/analysys%2Fpresto-hbase-connector/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/analysys","download_url":"https://codeload.github.com/analysys/presto-hbase-connector/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/analysys%2Fpresto-hbase-connector/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28737620,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-24T21:19:41.845Z","status":"ssl_error","status_checked_at":"2026-01-24T21:13:38.675Z","response_time":89,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-08-04T20:00:31.275Z","updated_at":"2026-01-24T21:41:23.452Z","avatar_url":"https://github.com/analysys.png","language":"Java","funding_links":[],"categories":["Plugins","大数据","Projects"],"sub_categories":["Integrations"],"readme":"# 易观presto-hbase-connector组件\n\n组件基于Presto Connector接口规范实现，用来给Presto增加查询HBase的功能。\n\n相比其他开源版本的HBase Connector，我们的性能要快10到100倍以上。\n\n## 性能对比\n\n| 环境   | 明细                                                      |\n| ------ | --------------------------------------------------------- |\n| 数据量 | 事件表500万条数据，90个字段                               |\n| 节点数 | 3                                                         |\n| 硬件   | 16逻辑核 64G内存（其中Presto和HBase各占16G内存） 4T*2硬盘 |\n\n![analysys-hb-performance.png](https://github.com/analysys/presto-hbase-connector/blob/master/imgs/analysys-hb-performance.png?raw=true)\n\n详细测试结果参见：https://github.com/analysys/public-docs/blob/master/Attachment5(Presto-HBase-Connector-PerformanceTesting).xlsx\n\n## 功能点对比\n\n| 功能点              | 易观     | 其他   |\n| ------------------- | -------- | ------ |\n| 加盐查询            | 支持     | 不支持 |\n| 拼接StartKey/EndKey | 支持     | 不支持 |\n| 批量Get查询         | 支持     | 不支持 |\n| 谓词下推（Filter）  | 支持     | 不支持 |\n| ClientSideScan      | 支持     | 支持   |\n| Insert              | 支持     | 支持   |\n| Delete              | 支持     | 支持   |\n| 建表语句            | 后续支持 | 支持   |\n\n\n\n## 使用条件\n\n1. Mac OS X 或者 Linux\n2. Java 8 Update 161 或更高 (8u161+), 64-bit.\n3. Maven 3.3.9+ (编译)\n4. PrestoSql 315+\n\n## 构建组件\n\nmvn clean package\n\n## 组件安装\n\n##### 1.配置hbase.properties\n\n在{Presto_Config_Dir}/catalog目录下创建hbase.properties文件。配置完成后同步到所有worker节点。\n\n以下是一个比较简单的配置样例，供大家参考：\n\n```\nconnector.name=hbase\nzookeeper-quorum=localhost:2181\nzookeeper-client-port=2181\nzookeeper-znode-parent=/hbase\nhbase-cluster-distributed=true\npresto-server-port=8285\nrandom-schedule-redundant-split=false\nmeta-dir=/etc/presto/chbase\n```\n\n参数说明如下：\n\n* connector.name\n\n         该配置固定设置为hbase。\n\n* zookeeper-quorum\n\n         相当于HBase API的hbase.zookeeper.quorum参数。\n\n* zookeeper-client-port\n\n         相当于HBase API的hbase.zookeeper.property.clientPort参数。\n\n* hbase-cluster-distributed\n\n         相当于HBase API的hbase.cluster.distributed参数。\n\n* presto-workers-name\n\n         presto worker的hostname，以英文逗号间隔。\n         \n         如果split-remotely-accessible配置为false，则该参数可以不设置。\n\n* presto-server-port\n\n         与{Presto_Config_Dir}/config.properties配置文件的http-server.http.port参数。\n\n* random-schedule-redundant-split\n\n         Presto默认采用按可用Worker的顺序，依次分配Split的方式调度Split。\n         \n         这样容易导致多表查询时，第余数个Split集中调度到可用Worker列表开头的几台机器上。\n         \n         将这个参数设置为true可以改为将第余数个Split随机调度到一个Worker上执行。\n\n* meta-dir\n\n         存放HBase表元数据信息的目录。\n\n* zookeeper-znode-parent\n\n         等同于hbase-site.xml的zookeeper.znode.parent参数。\n    \n* enable-clientSide-scan\n\n         是否启用HBase的ClientSide查询模式。默认为不启用，false。\n     \n* clientside-querymode-tablenames\n\n         使用ClientSide模式进行查询的表名，多表用英文逗号间隔。\n\n##### 2.配置namespace\n\n完成hbase.properties的配置之后，需要在{meta-dir}目录创建HBase的namespace目录结构\n\n- {meta-dir}目录用来存放表的元数据信息。\n- 该目录下，首先按照hbase的namespace名创建目录。\n- 每一张表会有一个单独的json文件来保存它的表结构信息，json文件以{表名}.json来命名。\n- 不同namespace的表分别存放在各自的namespace目录下。\n\n目录结构的样例如下：\n\n```\n--meta-dir:\n\t--namespace_a:\n\t\ttable_a1.json\n\t\ttable_a2.json\n\t--namespace_b:\n\t\ttable_b1.json\n\t\ttable_b2.json\n\t--default:\n\t\ttable_c.json\n```\n\n这个例子中分别定义了namespace_a:table_a1、namespace_a:table_a2、namespace_b:table_b1、namespace_b:table_b2以及default命名空间下的 table_c这5张表。\n\n##### 3.配置表结构json\n\nnamespace目录创建完成之后，我们需要配置表结构json文件，下面讲解一下json文件中的属性：\n\n表json：\n\n| 属性名               | 描述                                                         |\n| -------------------- | ------------------------------------------------------------ |\n| tableName            | 表名                                                         |\n| schemaName           | Namespace                                                    |\n| rowKeyFormat         | RowKey是由哪些字段组成，用英文逗号分隔。字段组成有序。       |\n| rowKeySeparator      | 组成RowKey的字段之间的分隔符，默认是\\001                     |\n| rowKeyFirstCharRange | 如果RowKey是散列的，可以指定RowKey首字母的取值范围，这样可以以多个split并发的方式大幅提升性能。首字母的取值范围可以是a\\~z,A\\~Z,0\\~9，相互之间用英文逗号间隔，例如：a\\~b,D\\~K,3\\~5，或者3\\~5,c\\~f等等 |\n| describe             | 表格描述                                                     |\n| columns              | 字段列表                                                     |\n\ncolumns json：\n\n| 属性名     | 描述                                                         |\n| ---------- | ------------------------------------------------------------ |\n| family     | 列族名                                                       |\n| columnName | 字段名                                                       |\n| isRowKey   | 是否行键                                                     |\n| type       | 字段类型（大小写不敏感）： string、int、bigint、double、boolean（用int存储，0代表false，1代表false）、array\u003c string \u003e |\n| comment    | 字段备注                                                     |\n\n说明：isRowKey为true，表示我们把表的行键抽象成为了一个具体的字段。无论是查询、写入还是其他各种复杂操作，他在表面上与一个普通的字段没有任何区别，只不过在底层他作为表的行键有着其特殊的含义。\n\nRowKey字段的类型必须为varchar。\n\n以下是一个简单的json文件示例：\n\n```\n{\n  \"tableName\": \"t_event_test\",\n  \"schemaName\": \"db_test\",\n  \"rowKeyFormat\": \"xwhat,xwho\",\n  \"describe\": \"Table for test!\",\n  \"rowKeySeparator\": \"-\",\n  \"rowKeyFirstCharRange\": \"a~z,0~9\",\n  \"columns\": [{\n    \"family\": \"\",\n    \"columnName\": \"rowkey\",\n    \"comment\": \"The RowKey column of table!\",\n    \"type\": \"varchar\",\n    \"isRowKey\": true\n  }, {\n    \"family\": \"f\",\n    \"columnName\": \"xwho\",\n    \"comment\": \"Column for test!\",\n    \"type\": \"varchar\",\n    \"isRowKey\": false\n  }, {\n    \"family\": \"f\",\n    \"columnName\": \"ds\",\n    \"comment\": \"Column for test!\",\n    \"type\": \"varchar\",\n    \"isRowKey\": false\n  }]\n}\n\n```\n\n根据表的namespace找到它在{meta-dir}中对应的目录，按照上述说明创建以表名命名的json文件。\n\n##### 4.编译组件jar包\n\n完成上述步骤之后，接下来需要编译组件jar包\n\n```\n// 下载组件源码\n// 使用maven构建组件的jar包\nmvn clean package\n```\n\n##### 5.部署组件jar包\n\n在{plugin.dir}目录下创建插件目录hbase（目录名称可任意设置）。\n\n将构建好的presto0.20-hbase-{version.num}.jar拷贝到该目录下，并同步到所有的worker节点上。\n\n##### 6.重启presto集群\n\n\n\n## Insert操作\n\n在dev_0.1.1版本支持了写入操作。写入操作需要用户以字段拼接或者固定值的方式，指定数据的row_key。如下：\n\n```sql\ninsert 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;\n\ninsert 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';\n```\n\n## Delete操作\n\n在meta_0.1.1版本支持了删除操作。删除操作不需要用户在sql中指明数据的row_key的值，但是要求所操作的表在定义其元数据的json文件中，必须设置了row_key字段。connector在筛选出所要删除的数据时，会获取到数据的row_key，然后根据row_key的值删除指定的数据。sql示例如下：\n\n```sql\ndelete from hbase.db_test.test_event where xwhen \u003e= 1562139516028;\n```\n\n\n\n## 查询优化\n\n##### 1.使用盐值\n\n盐值就是指给每个RowKey增加一组可逆向还原的随机数字作为前缀。这样可以将数据分散到多个region存储，查询时也可以通过多线程并发查找。在presto中就可以利用这个机制将数据切分成多个split并发查找。经过验证，使用盐值可以使性能提升几十倍以上。\n\n在组件中使用盐值需要在json文件中设置以下两个属性：\n\n- seperateSaltPart\n\n  ```\n  RowKey是否使用了单独的盐值作为前缀。如果RowKey以单独的盐值部分加上{rowKeySeparator}开头，则配置为true。从0.1.5版本开始盐值只能由一位取值范围在a~z,A~Z,0~9的字符组成。\n  ```\n\n* rowKeyFirstCharRange\n\n      当RowKey的首个字符是按照MD5或者其他算法散列时，可以通过这个属性说明首个字符的取值范围。connector会根据他的取值范围生成多个split并发执行。首字母的取值范围暂时只支持a~z,A~Z,0~9，相互之间用英文逗号间隔，例如：\n      a~b,D~K,3~5\n      3~5,c~f\n      A~Z,p~u\n      当该属性配置为a~b,D~F,6~8时，会依次生成8对startKey和endKey。\n      每一对startKey和endKey会交给一个split去做数据扫描。如下：\n      (a,a|)\n      (b,b|)\n      (D,D|)\n      (E,E|)\n      (F,F|)\n      (6,6|)\n      (7,7|)\n      (8,8|)\n      有时如果拆出的split过多，会自动进行范围的合并，以避免split过多性能反而下降，例如：\n      (a,b|)\n      (D,F|)\n      (6,8|)\n\n* rowKeySeparator\n\n      组成RowKey的字段之间的分隔符，默认是\\001\n\n##### 2.根据RowKey的组成拼接StartKey和EndKey\n\n这是指根据RowKey是由哪些字段组成的，以及当前查询的谓词来拼接查询StartKey和EndKey。\n\n例如，当RowKey的构成如下：\n\n```\nxwhat-xwho\n```\n\n而SQL是：\n\n```\nselect xwhat, xwho, date, xwhen from t_event_test where xwhat='login' and xwho in ('drew', 'george');\n```\n\n这样就会生成如下两对StartKey和EndKey：\n\n```\n(login-drew, login-drew|)\n(login-george, login-george|)\n```\n\n要实现这样的查询优化机制，我们需要配置以下两个参数：\n\n* rowKeyFormat\n\n         定义RowKey是由哪些字段有序组成。以刚才的例子来说，这里应该配置为\"xwhat,xwho\"\n\n* rowKeySeparator\n\n         RowKey的不同组成部分之间的分隔符，默认是\\001。以刚才的例子来说，这里应该配置为\"-\"\n\n如果想查看sql具体切分出了哪些split，可以将日志级别设置为info，在server.log中查看。\n\n##### 3.批量get\n\n批量get就是HBase的API中将所要查询的多个RowKey封装成一个List\u003c Get \u003e，然后请求这个列表以获取数据的查询方式。\n\n这种查询方式使用起来非常便利，可以直接将要查询的RowKey作为等值匹配的查询条件放到SQL中即可。\n\n```\nselect * from t_event_test where rk in ('rk1', 'rk2', 'rk3');\n```\n\n当系统解析谓词时，会根据字段名是否与RowKey字段一致判断是否执行这一查询模式。\n\n使用这个查询模式，要求必须在表的json文件中通过isRowKey指定RowKey字段。\n\n注意：因为我们定义的RowKey字段是虚拟字段，所以对它做除等值查询之外的其他类型的查询都是没有逻辑意义的。\n\n##### 4.ClientSideRegionScanner\n\nClientSideRegionScanner是HBase在0.96版本新增的Scanner，他可以在Client端直接扫描HDFS上的数据文件，不需要发送请求给RegionServer，再由RegionServer扫描HDFS上的文件。\n这样减少了RegionServer的负担，并且即使RegionServer处于不可用状态也不影响查询。同时，因为是直接读取HDFS，所以在负载较为均衡的集群中，可以基本实现本地读策略，避免了很多网络负载。\n\n下图是本组件使用ClientSideRegionScanner与普通RegionScanner的性能对比，通过比较可以得出，大部分查询都有了30%以上的提升，尤其是接近全表扫描的查询性能提升更为明显：\n\n![ClientSide\u0026NormalScanner.png](https://github.com/analysys/presto-hbase-connector/blob/dev_0.1.1/imgs/ClientSide-NormalScanner.png?raw=true)\n\n详细测试结果参见：https://github.com/analysys/public-docs/blob/master/Attachment6(Presto-HBase-Connector-PerformanceTesting-ClientSide).xlsx\n\n使用ClientSide查询需要设置以下三个参数：\n\n* hbase-rootdir\n\n  这个参数与hbase-site.xml的hbase.rootdir保持一致即可。\n\n* enable-clientSide-scan\n\n  是否开启ClientSide查询模式。\n\n* clientside-querymode-tablenames\n\n  定义哪些表需要使用ClientSide查询，表名之间用英文','间隔，例如：\n\n  ```\n  namespace_a:table_a,namespace_a:table_b,namespace_b:table_c\n  ```\n\n  如果所有表都要使用ClientSide查询，可以配置成*。\n\n除以上三个参数之外，打包时还需要将运行环境中hadoop的core-site.xml和hdfs-site.xml两个配置文件拷贝到project的src/main/resources目录下\n\n需要注意的是，ClientSideRegionScanner的查询是依赖Snapshot的，所以为了查询能获取到最新的数据，每次查询时都会自动创建一个命名规则如下的Snapshot：\n\n```\n\"ss-\" + schemaName + \".\" + tableName + \"-\" + System.nanoTime()\n```\n\nHBase最大可支持的Snapshot数为65536个，所以在使用ClientSideRegionScanner时最好能够做到定时清理过期Snapshot。\n\n## 问题解决\n\n##### 1.如何让ClientSideRegionScanner可以查询Snappy压缩格式的HBase表？\n\n你需要解决以下几个问题：\n\n###### 1) SnappyCodec找不到的问题\n\n这是因为在Presto的classPath中缺少hadoop-common-2.7.3.jar这个jar包。因为我们是基于ambari搭建的presto，所以需要将这个jar包拷贝到/usr/lib/presto/lib目录下。\n\n###### 2) SnappyCodec无法转换为CompressionCodec的问题\n\n经过定位发现Presto加载插件的类是采用自定义的PluginClassLoader，而SnappyCodec是采用AppClassLoader加载的。二者classLoader不同导致父类和子类不具备父子继承关系。\n\n修改hbase-common-1.1.2.jar中代码，将SnappyCodec改为使用PluginClassLoader的方式加载解决了这个问题。需要修改的代码为hbase-common模块的org.apache.hadoop.hbase.io.compress.Compression类，修改方法如下：\n\n```\n  /**\n   * Returns the classloader to load the Codec class from.\n   */\n  private static ClassLoader getClassLoaderForCodec() {\n    /*修改前：\n    ClassLoader cl = Thread.currentThread().getContextClassLoader();\n    if (cl == null) {\n      cl = Compression.class.getClassLoader();\n    }*/\n    // 修改后：\n    ClassLoader cl = Compression.class.getClassLoader();\n    if (cl == null) {\n      cl = Thread.currentThread().getContextClassLoader();\n    }\n    \n    if (cl == null) {\n      cl = ClassLoader.getSystemClassLoader();\n    }\n    if (cl == null) {\n      throw new RuntimeException(\"A ClassLoader to load the Codec could not be determined\");\n    }\n```\n\n用修改后的代码重新install maven仓库，再重新打组件jar包即可。\n\n###### 3) java.lang.UnsatisfiedLinkError: org.apache.hadoop.util.NativeCodeLoader.buildSupportsSnappy()Z\n\n这是需要在jvm中增加hadoop的native snappy库。可以在presto的jvm.config中，增加如下配置：\n\n```\n-Djava.library.path={path to hadoop native lib}\n```\n\n###### 4) java.io.IOException: java.lang.NoSuchMethodError: com.google.common.base.Objects.toStringHelper(Ljava/lang/Object;)Lcom/google/common/base/Objects$ToStringHelper;\n\n这是因为guava在v20.0以上的版本去掉了com.google.common.base.Objects中实现的内部类ToStringHelper，以及几个toStringHelper的方法。\n\n可以从低版本中将这些删除的代码增加到高版本的guava源码中，重新编译更新maven库中的guava-24.1-jre.jar之后，再重新构建presto-hbase.jar包。\n\n并将guava-24.1-jre.jar上传到PrestoWorker的lib目录中。\n\n或者使用maven的shade插件来解决这类jar包冲突的问题。\n\n###### 5) Stopwatch的构造函数找不到\n\n将guava的com.google.common.base.Stopwatch类中的构造函数改为public即可。\n\n或者使用shade来解决这类jar包冲突的问题。\n\n###### 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\n权限不足，因为hbase对自身的数据文件权限都是hbase用户之下，而我们通过presto查询使用的是presto用户，需要给presto用户授予读取权限。\n\n##### 2.如何在Idea中debug开发ClientSideRegionScanner查询以Snappy格式进行压缩的HBase表？\n\n你需要解决以下几个问题：\n\n###### 1) 找不到类CanUnbuff\n\n在presto-hbase-connector模块中增加如下dependency：\n\n```\n\u003cdependency\u003e\n\t\u003cgroupId\u003ecom.facebook.presto.hadoop\u003c/groupId\u003e\n\t\u003cartifactId\u003ehadoop-apache2\u003c/artifactId\u003e\n\t\u003cversion\u003e2.7.4-1\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\n###### 2) 使用hbase-shaded-client和hbase-shaded-server依赖\n\n###### 3) 参考“SnappyCodec无法转换为CompressionCodec的问题”部分，修改hbase-common模块的代码，并重新编译更新maven库。其中hbase-shade-client、hbase-shade-server和hbase-common这三个模块必须重新编译。\n\n###### 4) 在idea的run-\u003eEdit Configuration中配置-Djava.library.path到PrestoServer的VM options中。java.library.path就是hadoop的native snappy库路径。\n\n## 更新说明\n\n##### 1. meta-0.1.1\n\n- 支持ClientSide查询功能。\n\n##### 2. meta-0.1.2\n\n- 实现写入和删除的功能。\n- 解决使用ClientSide方式查询default命名空间下的表报错表名不一致的问题。\n- 将参数enable-clientSide-scan默认设置为false。将参数hbase-rootdir的值设置为可空。\n- 增加参数zookeeper-znode-parent。\n\n##### 3. meta-0.1.3\n\n- 将connector迁移到PrestoSql-315版本。\n- 提供一个基于PrestoDb-0.221实现的可用版本，分支名为dev_prestodb-0.221_0.1.2。\n- 修改doc文档。\n\n##### 4. meta-0.1.4\n\n- 迁移connector api到non-legacy的新版本\n\n##### 5. meta-0.1.5\n\n- 重新调整切分split的逻辑，去掉参数rowKeySaltUpperAndLower，改为rowKeyFirstCharRange。使得即使RowKey没有盐值部分，且没有可用来拼接StartKey的谓词时，只要RowKey首字符是散列的，仍然可以切分出多个split以增加查询并行度。","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fanalysys%2Fpresto-hbase-connector","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fanalysys%2Fpresto-hbase-connector","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fanalysys%2Fpresto-hbase-connector/lists"}