外部Apache Hive亚稳态<一个class="headerlink" href="//www.neidfyre.com/docs/data/metastores/#external-apache-hive-metastore" title="">
本文介绍如何设置Databricks集群以连接到现有的外部Apache Hive亚存储。它提供了有关metastore部署模式、推荐的网络设置和集群配置要求的信息,然后是配置集群以连接到外部metastore的说明。下表总结了每个Databricks Runtime版本中支持的Hive metastore版本。
Databricks运行时版本 |
0.13 - 1.2.1 |
2.0 |
2.1 |
2.2 |
2.3 |
3.1.0 |
---|---|---|---|---|---|---|
7.倍 |
是的 |
是的 |
是的 |
是的 |
是的 |
是的 |
重要的
的值。如果使用Azure Database for MySQL作为外部metastore,则必须更改
lower_case_table_names
属性在服务器端数据库配置中从1(默认值)到2。详细信息请参见<一个class="reference external" href="https://dev.mysql.com/doc/refman/5.6/en/identifier-case-sensitivity.html">区分大小写一个>.如果您使用只读的亚存储数据库,Databricks强烈建议您设置
spark.databricks.delta.catalog.update.enabled
来假
以获得更好的性能。
Hive metastore部署模式<一个class="headerlink" href="//www.neidfyre.com/docs/data/metastores/#hive-metastore-deployment-modes" title="">
在生产环境中,可以通过本地和远程两种方式部署Hive metastore。
本地模式
运行在集群内部的metastore客户端通过JDBC直接连接到底层的metastore数据库。
远程模式
metastore客户端不是直接连接到底层数据库,而是通过Thrift协议连接到一个单独的metastore服务。metastore服务连接到底层数据库。在远程模式下运行metastore时,DBFS是不支持.
有关这些部署模式的详细介绍,请参见<一个class="reference external" href="https://cwiki.apache.org/confluence/display/Hive/AdminManual+Metastore+Administration">蜂巢的文档一个>.
请注意
本文档中的示例使用MySQL作为底层metastore数据库。
网络设置<一个class="headerlink" href="//www.neidfyre.com/docs/data/metastores/#network-setup" title="">
数据集群运行在VPC内部。我们建议您在新的VPC中建立外部的Hive metastore,然后对这两个VPC进行对等,使集群通过私有IP地址连接到Hive metastore。<一个class="reference internal" href="//www.neidfyre.com/docs/docs/administration-guide/cloud-configurations/aws/vpc-peering.html">VPC凝视提供了如何对Databricks集群使用的VPC和metastore所在的VPC进行对等的详细说明。在对等VPC完成后,您可以在笔记本中执行以下命令,测试集群到metastore VPC的网络连通性:
%sh nc -vz <端口>
在哪里
< DNS的名字或私人IP >
MySQL数据库(本地模式)或metastore服务(远程模式)的DNS名称或私有IP地址。如果此处使用DNS名称,请确保解析的IP地址为私有IP地址。<口>
是MySQL数据库的端口或metastore服务的端口。
集群配置<一个class="headerlink" href="//www.neidfyre.com/docs/data/metastores/#cluster-configurations" title="">
您必须设置三组配置选项来连接集群到外部metastore:
火花选项使用Hive metastore版本配置Spark,并为metastore客户端配置jar。
蜂巢的选项配置metastore客户端连接到外部metastore。
一组可选的<一个class="reference internal" href="//www.neidfyre.com/docs/data/metastores/#file-options">Hadoop的选项配置文件系统选项
Spark配置选项<一个class="headerlink" href="//www.neidfyre.com/docs/data/metastores/#spark-configuration-options" title="">
集spark.sql.hive.metastore.version
你的蜂巢亚稳态版本spark.sql.hive.metastore.jars
如下:
Hive 0.13:不设置
spark.sql.hive.metastore.jars
.请注意
Hive 1.2.0和1.2.1不是Databricks Runtime 7.0及以上版本的内置metastore。如果您想使用Hive 1.2.0或1.2.1 with Databricks Runtime 7.0及以上版本,请按照以下步骤操作<一个class="reference internal" href="//www.neidfyre.com/docs/data/metastores/#download-the-metastore-jars-and-point-to-them">下载亚metastore罐子并指向它们.
Hive 2.3.7 (Databricks Runtime 7.0 - 9.x)或Hive 2.3.9 (Databricks Runtime 10.0及以上):设置
spark.sql.hive.metastore.jars
来内装式
.对于所有其他版本的Hive, Databricks建议您下载metastore jar并设置配置
spark.sql.hive.metastore.jars
中描述的过程指向下载的jar<一个class="reference internal" href="//www.neidfyre.com/docs/data/metastores/#download-the-metastore-jars-and-point-to-them">下载亚metastore罐子并指向它们.
下载亚metastore罐子并指向它们<一个class="headerlink" href="//www.neidfyre.com/docs/data/metastores/#download-the-metastore-jars-and-point-to-them" title="">
使用
spark.sql.hive.metastore.jars
设置为maven
而且spark.sql.hive.metastore.version
来匹配你的亚转移瘤。当集群运行时,搜索驱动日志,找到如下一行:
17/11/1822:41:19信息IsolatedClientLoader:下载metastore罐子来<路径>
的目录
<路径>
是在集群的驱动节点中下载的jar的位置。或者,你也可以在Scala笔记本中运行以下代码来打印jar的位置:
进口com.类型安全.配置.ConfigFactory瓦尔路径=ConfigFactory.负载()。getString(“java.io.tmpdir”)println(\nHive jar被下载到以下路径:$路径\ n”)
运行
% shcp- r<路径>/ dbfs hive_metastore_jar
(替换<路径>
将此目录复制到DBFS根目录中名为hive_metastore_jar
通过DBFS客户端在驱动节点。创建一个<一个class="reference internal" href="//www.neidfyre.com/docs/docs/clusters/init-scripts.html">init脚本复制
/ dbfs hive_metastore_jar
到节点的本地文件系统,确保init脚本在访问DBFS客户端之前休眠几秒钟。这确保客户端已经准备好了。集
spark.sql.hive.metastore.jars
使用此目录。如果初始化脚本复制/ dbfs hive_metastore_jar
来/砖/ hive_metastore_jars /
,设置spark.sql.hive.metastore.jars
来/砖/ hive_metastore_jars / *
.位置必须包括拖尾/*
.重新启动集群。
Hive配置选项<一个class="headerlink" href="//www.neidfyre.com/docs/data/metastores/#hive-configuration-options" title="">
本节介绍Hive特有的选项。
本地模式的配置选项<一个class="headerlink" href="//www.neidfyre.com/docs/data/metastores/#configuration-options-for-local-mode" title="">
通过本地模式连接外部metastore,需要设置以下Hive配置选项:
# JDBC连接字符串javax.jdo.option.ConnectionURL jdbc: mysql: / / < metastore-host >: < metastore-port > / < metastore-db >#用于metastore数据库的用户名javax.jdo.option.ConnectionUserName < mysql-username >#用于metastore数据库的密码javax.jdo.option.ConnectionPassword < mysql-password ># JDBC metastore的驱动程序类名(运行时3.4及更高版本)javax.jdo.option.ConnectionDriverName org.mariadb.jdbc.Driver# JDBC metastore的驱动程序类名(在运行时3.4之前)# javax.jdo.option.ConnectionDriverName com.mysql.jdbc.Driver
在哪里
< metastore-host >
而且< metastore-port >
是MySQL实例的主机和监听端口。< metastore-db >
是保存所有亚矿表的MySQL数据库的名称。< mysql-username >
而且< mysql-password >
请指定具有读写权限的MySQL帐户的用户名和密码< metastore-db >
.
请注意
使用MariaDB驱动程序与MySQL数据库通信。
对于生产环境,我们建议您设置
hive.metastore.schema.verification
来真正的
.这可以防止Hive metastore客户端在metastore客户端版本与metastore数据库版本不匹配时隐式修改metastore数据库模式。当对低于Hive 1.2.0版本的metastore客户端启用此设置时,请确保该metastore客户端具有对metastore数据库的写权限(以防止本文中描述的问题)<一个class="reference external" href="https://issues.apache.org/jira/browse/HIVE-9749">蜂巢- 9749一个>)。对于Hive metastore 1.2.0及以上版本,请设置
hive.metastore.schema.verification.record.version
来真正的
要启用hive.metastore.schema.verification
.对于Hive亚metastore 2.1.1及以上,设置
hive.metastore.schema.verification.record.version
来真正的
因为它被设置为假
默认情况下。
远程模式的配置选项<一个class="headerlink" href="//www.neidfyre.com/docs/data/metastores/#configuration-options-for-remote-mode" title="">
要使用远程模式连接到外部metastore,请设置以下Hive配置选项:
#远程metastore的Thrift URI。metastore客户端用于连接远端metastore。hive.metastore.uris节俭:/ / < metastore-host >: < metastore-port >
在哪里< metastore-host >
而且< metastore-port >
是Hive metastore服务的监听主机和端口。
文件系统选项<一个class="headerlink" href="//www.neidfyre.com/docs/data/metastores/#file-system-options" title="">
如果你想用an<一个class="reference internal" href="//www.neidfyre.com/docs/docs/archive/admin-guide/assume-role.html">实例配置文件,并设置假设角色,你必须设置:
fs.s3a.credentialsType
来AssumeRole
fs.s3a.stsAssumeRole.arn
到要承担的角色的Amazon资源名(ARN)
使用UI设置外部metastore<一个class="headerlink" href="//www.neidfyre.com/docs/data/metastores/#set-up-an-external-metastore-using-the-ui" title="">
使用Databricks UI设置外部metastore:
单击集群按钮。
点击创建集群.
输入以下内容<一个class="reference internal" href="//www.neidfyre.com/docs/docs/clusters/configure.html">Spark配置选项:
本地模式
# Hive特定的配置选项。#火花。添加hadoop前缀以确保这些Hive特定的选项将传播到metastore客户端。spark.hadoop.javax.jdo.option.ConnectionURL jdbc: mysql: / / < mysql-host >: < mysql-port > / < metastore-db ># JDBC metastore的驱动程序类名(运行时3.4及更高版本)spark.hadoop.javax.jdo.option.ConnectionDriverName org.mariadb.jdbc.Driver# JDBC metastore的驱动程序类名(在运行时3.4之前)# spark.hadoop.javax.jdo.option.ConnectionDriverName com.mysql.jdbc.Driverspark.hadoop.javax.jdo.option.ConnectionUserName < mysql-username >spark.hadoop.javax.jdo.option.ConnectionPassword < mysql-password ># Spark特定的配置选项spark.sql.hive.metastore.version < hive-version >如果
是0.13.x,则跳过此操作。 spark.sql.hive.metastore.jars < hive-jar-source >#如果您需要使用假设角色,取消以下设置的注释。# spark.hadoop.fs.s3a。credentialsType AssumeRole# spark.hadoop.fs.s3a.stsAssumeRole。是< sts-arn >远程模式
# Hive特定的配置选项#火花。添加hadoop前缀以确保这些Hive特定的选项将传播到metastore客户端。spark.hadoop.hive.metastore.uris节俭:/ / < metastore-host >: < metastore-port ># Spark特定的配置选项spark.sql.hive.metastore.version < hive-version >如果
是0.13.x,则跳过此操作。 spark.sql.hive.metastore.jars < hive-jar-source >#如果您需要使用假设角色,取消以下设置的注释。# spark.hadoop.fs.s3a。credentialsType AssumeRole# spark.hadoop.fs.s3a.stsAssumeRole。是< sts-arn >中的说明继续群集配置<一个class="reference internal" href="//www.neidfyre.com/docs/docs/clusters/configure.html">配置集群.
点击创建集群创建集群。
使用初始化脚本设置外部metastore<一个class="headerlink" href="//www.neidfyre.com/docs/data/metastores/#set-up-an-external-metastore-using-an-init-script" title="">
Init脚本让您连接到现有的Hive metastore,而无需手动设置所需的配置。
本地模式<一个class="headerlink" href="//www.neidfyre.com/docs/data/metastores/#local-mode" title="">
创建要存储初始化脚本的基本目录(如果不存在)。下面的示例使用
dbfs: /砖/脚本
.在笔记本中运行以下代码片段。代码片段创建初始化脚本
/砖/脚本/ external-metastore.sh
在<一个class="reference internal" href="//www.neidfyre.com/docs/docs/dbfs/index.html">数据库文件系统(DBFS).或者,您可以使用<一个class="reference internal" href="//www.neidfyre.com/docs/docs/dev-tools/api/latest/dbfs.html">DBFS REST API放操作创建初始化脚本。此init脚本将所需的配置选项写入名为00-custom-spark.conf
下的json格式/ / conf /砖/驱动程序
在集群的每个节点内部。Databricks提供Spark的默认配置/ / conf / spark-branch.conf砖/驱动程序
文件。配置文件/ conf /砖/驱动程序
目录按字母顺序倒序排列。如果要更改名称00-custom-spark.conf
文件,确保它继续适用之前spark-branch.conf
文件。
dbutils.fs.把(“砖/脚本/ external-metastore.sh”," " # !/bin/sh|#加载环境变量以确定要使用的正确JDBC驱动程序。|来源/etc/environment|#用单引号引用标签(即EOF)以禁用变量插值。猫| < < EOF的> / conf / 00-custom-spark.conf /砖/驱动程序|(司机){| #本地模式下的metastores的Hive特定配置选项。| #火花。添加hadoop前缀以确保这些Hive特定的选项将传播到metastore客户端。|“spark.hadoop.javax.jdo.option。ConnectionURL" = "jdbc:mysql://:/" |“spark.hadoop.javax.jdo.option。ConnectionUserName" = "" |“spark.hadoop.javax.jdo.option。ConnectionPassword" = "" || # Spark特定的配置选项|“spark.sql.hive.metastore。Version " = "" 如果是0.13.x,则跳过此操作。 |“spark.sql.hive.metastore。Jars " = "" || #如果您需要使用假设角色,取消以下设置的注释。“spark.hadoop.fs.s3a”。credentialsType" = "假设角色"| # "spark.hadoop.fs.s3a. stsassumption . ole. "Arn " = "" | EOF||case "$DATABRICKS_RUNTIME_VERSION" in| " ")|司机= " com.mysql.jdbc.Driver "|;;| *)|司机= " org.mariadb.jdbc.Driver "|;;| esac|#单独添加JDBC驱动程序,因为必须使用变量展开来选择正确的|#驱动版本。|cat << EOF >> /databricks/driver/conf/00-custom-spark.conf|“spark.hadoop.javax.jdo.option。ConnectionDriverName" = "$DRIVER"|}| EOF|”“”.stripMargin,覆盖=真正的)
内容=" " # !/bin/sh#加载环境变量以确定要使用的正确JDBC驱动程序。源/etc/environment#用单引号引用标签(即EOF)以禁用变量插值。猫< < EOF的> / conf / 00-custom-spark.conf /砖/驱动程序(司机){#在本地模式下为metastore配置特定的选项。#火花。添加hadoop前缀以确保这些Hive特定的选项将传播到metastore客户端。“spark.hadoop.javax.jdo.option。ConnectionURL" = "jdbc:mysql://:/" “spark.hadoop.javax.jdo.option。ConnectionUserName" = "" “spark.hadoop.javax.jdo.option。ConnectionPassword" = "" # Spark特定的配置选项“spark.sql.hive.metastore。Version " = "" 如果是0.13.x,则跳过此操作。 “spark.sql.hive.metastore。罐子" = "" #如果您需要使用假设角色,取消以下设置的注释。#“spark.hadoop.fs.s3a。credentialsType" = "假设角色"#“spark.hadoop.fs.s3a.stsAssumeRole。Arn " = "" EOFcase "$DATABRICKS_RUNTIME_VERSION"在" ")司机= " com.mysql.jdbc.Driver ";;*)司机= " org.mariadb.jdbc.Driver ";;esac单独添加JDBC驱动程序,因为必须使用变量展开来选择正确的驱动程序#驱动版本。cat << EOF >> /databricks/driver/conf/00-custom-spark.conf“spark.hadoop.javax.jdo.option。ConnectionDriverName" = "$DRIVER"}EOF”“”dbutils.fs.把(文件=“砖/脚本/ external-metastore.sh”,内容=内容,覆盖=真正的)
使用init脚本配置您的集群。
重新启动集群。
远程模式<一个class="headerlink" href="//www.neidfyre.com/docs/data/metastores/#remote-mode" title="">
创建要存储初始化脚本的基本目录(如果不存在)。下面的示例使用
dbfs: /砖/脚本
.在笔记本中运行以下代码片段:
dbutils.fs.把(“砖/脚本/ external-metastore.sh”," " # !/bin/sh||#用单引号引用标签(即EOF)以禁用变量插值。猫| < < EOF的> / conf / 00-custom-spark.conf /砖/驱动程序|(司机){| #蜂窝特定的配置选项的亚metastores远程模式。| #火花。添加hadoop前缀以确保这些Hive特定的选项将传播到metastore客户端。|“spark.hadoop.hive.metastore。Uris " = "thrift://
: || # Spark特定的配置选项|“spark.sql.hive.metastore。Version " = "" " 如果是0.13.x,则跳过此操作。 |“spark.sql.hive.metastore。Jars " = "" || #如果您需要使用假设角色,取消以下设置的注释。“spark.hadoop.fs.s3a”。credentialsType" = "假设角色"| # "spark.hadoop.fs.s3a. stsassumption . ole. "Arn " = "" |}| EOF|”“”.stripMargin,覆盖=真正的)内容=" " # !/bin/sh#用单引号引用标签(即EOF)以禁用变量插值。猫< < EOF的> / conf / 00-custom-spark.conf /砖/驱动程序(司机){#在远程模式下为metastores配置特定的选项。#火花。添加hadoop前缀以确保这些Hive特定的选项将传播到metastore客户端。“spark.hadoop.hive.metastore。Uris " = "thrift://
: # Spark特定的配置选项“spark.sql.hive.metastore。Version " = "" " 如果是0.13.x,则跳过此操作。 “spark.sql.hive.metastore。罐子" = "" #如果您需要使用假设角色,取消以下设置的注释。#“spark.hadoop.fs.s3a。credentialsType" = "假设角色"#“spark.hadoop.fs.s3a.stsAssumeRole。Arn " = "" }EOF”“”dbutils.fs.把(文件=“砖/脚本/ external-metastore.sh”,内容=内容,覆盖=真正的)使用init脚本配置您的集群。
重新启动集群。
故障排除<一个class="headerlink" href="//www.neidfyre.com/docs/data/metastores/#troubleshooting" title="">
集群无法启动(由于初始化脚本设置不正确)
如果设置外部metastore的init脚本导致集群创建失败,请将init脚本配置为<一个class="reference internal" href="//www.neidfyre.com/docs/docs/clusters/init-scripts.html">日志,并使用日志调试init脚本。
SQL语句错误:InvocationTargetException
完整异常堆栈跟踪中的错误消息模式:
引起的通过:javax.jdo.JDOFatalDataStoreException:不能来开放一个测验连接来的鉴于数据库.JDBCurl=[...]
外部metastore JDBC连接信息配置错误。验证配置的主机名、端口、用户名、密码和JDBC驱动程序类名。另外,确保用户名具有访问metastore数据库的权限。
完整异常堆栈跟踪中的错误消息模式:
要求表格失踪:“星”在目录""模式"".DataNucleus需要这表格来执行它的持久性操作.[...]
外部亚稳态数据库未正确初始化。验证您是否创建了metastore数据库,并在JDBC连接字符串中放入了正确的数据库名称。然后,使用以下两个Spark配置选项启动一个新的集群:
datanucleus.schema.autoCreateTables真实datanucleus.fixedDatastore假
通过这种方式,Hive客户端库将尝试在metastore数据库中自动创建和初始化表,当它试图访问它们但发现它们不存在时。
SQL语句错误:AnalysisException: Unable to instantiate org.apache.hadoop.hive.metastore.HiveMetastoreClient
完整异常stacktrace中的错误消息:
的指定的数据存储司机(司机的名字)是不发现在的类路径
集群被配置为使用错误的JDBC驱动程序。
如果将使用Runtime 3.4或更高版本的集群配置为使用MySQL而不是MariaDB驱动程序,则可能发生此错误。
datanucleus设置。一个utoCreateSchema to true doesn’t work as expected
默认情况下,Databricks也会设置datanucleus.fixedDatastore
来真正的
,这可以防止亚稳态数据库发生任何意外的结构变化。因此,Hive客户端库不能创建亚矿表,即使您设置datanucleus.autoCreateSchema
来真正的
.一般来说,这种策略对于生产环境更安全,因为它可以防止metastore数据库意外升级。
如果你想用的话datanucleus.autoCreateSchema
要帮助初始化metastore数据库,请确保设置了datanucleus.fixedDatastore
来假
.此外,您可能希望在初始化metastore数据库后翻转这两个标志,以便为生产环境提供更好的保护。
amazonclientexception:无法初始化SAX驱动程序来创建XMLReader
如果集群的版本为2.1.1-db5,则可能引发此异常。此问题已在2.1.1-db6中修复。对于2.1.1-db5,可以通过设置以下JVM属性作为的设置的一部分来修复此问题spark.driver.extraJavaOptions
而且spark.executor.extraJavaOptions
:
-Djavax.xml.datatype.DatatypeFactory=com.sun.org.apache.xerces.internal.jaxp.datatype.DatatypeFactoryImpl-Djavax.xml.parsers.DocumentBuilderFactory=com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl-Djavax.xml.parsers.SAXParserFactory=com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl-Djavax.xml.validation.SchemaFactory: https://www.w3.org/2001/XMLSchema=com.sun.org.apache.xerces.internal.jaxp.validation.XMLSchemaFactory-Dorg.xml.sax.driver=com.sun.org.apache.xerces.internal.parsers.SAXParser-Dorg.w3c.dom.DOMImplementationSourceList=com.sun.org.apache.xerces.internal.dom.DOMXSImplementationSourceImpl