Metabase Impala Driver

更新日志

[En]

Update log

  1. Metabase Impala Driver 0528更新日志
  2. Metabase Impala Driver 0710更新日志

背景

我们的数据仓库是基于Hadoop/Have系统的。Hadoop版本使用CDH发行版。在这种情况下,Hadoop方案上的SQL是hive/impala/(SparkSQL)。作为BI数据库,Impala更适合我们的场景。

[En]

Our data warehouse is based on Hadoop/Hive system. The Hadoop version uses the CDH distribution. In this context, SQL on Hadoop’s scheme is Hive/Impala/ (SparkSQL). As a BI database, Impala is more appropriate in our scenario.

  1. Hive:太慢了。做 ETL 可以,BI 非常不适。
  2. SparkSQL:CDH 官方 Spark 不含 Thrift Server。为了能够使用 Metabase ,独立于 CDH 启了个 Thrift Server,用着还不错。问题就在于缺乏统一管理,比如 Kerberos 的管理就得自己写脚本处理、进程 OOM 挂掉了 CDH Manager 也监测不到。
  3. Impala:CDH 官方出品,为 BI 而设计,由 CDH Manager 管理。根据这份报告,见下参考链接,Impala 好于 SparkSQL。

为了尽可能地重用现有的基础设施,请选择黑斑羚。然而,元数据库官员和社区不提供黑斑羚驱动程序。本文的目的就是探索和解决这一问题。

[En]

For the purpose of reusing the existing infrastructure as much as possible, choose Impala. However, Metabase officials and communities do not provide Impala drivers. The purpose of this paper is to explore and solve this problem.

参考资料:

[En]

Reference:

  1. 开源OLAP引擎测评报告(SparkSql、Presto、Impala、HAWQ、ClickHouse、GreenPlum) http://www.clickhouse.com.cn/topic/5c453371389ad55f127768ea

现有驱动探索

搭建 Impala 开发环境

使用Cloudera QuickStart Docker镜像(官方QuickStart VM已被删除)。其中,黑斑羚2.5.0版。(我们的生产环境:鼎晖6.3.2黑斑羚3.2.0蜂巢2.1.1)

[En]

Use Cloudera Quickstart Docker image (officially quickstart vm has been removed). Among them, Impala version 2.5.0. (our production environment: CDH 6.3.2 Impala 3.2.0 Hive 2.1.1)

docker run --name cloudera_quickstart --hostname=quickstart.cloudera \
--privileged=true -t -i -d -p 8888:8888 -p 80:80 -p 10000:10000 -p 7180:7180 \
-p 21050:21050 -p 50070:50070 -p 50075:50075 -p 50010:50010 -p 50020:50020 \
-p 8020:8020 cloudera/quickstart /usr/bin/docker-quickstart

一些端口的使用说明:

[En]

Instructions for using some ports:

Port Use 80 Tutorial 8888 HUE 21050 Impala 10000 Hive

注意:关闭并重新启动容器,不会重新启动Impala进程。重启Impala的最直接方法是重建容器。

[En]

Note: close and restart the container, the Impala process is not restarted. The most direct way to restart Impala is to rebuild the container.

参考资料:

[En]

Reference:

  1. quickstart docker image https://hub.docker.com/r/cloudera/quickstart
  2. 15分钟——在Docker启动Cloudera并开始体验https://xieshaohu.wordpress.com/2019/02/26/15%E5%88%86%E9%92%9F-%E5%9C%A8docker%E5%90%AF%E5%8A%A8cloudera%E5%B9%B6%E5%BC%80%E5%A7%8B%E4%BD%93%E9%AA%8C/

在 metabase issue 里看到一个关掉的关于Impala的PR,这方面的资料真的很少。如下:

  1. Support Apache Impala database #3002 #3749 https://github.com/metabase/metabase/pull/3749
  2. Support Apache Impala database #3002 https://github.com/metabase/metabase/issues/3002

可惜,并没有被合并到官方库。尝试编译作者mwullink的metabase版本。 https://github.com/mwullink/metabase

git clone https://github.com/mwullink/metabase.git metabase-mwullink

