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存储插件。