使用 Apache Drill Embedded 连接到 EMR 上的 Hive
Connect to Hive on EMR using Apache Drill Embedded
我正在尝试以嵌入式模式在 Apache Drill 1.4 上进行实验,并尝试连接到 EMR 上的 Hive 运行 - Drill 运行 在 EMR 外部的服务器上。
我有一些基本问题需要澄清,还有一些配置问题需要解决。
这是我目前所拥有的 -
运行 AWS EMR 集群。
运行 Drill 嵌入式服务器。
根据有关为 Hive 配置存储插件的文档,https://drill.apache.org/docs/hive-storage-plugin/,我对是使用 Remote Metastore 还是 Embedded Metastore 感到困惑。 有什么区别?
接下来,我的 EMR 集群是 运行,这里是 hive-site.xml 的样子 -
<property>
<name>hive.metastore.uris</name>
<value>thrift://ec2-XX-XX-XX-XX.compute-1.amazonaws.com:9083</value>
<description>JDBC connect string for a JDBC metastore</description>
</property>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://ec2-XX-XX-XX-XX.compute-1.amazonaws.com:3306/hive?createDatabaseIfNotExist=true</value>
<description>username to use against metastore database</description>
</property>
还有其他属性定义,如 MySQL 用户名和密码等。但我想这些在这里很重要。
我应该使用哪一个连接到 Hive?我试图将它们都放在存储插件中,但 Drill 不接受它。
我试过的存储插件是这样的 -
{
"type": "hive",
"enabled": true,
"configProps": {
"hive.metastore.uris": "thrift://ec2-XX-XX-XX-XX.compute-1.amazonaws.com:9083",
"fs.default.name": "hdfs://ec2-XX-XX-XX-XX.compute-1.amazonaws.com/",
"hive.metastore.sasl.enabled": "false"
}
}
和
{
"type": "hive",
"enabled": true,
"configProps": {
"hive.metastore.uris": "thrift://ec2-XX-XX-XX-XX.compute-1.amazonaws.com:9083",
"javax.jdo.option.ConnectionURL": "jdbc:derby:ec2-XX-XX-XX-XX.compute-1.amazonaws.com;databaseName=data;create=true",
"hive.metastore.warehouse.dir": "/user/hive/warehouse",
"fs.default.name": "file:///",
"hive.metastore.sasl.enabled": "false"
}
}
如果您能指导我进行设置,那将非常有帮助。
谢谢!
是否使用 Remote Metastore 或 Embedded Metastore?
Embedded Mode:推荐用于测试或实验目的 only.In此模式,metastore使用Derby数据库,数据库和 Metastore 服务都嵌入到主 HiveServer 进程中。当您启动 HiveServer 进程时,两者都会为您启动。
远程模式:Hive metastore 服务运行在它自己的 JVM 进程中。 HiveServer2、HCatalog 和其他进程通过 Thrift 网络 API(通过 hive.metastore.uris 属性 配置)与之通信。 Metastore 服务通过 JDBC(通过 javax.jdo.option.ConnectionURL 属性 配置)与 Metastore 数据库通信。这应该用于 production.
您正在使用 MySQL
存储 Hive 的元数据。因此,Drill 也需要 javax.jdo.option.ConnectionUserName
& javax.jdo.option.ConnectionPassword
来创建连接。
示例配置单元插件(远程模式):
{
"type": "hive",
"enabled": true,
"configProps": {
"hive.metastore.uris":<--->,
"javax.jdo.option.ConnectionURL":<--->,
"javax.jdo.option.ConnectionDriverName":<--->,
"javax.jdo.option.ConnectionUserName":<--->,
"javax.jdo.option.ConnectionPassword":<--->,
"hive.metastore.warehouse.dir":<--->,
"fs.default.name":<--->
}
}
<---> :可以取自 hive-site.xml
.
我遇到了几个问题 -
- VPC 问题 - 我的 EMR 集群和 mysql 主机位于不同的 VPC 中。
琐碎的。
- Mysql 没有从 EMR 集群连接到
mysql 主机 - 绑定对本地主机是严格的。删除它。
- 现在当我重新启动
hive --service metastore
时,我看到驱动程序名称不正确的错误 driver class com.mysql.jdbc.Driver not found
- 所以我必须按照 [=16] 中的说明下载 MySQL 连接器驱动程序=].
在 MySql 可以连接后,Metastore 可以连接到数据库:错误是 mysql Database initialization failed; direct SQL is disabled
,但是
初始 tables 需要存在。所以 table 的创作必须是
在此处完成命令 -
Go to the
$HIVE_HOME and run the initschema option on the schematool:
bin/schematool -dbType mysql -initSchema
确保您已经清理了要在其上移动此 Metastore 的 mysql 数据库。不存在 Hive 需要的 tables 或模式或 tables。
在这些之后,Metastore 能够连接到外部数据库。现在 Hive 已启动并且 运行 远程 Metastore。
现在我在新的 EC2 主机上托管了 Drill(嵌入式)以连接到这个 Metastore,它运行得非常棒!
curl -X POST -H "Content-Type: application/json" -d '{"name":"hive", "config": { "type": "hive", "enabled": true, "configProps": { "hive.metastore.uris":"thrift://ip-XX.XX.XX.XX.ec2.internal:9083", "javax.jdo.option.ConnectionURL":"jdbc:mysql://ip-XX.XX.XX.XX:3306/hive?createDatabaseIfNotExist=true", "javax.jdo.option.ConnectionDriverName":"com.mysql.jdbc.Driver", "javax.jdo.option.ConnectionUserName":"root", "javax.jdo.option.ConnectionPassword":"blah", "hive.metastore.warehouse.dir":"/user/hive/warehouse", "fs.default.name":"hdfs://ip-XX.XX.XX.XX.ec2.internal:8020" }}}' http://localhost:8047/storage/hive.json
我正在尝试以嵌入式模式在 Apache Drill 1.4 上进行实验,并尝试连接到 EMR 上的 Hive 运行 - Drill 运行 在 EMR 外部的服务器上。
我有一些基本问题需要澄清,还有一些配置问题需要解决。
这是我目前所拥有的 -
运行 AWS EMR 集群。 运行 Drill 嵌入式服务器。
根据有关为 Hive 配置存储插件的文档,https://drill.apache.org/docs/hive-storage-plugin/,我对是使用 Remote Metastore 还是 Embedded Metastore 感到困惑。 有什么区别?
接下来,我的 EMR 集群是 运行,这里是 hive-site.xml 的样子 -
<property>
<name>hive.metastore.uris</name>
<value>thrift://ec2-XX-XX-XX-XX.compute-1.amazonaws.com:9083</value>
<description>JDBC connect string for a JDBC metastore</description>
</property>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://ec2-XX-XX-XX-XX.compute-1.amazonaws.com:3306/hive?createDatabaseIfNotExist=true</value>
<description>username to use against metastore database</description>
</property>
还有其他属性定义,如 MySQL 用户名和密码等。但我想这些在这里很重要。
我应该使用哪一个连接到 Hive?我试图将它们都放在存储插件中,但 Drill 不接受它。
我试过的存储插件是这样的 -
{
"type": "hive",
"enabled": true,
"configProps": {
"hive.metastore.uris": "thrift://ec2-XX-XX-XX-XX.compute-1.amazonaws.com:9083",
"fs.default.name": "hdfs://ec2-XX-XX-XX-XX.compute-1.amazonaws.com/",
"hive.metastore.sasl.enabled": "false"
}
}
和
{
"type": "hive",
"enabled": true,
"configProps": {
"hive.metastore.uris": "thrift://ec2-XX-XX-XX-XX.compute-1.amazonaws.com:9083",
"javax.jdo.option.ConnectionURL": "jdbc:derby:ec2-XX-XX-XX-XX.compute-1.amazonaws.com;databaseName=data;create=true",
"hive.metastore.warehouse.dir": "/user/hive/warehouse",
"fs.default.name": "file:///",
"hive.metastore.sasl.enabled": "false"
}
}
如果您能指导我进行设置,那将非常有帮助。 谢谢!
是否使用 Remote Metastore 或 Embedded Metastore?
Embedded Mode:推荐用于测试或实验目的 only.In此模式,metastore使用Derby数据库,数据库和 Metastore 服务都嵌入到主 HiveServer 进程中。当您启动 HiveServer 进程时,两者都会为您启动。
远程模式:Hive metastore 服务运行在它自己的 JVM 进程中。 HiveServer2、HCatalog 和其他进程通过 Thrift 网络 API(通过 hive.metastore.uris 属性 配置)与之通信。 Metastore 服务通过 JDBC(通过 javax.jdo.option.ConnectionURL 属性 配置)与 Metastore 数据库通信。这应该用于 production.
您正在使用 MySQL
存储 Hive 的元数据。因此,Drill 也需要 javax.jdo.option.ConnectionUserName
& javax.jdo.option.ConnectionPassword
来创建连接。
示例配置单元插件(远程模式):
{
"type": "hive",
"enabled": true,
"configProps": {
"hive.metastore.uris":<--->,
"javax.jdo.option.ConnectionURL":<--->,
"javax.jdo.option.ConnectionDriverName":<--->,
"javax.jdo.option.ConnectionUserName":<--->,
"javax.jdo.option.ConnectionPassword":<--->,
"hive.metastore.warehouse.dir":<--->,
"fs.default.name":<--->
}
}
<---> :可以取自 hive-site.xml
.
我遇到了几个问题 -
- VPC 问题 - 我的 EMR 集群和 mysql 主机位于不同的 VPC 中。 琐碎的。
- Mysql 没有从 EMR 集群连接到 mysql 主机 - 绑定对本地主机是严格的。删除它。
- 现在当我重新启动
hive --service metastore
时,我看到驱动程序名称不正确的错误driver class com.mysql.jdbc.Driver not found
- 所以我必须按照 [=16] 中的说明下载 MySQL 连接器驱动程序=]. 在 MySql 可以连接后,Metastore 可以连接到数据库:错误是
mysql Database initialization failed; direct SQL is disabled
,但是 初始 tables 需要存在。所以 table 的创作必须是 在此处完成命令 -Go to the $HIVE_HOME and run the initschema option on the schematool:
bin/schematool -dbType mysql -initSchema
确保您已经清理了要在其上移动此 Metastore 的 mysql 数据库。不存在 Hive 需要的 tables 或模式或 tables。
在这些之后,Metastore 能够连接到外部数据库。现在 Hive 已启动并且 运行 远程 Metastore。
现在我在新的 EC2 主机上托管了 Drill(嵌入式)以连接到这个 Metastore,它运行得非常棒!
curl -X POST -H "Content-Type: application/json" -d '{"name":"hive", "config": { "type": "hive", "enabled": true, "configProps": { "hive.metastore.uris":"thrift://ip-XX.XX.XX.XX.ec2.internal:9083", "javax.jdo.option.ConnectionURL":"jdbc:mysql://ip-XX.XX.XX.XX:3306/hive?createDatabaseIfNotExist=true", "javax.jdo.option.ConnectionDriverName":"com.mysql.jdbc.Driver", "javax.jdo.option.ConnectionUserName":"root", "javax.jdo.option.ConnectionPassword":"blah", "hive.metastore.warehouse.dir":"/user/hive/warehouse", "fs.default.name":"hdfs://ip-XX.XX.XX.XX.ec2.internal:8020" }}}' http://localhost:8047/storage/hive.json