使用 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.

我遇到了几个问题 -

  1. VPC 问题 - 我的 EMR 集群和 mysql 主机位于不同的 VPC 中。 琐碎的。
  2. Mysql 没有从 EMR 集群连接到 mysql 主机 - 绑定对本地主机是严格的。删除它。
  3. 现在当我重新启动 hive --service metastore 时,我看到驱动程序名称不正确的错误 driver class com.mysql.jdbc.Driver not found - 所以我必须按照 [=16] 中的说明下载 MySQL 连接器驱动程序=].
  4. 在 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。

  5. 在这些之后,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