使用Apache Drill Embedded连接到EMR上的Hive

时间:2015-12-27 07:49:42

标签: hadoop jdbc hive emr apache-drill

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

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

这是我到目前为止所拥有的 -

运行AWS EMR集群。 运行Drill Embedded服务器。

根据有关为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"
  }
}

如果你可以引导我进行设置,那将会很有帮助。 谢谢!

2 个答案:

答案 0 :(得分:2)

是否使用远程Metastore或嵌入式Metastore?

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

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

您正在使用class存储Hive的元数据。因此,Drill需要MySQL&amp; javax.jdo.option.ConnectionUserName也可以创建连接。

示例配置单元插件(远程模式):

javax.jdo.option.ConnectionPassword

&LT; ---&GT; :可以从{ "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":<---> } } 获取。

答案 1 :(得分:1)

我遇到了几个问题 -

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

    确保已清理了要移动此Metastore的mysql数据库。 Hive不需要表格或模式或表格。

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

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