Drill 1.20配置Hive3存储插件

Apache Drill当前版本是1.20,在配置它的Hive存储插件时,一开始我走了不少弯路,没搞成功。后来发现是schema不兼容的问题,当前版本的Drill必须使用Hive3作为存储插件。

所以换了台Hive3的机器重新配置。环境如下:

$ java -version
java version "1.8.0_321"

$ hadoop version
Hadoop 3.3.2

$ hive --version
Hive 3.1.2

mysql> select version();
+-------------------------+
| version()               |
+-------------------------+
| 5.7.37-0ubuntu0.18.04.1 |
+-------------------------+
1 row in set (0.00 sec)

如上,Java用的Oracle Java 1.8;Hadoop和Hive都是版本3;mysql版本是5.7,作为Hive的metastore存储服务。操作系统就是ubuntu 18.04 Linux,是一个KVM虚拟机,配置并不高,2核2G的配置。

上述几个服务都事先安装好。我的Hadoop是安装在本机的伪分布式模式,Hive是安装在本机的Local模式(也就是使用Mysql作为共享metastore服务)。它们默认都安装在/opt这个系统目录下。

接着下载Drill,下载完后解压开,将目录移动到/opt/drill下即可。

用户家目录的.bash_profile文件,包含如下内容:

export JAVA_HOME=/opt/jdk/jdk1.8.0_321

export HADOOP_HOME=/opt/hadoop
export PATH=$HADOOP_HOME/bin:$PATH

export HIVE_HOME=/opt/hive
export PATH=$HIVE_HOME/bin:$PATH

export DRILL_HOME=/opt/drill
export PATH=$DRILL_HOME/bin:$PATH

这些内容也没什么特别的,指定Java、Hadoop、Hive、Drill的安装路径的环境变量。

因为使用了Mysql作为Hive的metastore服务,不管Hive还是Drill都需要通过JDBC访问Mysql,所以JDBC的驱动器程序,要放置在相关的classpath目录下。执行如下操作:

$ cp mysql-connector-java-8.0.27.jar /opt/hive/lib
$ cp mysql-connector-java-8.0.27.jar /opt/drill/jars/3rdparty/

上述Mysql的连接器程序,在Mysql的官网下载

因为Hive使用Mysql来存储metadata,这里要稍微配置下。创建或编辑/opt/hive/conf/hive-site.xml,输入如下内容:

<configuration>
        <property>
                <name>javax.jdo.option.ConnectionURL</name>
                <value>jdbc:mysql://localhost/spark?createDatabaseIfNotExist=true</value>
                <description>metadata is stored in a MySQL server</description>
        </property>
        <property>
                <name>javax.jdo.option.ConnectionDriverName</name>
                <value>com.mysql.jdbc.Driver</value>
                <description>MySQL JDBC driver class</description>
        </property>
        <property>
                <name>javax.jdo.option.ConnectionUserName</name>
                <value>spark</value>
                <description>user name for connecting to mysql server</description>
        </property>
        <property>
                <name>javax.jdo.option.ConnectionPassword</name>
                <value>spark123</value>
                <description>password for connecting to mysql server</description>
        </property>

</configuration>

这里的意思是,使用Mysql JDBC来管理metastore存储服务,存储路径是Mysql数据库里名为spark的库。Mysql用户名是spark,密码是spark123。当然,在Mysql刚安装好后,这几个属性要事先配置好。

配置完上述后,运行如下命令来初始化metastore服务:

$ schematool -dbType mysql -initSchema

这里要注意下是否成功,不成功的话检查是啥原因。比如没有拷贝JDBC驱动,或者Mysql权限不对。

为了验证Hive使用Mysql作为metastore是否成功,可以运行hive命令进入交互式shell,创建一个表,比如hivemysql。然后登陆mysql,运行如下查询,看这个表是否存在:

mysql> select TBL_NAME,TBL_TYPE from TBLS;
+-----------+---------------+
| TBL_NAME  | TBL_TYPE      |
+-----------+---------------+
| hivemysql | MANAGED_TABLE |
+-----------+---------------+
1 row in set (0.01 sec)

如上,就说明Mysql管理了Hive的元数据存储服务。

接着,在Linux命令行里 ,打开drill-embedded,即在本机运行一个嵌入式实例:

$ drill-embedded
Apache Drill 1.20.0
"Think different, think Drill."
apache drill> 

进入交互式shell后,暂时不需要执行什么操作。因为这个实例,也打开了一个web端口:8047。我们需要通过web UI来配置存储插件。

打开浏览器,输入:http://ip:8047/storage

可以看到页面左侧是已经激活的存储服务,右侧是默认配置了、但未激活的存储服务。在右侧找到hive存储插件,点击update来更新它的属性。

{
  "type": "hive",
  "configProps": {
    "hive.metastore.sasl.enabled": "false",
    "fs.default.name": "file:///",
    "datanucleus.schema.autoCreateAll": "true",
    "javax.jdo.option.ConnectionURL": "jdbc:mysql://spark:spark123@localhost:3306/spark",
    "hive.metastore.uris": "",
    "hive.metastore.schema.verification": "false",
    "hive.metastore.warehouse.dir": "/tmp/drill_hive_wh"
  },
  "enabled": true
}

这里只更新一个地方即可,就是”javax.jdo.option.ConnectionURL”,指定为我们自己的Mysql的配置,包括metastore的库名、用户名、密码。

更新完后,返回去,点击”Enable”按钮,就激活这个插件了。已经成功激活的插件,出现在页面左侧。

接着,回到drill shell,查看在hive里创建的数据表:

apache drill> use hive;
+------+----------------------------------+
|  ok  |             summary              |
+------+----------------------------------+
| true | Default schema changed to [hive] |
+------+----------------------------------+
1 row selected (10.746 seconds)

apache drill (hive)> show tables;
+--------------+------------+
| TABLE_SCHEMA | TABLE_NAME |
+--------------+------------+
| hive.default | hivemysql  |
+--------------+------------+
1 row selected (3.691 seconds)

apache drill (hive)> select * from hivemysql;
+----+----------+------------+
| id |   name   |    born    |
+----+----------+------------+
| 1  | john doe | 1999-02-02 |
+----+----------+------------+
1 row selected (2.926 seconds)

我们也可以将一个本地表join到Hive的表进行联合查询,比如:

apache drill (dfs.pyh)> use dfs.pyh;
+------+-------------------------------------+
|  ok  |               summary               |
+------+-------------------------------------+
| true | Default schema changed to [dfs.pyh] |
+------+-------------------------------------+
1 row selected (0.324 seconds)

apache drill (dfs.pyh)> select * from mytest t1 left join hive.hivemysql t2 on t1.id=t2.id;
+----+----------+------------+-----+----------+------------+
| id |   name   |    born    | id0 |  name0   |   born0    |
+----+----------+------------+-----+----------+------------+
| 1  | john doe | 1999-02-02 | 1   | john doe | 1999-02-02 |
+----+----------+------------+-----+----------+------------+
1 row selected (1.233 seconds)

这样就在Drill里成功配置了Hive存储插件。

Print this entry