【问题标题】:Connect to Hive on EMR using Apache Drill Embedded使用 Apache Drill Embedded 连接到 EMR 上的 Hive
【发布时间】:2015-12-28 19:57:43
【问题描述】:

我正在尝试以嵌入式模式在 Apache Drill 1.4 上进行试验,并尝试连接到在 EMR 上运行的 Hive - Drill 正在 EMR 之外的服务器上运行。

我有一些基本问题需要澄清,还有一些配置问题需要解决。

这是我目前所拥有的 -

运行 AWS EMR 集群。 运行 Drill 嵌入式服务器。

根据有关为 Hive 配置存储插件的文档 https://drill.apache.org/docs/hive-storage-plugin/ ,我对是否使用远程元存储或嵌入式元存储感到困惑。 有什么区别?

接下来,我的 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"
  }
}

如果您能指导我进行设置,那将非常有帮助。 谢谢!

【问题讨论】:

    标签: hadoop jdbc hive emr apache-drill


    【解决方案1】:

    是否使用 Remote Metastore 或 Embedded Metastore?

    Embedded Mode:建议仅用于测试或实验目的。在此模式下,Metastore 使用 Derby 数据库,并且数据库和 Metastore 服务都是嵌入在主 HiveServer 进程中。当您启动 HiveServer 进程时,两者都会为您启动。

    远程模式:Hive Metastore 服务在其自己的 JVM 进程中运行。 HiveServer2、HCatalog 和其他进程通过 Thrift 网络 API(通过 hive.metastore.uris 属性配置)与其通信。 Metastore 服务通过 JDBC(通过 javax.jdo.option.ConnectionURL 属性配置)与 Metastore 数据库通信。这应该用于生产

    您正在使用 MySQL 存储 Hive 的元数据。所以,Drill 也需要javax.jdo.option.ConnectionUserName & javax.jdo.option.ConnectionPassword 来创建连接。

    Hive 插件示例(远程模式):

    {
      "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

    【讨论】:

    • 感谢您的解释。经过一些进一步的研究和阅读,我理解了黑白元存储的区别。所以我正在使用远程元存储。现在,当我使用 thrift URI thrift://ec2-XX-XX-XX-XX.compute-1.amazonaws.com:9083 在 EMR 主节点上配置我的 HIVE 插件时,它被接受了。但它不接受主节点之外的完全相同的配置。我检查了安全组,它们看起来很好。有什么想法吗?
    • 您正在集群外运行钻取(嵌入式模式)。正确的?当您尝试 thrift://&lt;slave node&gt;:9083 时这不起作用?
    • 没有。我可以使用 localhost thrift 添加这个 hive 插件,甚至可以使用公共 IP 添加 thrift://&lt;slave node&gt;:9083,但与我的 Hive 在同一个节点上。但它在 Hive 集群之外不起作用。
    • 您正在集群外运行钻取(嵌入式模式)。对吗?
    • 是的。所以问题是 - 我们有 3 个:Hive、Drill(嵌入式)和 MySQL,您需要连接到 Drill。现在,如果我在与 Hive 相同的集群上使用 MySQL,并将我的 Drill 指向这个 MySQL,它就像在同一个集群上的 Drill 一样具有魅力。所有 3 个都在同一个集群上。一旦我将 MySQL 带出 Hive,它就不会显示我的 Metastore。我通过在 hive-site.xml 中指向该 IP 来做到这一点。所以钻也没有交流。安全组不是问题,我检查了。
    【解决方案2】:

    我遇到了几个问题 -

    1. VPC 问题 - 我的 EMR 集群和 mysql 主机位于不同的 VPC 中。 琐碎的。
    2. 从 EMR 集群到未发生 Mysql 连接 mysql 主机 - 对本地主机的绑定是严格的。已将其删除。
    3. 现在当我重新启动hive --service metastore 时,我看到驱动程序名称不正确和driver class com.mysql.jdbc.Driver not found 的错误 - 所以我必须按照Step 2 here 中的说明下载MySQL 连接器驱动程序。
    4. MySql 可以连接后,metastore 可以连接数据库:错误是mysql Database initialization failed; direct SQL is disabled,但是 初始表需要存在。所以表创建必须是 在此处使用命令完成 - Getting MissingTableException: Required table missing VERSION when starting hive on mysql

      转到 $HIVE_HOME 并在 schematool 上运行 initschema 选项:

      bin/schematool -dbType mysql -initSchema

      确保您已清理要移动此元存储的 mysql 数据库。没有 Hive 需要的表或模式或表。

    5. 在这些之后,元存储能够连接到外部数据库。现在 Hive 已启动并运行远程元存储。

    现在我在新的 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多