这个metabase版本太老了,前端依赖还是node 4.4.7(warning You are using Node “4.4.7” which is not supported and may encounter bugs or unexpected behavior. Yarn supports the following semver range: “^4.8.0 || ^5.7.0 || ^6.2.2 || >=8.0.0″),另外yarn对node4.x也有兼容问题( https://github.com/yarnpkg/yarn/issues/6900 )。

特殊处理逻辑:

[En]

Special processing logic:

# nvm 安装 node 4.x 版本
nvm install lts/argon

# 修改 node 版本
vim package.json
  "engines": {
    "node": "4.9.1",
    "npm": "2.15.11"
  },

# 安装老版本的yarn
npm --global install yarn@1.12.3

# 这样就可以了
./bin/build

运行:

[En]

Run:

# jar目录
cd ./target/uberjar

# 将impala驱动放这里。下载和安装参考 https://github.com/metabase/metabase/pull/3749/files
mkdir plugins

# 换个端口号,本地还有其他版本metabase运行
java -DMB_JETTY_PORT=12345 -jar metabase.jar

效果:

[En]

Effect:

  1. 可以直接写SQL查询,基于查询结果也能做 chart/dashboard。
  2. 但是metadata(比如表结构)并没有同步。SQL查询的右边表结构也不会显示,filter功能受影响。
  3. metadata没有同步,也没有报错信息。(作为对比,连mysql是有metadata同步的。)

使用官方 sparksql 驱动

Metabase 版本:v0.35.3

尝试使用SPEKESQL驱动程序连接到Impala数据库。

[En]

Try to use the sparksql driver to connect to the Impala database.

因为 SparkSQL 的 thrift server 复用的是 HiveServer2 的实现,架构如下图。而 Impala 可以使用 Hive 的JDBC Driver ( https://impala.apache.org/docs/build/html/topics/impala_jdbc.html https://docs.cloudera.com/documentation/enterprise/latest/topics/impala_jdbc.html#jdbc_driver_choice )。

Metabase Impala Driver

效果:

[En]

Effect:

  1. 可以直接写SQL查询,基于查询结果也能做chart/dashboard。
  2. 但是表结构并没有同步。SQL查询的右边表结构也不会显示,filter功能受影响。
  3. 同步有报错信息。终于有线索了
Metabase Impala Driver

第10行的这个方法崩了。

Metabase Impala Driver

方法 driver/describe-database 的作用是获取db的所有表。方法 driver/describe-table的作用是获取table的字段信息 。

(defmulti describe-database
  "Return a map containing information that describes all of the tables in a database, an instance of the Database
  model. It is expected that this function will be peformant and avoid draining meaningful resources of the database.

  Results should match the metabase.sync.interface/DatabaseMetadata schema."
  {:arglists '([driver database])}
  dispatch-on-initialized-driver
  :hierarchy #'hierarchy)

(defmulti describe-table
  "Return a map containing information that describes the physical schema of table (i.e. the fields contained
  therein). database will be an instance of the Database model; and table, an instance of the Table model. It is
  expected that this function will be peformant and avoid draining meaningful resources of the database. Results
  should match the metabase.sync.interface/TableMetadata schema."
  {:arglists '([driver database table])}
  dispatch-on-initialized-driver
  :hierarchy #'hierarchy)

这(两个)方法调用失败,自然没有关于元数据库的表结构信息。

[En]

These (two) method calls fail, and there is naturally no table structure information on the Metabase.

sparksql驱动”重载”了这两个方法。初步怀疑与重载有关,sparksql 的父驱动 jdbc-sql 是有默认实现的,尝试注释掉重载。

Metabase Impala Driver

令人惊讶的是,通过注释掉这两种方法,您可以直接通过SPEKSQL驱动程序连接到impala服务器。

[En]

It is amazing to find that by commenting out these two methods, you can connect to the impala server directly through the sparksql driver.

猜想,SparkSQL的Thrift Server和Impala Server实现有差异,SparkSQL Thrift Server可能因为有设计缺陷,需要在驱动上打上补丁。

自己写驱动

基于最新版 Metabase 0.35.3 开发。(尝试编译 master 分支,发现打包结果 java -jar metabase.jar 报错。)

目前,编写自己的驱动程序有两种方式:

[En]

At present, there are two ways to write your own driver:

  1. 通过分析 sparksql 驱动的报错信息,貌似找到了连接 Impala 数据库的方式。为了兼容现有的 sparksql 实现,在 sparksql 包中新增一个 impala 文件(复用hive-like父类实现,与sparksql 平行)。
  2. 新增一个驱动包 impala。基于Impala官方的JDBC驱动实现。需要系统理解下 Metabase 驱动开发逻辑。

当然,您需要对元数据库有一定的了解,所以先看一下文档。

[En]

Of course, you need to have some familiarity with Metabase, so take a look at the documentation first.

sparksql 包中新增一个 impala driver

根据以上思路,现将代码提交至此处。

[En]

According to the above idea, the code is submitted here.

https://github.com/XUJiahua/metabase/tree/driver-impala-in-sparksql/modules/drivers/sparksql

本地测试。

[En]

Local test.

Metabase Impala Driver
Metabase Impala Driver
Metabase Impala Driver

sparksql 包的依赖问题 (存量bug)

如果在服务器上启用了Kerberos身份验证,则会出现此问题。

[En]

This problem occurs if Kerberos authentication is enabled on the server.

Metabase Impala Driver
05-27 10:39:39 ERROR driver.util :: Database connection error
java.lang.IllegalArgumentException: Unrecognized Hadoop major version number: 3.1.1
    at org.apache.hadoop.hive.shims.ShimLoader.getMajorVersion(ShimLoader.java:174)
    at org.apache.hadoop.hive.shims.ShimLoader.loadShims(ShimLoader.java:139)
    at org.apache.hadoop.hive.shims.ShimLoader.getHadoopThriftAuthBridge(ShimLoader.java:125)
    at org.apache.hive.service.auth.KerberosSaslHelper.getKerberosTransport(KerberosSaslHelper.java:54)
    at org.apache.hive.jdbc.HiveConnection.createBinaryTransport(HiveConnection.java:445)
    at org.apache.hive.jdbc.HiveConnection.openTransport(HiveConnection.java:201)
    at org.apache.hive.jdbc.HiveConnection.<init>(HiveConnection.java:176)
</init>

sparksql jar 包依赖:

# &#x4F5C;&#x4E3A; hadoop &#x57FA;&#x7840;&#x5305;&#xFF0C;&#x542B; Kerberos &#x8BA4;&#x8BC1;&#x903B;&#x8F91;&#x4EE3;&#x7801;
org.apache.hadoop/hadoop-common "3.1.1"

# 1.x &#x7CFB;&#x5217;&#x6700;&#x540E;&#x4E00;&#x4E2A;&#x7248;&#x672C;
org.apache.hive/hive-jdbc "1.2.1"

根据错误消息,找到配置单元的源代码:

[En]

According to the error message, the source code of Hive is found:

Metabase Impala Driver
https://github.com/apache/hive/blob/release-1.2.1/shims/common/src/main/java/org/apache/hadoop/hive/shims/ShimLoader.java#L159

所以org.apache.hive/hive-jdbc“1.2.1”与org.apache.hadoop/hadoop-Common“3.x”完全不兼容。人们在编写代码时没有发现这种情况。

[En]

So org.apache.hive/hive-jdbc “1.2.1” is not compatible with org.apache.hadoop/hadoop-common “3.x” at all. People didn’t detect this case when they wrote the code.

有关解决方案,请参阅Hadoop-Common 2.x的最新版本:

[En]

For the solution, refer to the last version of hadoop-common 2.x:

org.apache.hadoop/hadoop-common "2.10.0"

重新编译并打包效果OK。

[En]

Recompile and package the effect OK.

uberjar 的弊端

Metabase为了方便包的分发,整个项目、驱动都是uberjar的打包思路。弊端其实也挺明显。JDBC 驱动与数据库的兼容性问题,一般是适配数据库,JDBC 驱动被 uberjar 后,想换驱动就得重新编译源码。

例如,配置单元服务器1.1.0和配置单元JDBC 1.2.1未连接。开源产品的兼容性是平淡无奇的。

[En]

For example, Hive Server 1.1.0 and Hive JDBC 1.2.1 are not connected. The compatibility of open source products is bald.

TODO:驱动不再uberjar,可以使用自己需要的依赖版本,比如我们使用 CDH 6.x 的 hadoop/hive jar包。

编译 Metabase时, plugin driver不要打包到 metabase.jar即可。独立处理 plugin driver的打包和安装。

题外话 sparksql-deps

网上有个老版本的sparksql 驱动包 https://s3.amazonaws.com/sparksql-deps/metabase-sparksql-deps-1.2.1.spark2-standalone.jar 。之前解决这个问题,就是将其放到plugins目录。究其原因,其引用的hadoop-common版本是2.x的。

Metabase Impala Driver

而其源码包括历史记录( https://github.com/metabase/sparksql-deps )的hadoop-common版本是3.1.0。不要被误导了。

总结

在摸索和改进Metabase SPEKSQL包后,我们可以使用Impala。至于有多少个坑,要我深入利用才能知道。

[En]

After groping and improving the Metabase sparksql package, we can use Impala. As for how many pits there are, I won’t know until I use them deeply.

代码 https://github.com/XUJiahua/metabase/tree/driver-impala-in-sparksql

Last modified on 2020-05-27

Original: https://xujiahua.github.io/posts/20200527-metabase-impala-driver/
Author: xujiahua
Title: Metabase Impala Driver

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/7114/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

免费咨询
免费咨询
扫码关注
扫码关注
联系站长

站长Johngo!

大数据和算法重度研究者!

持续产出大数据、算法、LeetCode干货,以及业界好资源!

2022012703491714

微信来撩,免费咨询:xiaozhu_tec

分享本页
返回顶部
最近整理资源【免费获取】:   👉 程序员最新必读书单  | 👏 互联网各方向面试题下载 | ✌️计算机核心资源汇总