外部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="">

  1. 使用spark.sql.hive.metastore.jars设置为maven而且spark.sql.hive.metastore.version来匹配你的亚转移瘤。

  2. 当集群运行时,搜索驱动日志,找到如下一行:

    17/11/18224119信息IsolatedClientLoader下载metastore罐子<路径>

    的目录<路径>是在集群的驱动节点中下载的jar的位置。

    或者,你也可以在Scala笔记本中运行以下代码来打印jar的位置:

    进口com类型安全配置ConfigFactory瓦尔路径ConfigFactory负载()。getString“java.io.tmpdir”println\nHive jar被下载到以下路径:路径\ n”
  3. 运行% shcp- r<路径>/ dbfs hive_metastore_jar(替换<路径>将此目录复制到DBFS根目录中名为hive_metastore_jar通过DBFS客户端在驱动节点。

  4. 创建一个<一个class="reference internal" href="//www.neidfyre.com/docs/docs/clusters/init-scripts.html">init脚本复制/ dbfs hive_metastore_jar到节点的本地文件系统,确保init脚本在访问DBFS客户端之前休眠几秒钟。这确保客户端已经准备好了。

  5. spark.sql.hive.metastore.jars使用此目录。如果初始化脚本复制/ dbfs hive_metastore_jar/砖/ hive_metastore_jars /,设置spark.sql.hive.metastore.jars/砖/ hive_metastore_jars / *.位置必须包括拖尾/*

  6. 重新启动集群。

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.credentialsTypeAssumeRole

  • 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:

  1. 单击集群按钮。

  2. 点击创建集群

  3. 输入以下内容<一个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 >
  4. 中的说明继续群集配置<一个class="reference internal" href="//www.neidfyre.com/docs/docs/clusters/configure.html">配置集群

  5. 点击创建集群创建集群。

使用初始化脚本设置外部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="">

  1. 创建要存储初始化脚本的基本目录(如果不存在)。下面的示例使用dbfs: /砖/脚本

  2. 在笔记本中运行以下代码片段。代码片段创建初始化脚本/砖/脚本/ 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文件。

dbutilsfs“砖/脚本/ 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”“”dbutilsfs文件“砖/脚本/ external-metastore.sh”内容内容覆盖真正的
  1. 使用init脚本配置您的集群。

  2. 重新启动集群。

远程模式<一个class="headerlink" href="//www.neidfyre.com/docs/data/metastores/#remote-mode" title="">

  1. 创建要存储初始化脚本的基本目录(如果不存在)。下面的示例使用dbfs: /砖/脚本

  2. 在笔记本中运行以下代码片段:

    dbutilsfs“砖/脚本/ 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”“”dbutilsfs文件“砖/脚本/ external-metastore.sh”内容内容覆盖真正的
  3. 使用init脚本配置您的集群。

  4. 重新启动集群。

故障排除<一个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

  • 完整异常堆栈跟踪中的错误消息模式:

    引起的通过javaxjdoJDOFatalDataStoreException不能开放一个测验连接鉴于数据库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.DatatypeFactorycom.sun.org.apache.xerces.internal.jaxp.datatype.DatatypeFactoryImpl-Djavax.xml.parsers.DocumentBuilderFactorycom.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl-Djavax.xml.parsers.SAXParserFactorycom.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl-Djavax.xml.validation.SchemaFactory: https://www.w3.org/2001/XMLSchemacom.sun.org.apache.xerces.internal.jaxp.validation.XMLSchemaFactory-Dorg.xml.sax.drivercom.sun.org.apache.xerces.internal.parsers.SAXParser-Dorg.w3c.dom.DOMImplementationSourceListcom.sun.org.apache.xerces.internal.dom.DOMXSImplementationSourceImpl