访问Hive数据源

更新时间:

云原生数据仓库 AnalyticDB MySQL 版Spark支持通过Thrift协议和JDBC协议访问Hive数据。您也可以对Hive数据源启用Kerberos认证,确保只有经过Kerberos认证的客户端能够访问集群、正常提交作业,以此保证数据安全性本文以E-MapReduce集群的Hive服务为例,介绍访问Hive数据源的方法。

前提条件

  • AnalyticDB for MySQL集群的产品系列为企业版、基础版或湖仓版

  • 已创建数据库账号。

  • AnalyticDB for MySQL集群与OSS存储空间位于相同地域。

  • AnalyticDB for MySQL集群与E-MapReduce集群位于相同地域。具体操作,请参见创建集群

  • E-MapReduce集群需满足以下要求:

    • 形态为EMR on ECS。

    • 业务场景为数据湖,需具有Hadoop-Common、HDFS、YARN和Hive服务,元数据为自建RDS内置MySQL

    重要

    如果您访问Kerberos加密的Hive数据源,确保已开启Kerberos身份认证

准备工作

  1. 下载AnalyticDB for MySQL Spark访问Hive依赖的JAR包。下载链接,请参见mysql-connector-java.jar

  2. (条件必选)如果服务端Hive版本低于Hive 2.3,且出现Hive版本不兼容时,请登录集群的Master节点,在/opt/apps/HIVE/hive-current/lib路径中,下载所有的Jar包。如何登录集群的Master节点,请参见登录集群

  3. (条件必选)如果Hive集群启用了Kerberos认证,需下载Kerberos认证相关的配置文件。

    1. 登录E-MapReduce集群。具体操作,请参见登录集群主节点

    2. 下载krb5.conf文件。具体操作,请参见Kerberos基础使用

    3. 下载hadoop.keytab、core-site.xmlhdfs-site.xml文件。具体操作如下:

      1. 执行以下语句,查找与Hadoop相关的环境变量和配置信息。

        env | grep hadoop

        返回示例如下:

        HADOOP_HOME=/opt/apps/HADOOP-COMMON/hadoop-common-current/
        HADOOP_CONF_DIR=/etc/taihao-apps/hadoop-conf
        PATH=/opt/apps/JINDOSDK/jindosdk-current/bin:/opt/apps/HADOOP-COMMON/hadoop-common-current/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/opt/apps/HIVE/hive-current/bin:/opt/apps/SPARK-EXTENSION/spark-extension-current/bin:/opt/apps/SPARK3/spark-current/bin:/root/bin
      2. 跳转至HADOOP_CONF_DIR参数所对应的目录下,下载hadoop.keytab、core-site.xmlhdfs-site.xml文件。

    4. 执行以下命令查看Principal。

      listprincs

      返回信息中前缀为hadoop/master的字符串即为所需的Principal。

  4. 将步骤1~3获取的JAR包和Kerberos认证相关的配置文件上传至OSS。具体操作,请参见简单上传

Spark Jar访问Hive数据源

  1. 编写访问Hive的示例程序(即Spark作业依赖的JAR包),并进行编译打包。本文生成的JAR包名称为hive_test.jar,生成后的JAR包需上传至OSS中。具体操作,请参见简单上传。示例代码如下:

    package com.aliyun.spark
    
    import org.apache.spark.sql.SparkSession
    
    object SparkHive {
     def main(args: Array[String]): Unit = {
     val sparkSession = SparkSession
     .builder()
     .appName("Spark HIVE TEST")
     .enableHiveSupport()
     .getOrCreate()
    
     val welcome = "hello, adb-spark"
    
     //Hive表名。
     val tableName = args(0)
    
     import sparkSession.implicits._
     //将只有一行一列数据的DataFrame: df存入Hive, 表名为用户传进来的tableName, 列名为welcome_col。
     val df = Seq(welcome).toDF("welcome_col")
     df.write.format("hive").mode("overwrite").saveAsTable(tableName)
    
     //从Hive中读取表tableName。
     val dfFromHive = sparkSession.sql(
     s"""
     |select * from $tableName
     |""".stripMargin)
     dfFromHive.show(10)
     }
    }
  2. 登录云原生数据仓库AnalyticDB MySQL控制台,在左上角选择集群所在地域。在左侧导航栏,单击集群列表,在企业版、基础版或湖仓版页签下,单击目标集群ID。

  3. 在左侧导航栏,单击作业开发 > Spark Jar 开发

  4. 在编辑器窗口上方,选Job型资源组Batch作业类型,编写Spark作业。

    访问Hive数据源

    支持通过不同协议方式连接元数据库。

    通过Thrift协议连接元数据库

    {
      "args": [
        "hello_adb"
      ],
      "jars": [
        # AnalyticDB MySQL Spark访问Hive依赖的Jar包。
        "oss://<bucket_name>/mysql-connector-java.jar",
        # 服务端Hive依赖的Jar包。
        "oss://<bucket_name>/hive_lib/*" 
      ],
      "file": "oss://<bucket_name>/hive_test.jar" ,
      "name": "spark-on-hive",
      "className": "com.aliyun.spark.SparkHive",
      "conf": {
        "spark.adb.eni.enabled": "true",
        "spark.adb.eni.adbHostAlias.enabled": "true",
        "spark.adb.eni.vswitchId": "vsw-bp1mbnyrjtf3ih1****",    
        "spark.adb.eni.securityGroupId": "sg-bp180fryne3qle****",
        "spark.driver.resourceSpec": "medium",
        "spark.executor.instances": 1,
        "spark.executor.resourceSpec": "medium",
        "spark.hadoop.hive.metastore.uris":"thrift://master-1-1.c-9c9b32****.cn-hangzhou.emr.aliyuncs.com:9083",
        "spark.adb.eni.extraHosts":"172.24.xx.xx master-1.c-9c9b322d****.cn-hangzhou.emr.aliyuncs.com", 
        # 仅E-MapReduce集群为高可用集群时,需配置以下参数。
        "spark.hadoop.dfs.nameservices":"<dfs.nameservices名称>",
        "spark.hadoop.dfs.client.failover.proxy.provider.<dfs.nameservices名称>":"org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider",
        "spark.hadoop.dfs.ha.namenodes.<dfs.nameservices名称>":"<namenode名称>",
        "spark.hadoop.dfs.namenode.rpc-address.<dfs.nameservices名称>.<NameNode名称>":"master-1-1.c-9c9b322****.cn-hangzhou.emr.aliyuncs.com:9000",
        # 服务端Hive版本低于Hive 2.3,且出现Hive版本不兼容时,自定义Hive版本的配置项。
        "spark.sql.hive.metastore.jars": "path",
        "spark.sql.hive.metastore.version": "<实际的Hive版本>",
        "spark.sql.hive.metastore.jars.path": "/tmp/*/*.jar"
      }
    }

    参数说明:

    说明

    表格中的参数是否必填仅针对本文档的操作场景。

    参数

    是否必填

    说明

    args

    请根据业务需求,填写使用Jar包时需要的参数。多个参数之间以英文逗号(,)分隔。

    name

    Spark作业名称。

    className

    Java或者Scala程序入口类名称。Python不需要指定入口类。

    jars

    Spark作业依赖的Jar包所在的OSS路径。

    file

    示例程序hive_test.jar所在的OSS路径。

    spark.adb.eni.enabled

    开启ENI访问的开关。配置为true表示开启ENI访问。

    spark.adb.eni.adbHostAlias.enabled

    开启Spark解析Hive表位置域名信息的开关,需要配置为true。

    spark.adb.eni.vswitchId

    E-MapReduce集群所在专有网络的交换机ID。

    登录专有网络页面,在目标专有网络的资源管理页签查看交换机ID。

    spark.adb.eni.securityGroupId

    安全组ID。在目标E-MapReduce集群基础信息页面获取安全组ID。

    spark.adb.eni.extraHosts

    Spark解析Hive表位置时,需要额外传入IP和表格存储节点Host的映射关系,以便Spark能正确解析表位置的域名信息。

    • 获取域名:在自建集群的<Hive_CONF_DIR>/core-site.xml文件中查看fs.defaultFS获取域名。例如,fs.defaultFs的值为: hdfs://master-1.c-9c9b322d****.cn-hangzhou.emr.aliyuncs.com:9000,则域名为master-1.c-9c9b322d****.cn-hangzhou.emr.aliyuncs.com。

    • 获取IP:登录自建集群的Master节点,在/etc/hosts中查看IP和域名的对应关系,获取IP。

    说明
    • 当集群为自建Hive集群,且遇到域名无法解析时,此参数必填。如果是E-MapReduce集群,DNS服务可以解析该域名,此参数非必填。

    • IP和域名之间用空格隔开。多个IP和域名用英文逗号(,)隔开,如 "ip0 master0, ip1 master1"。

    spark.hadoop.hive.metastore.uris

    配置访问Hive Metastore的URI。

    登录EMR on ECS控制台,在集群服务页面的Hive配置中查看hive.metastore.uris对应的配置值。

    spark.hadoop.dfs.nameservices

    HDFS服务的名称。

    登录EMR on ECS控制台,在集群服务页面的HDFS配置中查看dfs.nameservices对应的配置值。

    说明

    当E-MapReduce集群为高可用集群时,此参数必填。

    spark.hadoop.dfs.client.failover.proxy.provider.<dfs.nameservices名称>

    指定Client连接NameNode的Provider。

    登录EMR on ECS控制台,在集群服务页面的HDFS配置中查看dfs.client.failover.proxy.provider.<nameservices名称>对应的配置值。默认值为org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider

    说明

    当E-MapReduce集群为高可用集群时,此参数必填。

    spark.hadoop.dfs.ha.namenodes.<dfs.nameservices名称>

    NameNode的名称。

    登录EMR on ECS控制台,在集群服务页面的HDFS配置中查看hdfs-site.xml中的dfs.ha.namenodes.<dfs.nameservices名称>对应的配置值。

    说明

    当E-MapReduce集群为高可用集群时,此参数必填。

    spark.hadoop.dfs.namenode.rpc-address.<dfs.nameservices名称>.<namenode名称>

    指定NameNode的RPC地址信息。

    登录EMR on ECS控制台,在集群服务页面的HDFS配置中查看dfs.namenode.rpc-address.<dfs.nameservices名称>.<namenode名称>对应的配置值。

    说明

    当E-MapReduce集群为高可用集群时,此参数必填。

    spark.sql.hive.metastore.jars

    固定取值为path

    说明

    当服务端Hive版本低于Hive 2.3,且出现Hive版本不兼容时,此参数必填。

    spark.sql.hive.metastore.version

    服务端Hive版本号。

    说明

    当服务端Hive版本低于Hive 2.3,且出现Hive版本不兼容时,此参数必填。

    spark.sql.hive.metastore.jars.path

    固定取值为/tmp/*/*.jar

    说明

    当服务端Hive版本低于Hive 2.3,且出现Hive版本不兼容时,此参数必填。

    conf其他参数

    与开源Spark中的配置项基本一致,参数格式为key:value形式,多个参数之间以英文逗号(,)分隔。更多conf参数,请参见Conf配置参数

    通过JDBC协议连接元数据库

    {
      "args": [
        "hello_adb"
      ],
      "name": "spark-on-hive",
      "className": "com.aliyun.spark.SparkHive", 
      "jars": [
        # AnalyticDB MySQL Spark访问Hive依赖的Jar包。
        "oss://<bucket_name>/mysql-connector-java.jar",
        # 服务端Hive依赖的Jar包。
        "oss://<bucket_name>/hive_lib/*" 
      ],
      "file": "oss://<bucket_name>/hive_test.jar" ,
      "conf": {
        "spark.adb.eni.enabled": "true",
        "spark.adb.eni.vswitchId": "vsw-bp1mbnyrjtf3ih1****",    
        "spark.adb.eni.securityGroupId": "sg-bp180fryne3qle****",
        "spark.adb.eni.adbHostAlias.enabled": "true",
        "spark.adb.eni.extraHosts":"172.24.xx.xx master-1.c-9c9b322d****.cn-hangzhou.emr.aliyuncs.com", 
        "spark.driver.resourceSpec": "medium",
        "spark.executor.instances": 1,
        "spark.executor.resourceSpec": "medium",
        "spark.sql.catalogImplementation": "hive",
        "spark.hadoop.javax.jdo.option.ConnectionDriverName": "com.mysql.jdbc.Driver",
        "spark.hadoop.javax.jdo.option.ConnectionUserName": "<hive_username>",
        "spark.hadoop.javax.jdo.option.ConnectionPassword": "<hive_password>",
        "spark.hadoop.javax.jdo.option.ConnectionURL": "jdbc:mysql://rm-bp1h5d11r8qtm****.mysql.rds.aliyuncs.com/<数据库名称>", 
        # 服务端Hive版本低于Hive 2.3,且出现Hive版本不兼容时,自定义Hive版本的配置项。
        "spark.sql.hive.metastore.jars": "path",
        "spark.sql.hive.metastore.version": "<实际的Hive版本>",
        "spark.sql.hive.metastore.jars.path": "/tmp/*/*.jar"
      }
    }

    参数说明:

    说明

    表格中的参数是否必填仅针对本文档的操作场景。

    参数

    是否必填

    说明

    args

    请根据业务需求,填写使用Jar包时需要的参数。多个参数之间以英文逗号(,)分隔。

    name

    Spark作业名称。

    className

    Java或者Scala程序入口类名称。Python不需要指定入口类。

    jars

    Spark作业依赖的Jar包所在的OSS路径。

    file

    示例程序hive_test.jar所在的OSS路径。

    spark.adb.eni.enabled

    开启ENI访问的开关。配置为true表示开启ENI访问。

    spark.adb.eni.vswitchId

    E-MapReduce集群所在专有网络的交换机ID。

    登录专有网络页面,在目标专有网络的资源管理页签查看交换机ID。

    spark.adb.eni.securityGroupId

    安全组ID。

    在目标Hive集群基础信息页面获取安全组ID。

    spark.adb.eni.adbHostAlias.enabled

    开启Spark解析Hive表位置域名信息的开关,需要配置为true。

    spark.adb.eni.extraHosts

    Spark解析Hive表位置时,需要额外传入IP和表格存储节点Host的映射关系,以便Spark能正确解析表位置的域名信息。

    • 获取域名:在自建集群的<Hive_CONF_DIR>/core-site.xml文件中查看fs.defaultFS获取域名。例如,fs.defaultFs的值为: hdfs://master-1.c-9c9b322d****.cn-hangzhou.emr.aliyuncs.com:9000,则域名为master-1.c-9c9b322d****.cn-hangzhou.emr.aliyuncs.com。

    • 获取IP:登录自建集群的Master节点,在/etc/hosts中查看IP和域名的对应关系,获取IP。

    说明
    • 当集群为自建Hive集群,且遇到域名无法解析时,此参数必填。如果是E-MapReduce集群,DNS服务可以解析该域名,此参数非必填。

    • IP和域名之间用空格隔开。多个IP和域名用英文逗号(,)隔开,如 "ip0 master0, ip1 master1"。

    spark.hadoop.javax.jdo.option.ConnectionDriverName

    连接驱动程序名称。

    登录EMR on ECS控制台,在集群服务页面的Hive配置中查看hivemetastore-site.xml中的javax.jdo.option.ConnectionDriverName对应的配置值。

    spark.hadoop.javax.jdo.option.ConnectionUserName

    自建RDS或内置MySQL数据库账号名称。

    登录EMR on ECS控制台,在集群服务页面的Hive配置中查看hivemetastore-site.xml中的javax.jdo.option.ConnectionUserName对应的配置值。

    spark.hadoop.javax.jdo.option.ConnectionPassword

    数据库账号对应的密码。

    登录EMR on ECS控制台,在集群服务页面的Hive配置中查看hivemetastore-site.xml中的javax.jdo.option.ConnectionPassword对应的配置值。

    spark.hadoop.javax.jdo.option.ConnectionURL

    数据库访问地址和库名。

    填写格式为jdbc:mysql://rm-xxxxxx.mysql.rds.aliyuncs.com/<数据库名称>

    登录EMR on ECS控制台,在集群服务页面的Hive配置中查看hivemetastore-site.xml中的javax.jdo.option.ConnectionURL对应的配置值。

    spark.sql.hive.metastore.jars

    固定取值为path

    说明

    当服务端Hive版本低于Hive 2.3,且出现Hive版本不兼容时,此参数必填。

    spark.sql.hive.metastore.version

    服务端Hive版本号。

    说明

    当服务端Hive版本低于Hive 2.3,且出现Hive版本不兼容时,此参数必填。

    spark.sql.hive.metastore.jars.path

    固定取值为/tmp/*/*.jar

    说明

    当服务端Hive版本低于Hive 2.3,且出现Hive版本不兼容时,此参数必填。

    conf其他参数

    与开源Spark中的配置项基本一致,参数格式为key:value形式,多个参数之间以英文逗号(,)分隔。更多conf参数,请参见Conf配置参数

    访问Kerberos加密的Hive数据源

    {
      "args": ["hello_adb"],
      "name": "spark-on-hive",
      "className": "com.aliyun.spark.SparkHive", 
      "jars": [
        # Spark访问Hive依赖的Jar包。
        "oss://testBucketname/mysql-connector-java.jar",
        # 服务端Hive依赖的Jar包,Hive版本不兼容时填写。
        "oss://testBucketname/hive_lib/*" ],
      "file": "oss://testBucketname/hive_test.jar" ,
      "conf": {
        "spark.adb.eni.enabled": "true",
        "spark.adb.eni.vswitchId": "vsw-bp1mbnyrjtf3ih1****",    
        "spark.adb.eni.securityGroupId": "sg-bp180fryne3qle****",
        "spark.adb.eni.adbHostAlias.enabled": "true",
        "spark.adb.eni.extraHosts":"172.24.xx.xx master-1.c-9c9b322d****.cn-hangzhou.emr.aliyuncs.com", 
        "spark.driver.resourceSpec": "medium",
        "spark.executor.instances": 1,
        "spark.executor.resourceSpec": "medium",
        "spark.sql.catalogImplementation": "hive",
        "spark.hadoop.javax.jdo.option.ConnectionDriverName": "com.mysql.jdbc.Driver",
        "spark.hadoop.javax.jdo.option.ConnectionUserName": "hive_username",
        "spark.hadoop.javax.jdo.option.ConnectionPassword": "hive_password",
        "spark.hadoop.javax.jdo.option.ConnectionURL": "jdbc:mysql://master-1-1.c-49f95900****.cn-beijing.emr.aliyuncs.com/hivemeta?createDatabaseIfNotExist=true&characterEncoding=UTF-8", 
        # 服务端Hive版本低于Hive 2.3,且出现Hive版本不兼容时,自定义Hive版本的配置项。
        "spark.sql.hive.metastore.jars": "path",
        "spark.sql.hive.metastore.version": "实际的Hive版本",
        "spark.sql.hive.metastore.jars.path": "/tmp/*/*.jar"
        # Kerberos相关配置。
        "spark.kubernetes.driverEnv.ADB_SPARK_DOWNLOAD_FILES": "oss://testBucketname/hadoop/hadoop.keytab, oss://testBucketname/hadoop/core-site.xml, oss://testBucketname/hadoop/hdfs-site.xml",
        "spark.executorEnv.ADB_SPARK_DOWNLOAD_FILES": "oss://testBucketname/hadoop/krb5.conf, oss://testBucketname/hadoop/hadoop.keytab, oss://testBucketname/hadoop/core-site.xml, oss://testBucketname/hadoop/hdfs-site.xml",
        "spark.kubernetes.driverEnv.HADOOP_CONF_DIR": "/tmp/testBucketname/hadoop",
        "spark.executorEnv.HADOOP_CONF_DIR": "/tmp/testBucketname/hadoop",
        "spark.kerberos.keytab": "local:///tmp/testBucketname/hadoop/hadoop.keytab",
        "spark.executor.extraJavaOptions":"-Djava.security.krb5.conf=/tmp/testBucketname/hadoop/krb5.conf",
        "spark.kubernetes.kerberos.krb5.path": "oss://testBucketname/hadoop/krb5.conf",
        "spark.kerberos.principal":"hadoop/master-1-1.c-49f95900****.cn-beijing.emr.aliyuncs.com@EMR.C-49F95900****.COM"
      }
    }

    参数说明:

    参数

    是否必填

    说明

    args

    请根据业务需求,填写使用JAR包时需要使用的参数。多个参数之间以英文逗号(,)分隔。

    className

    Java程序入口类名称。

    jars

    Spark作业依赖的JAR包所在的OSS路径。

    file

    示例程序hive_test.jar所在的OSS路径。

    spark.adb.eni.enabled

    是否开启ENI访问的开关。

    访问Kerberos加密的Hive数据源时需配置为true。

    spark.adb.eni.vswitchId

    E-MapReduce集群所在专有网络的交换机ID。

    登录专有网络页面,在目标专有网络的资源管理页签查看交换机ID。

    spark.adb.eni.securityGroupId

    安全组ID。在目标E-MapReduce集群基础信息页面获取安全组ID。

    spark.adb.eni.adbHostAlias.enabled

    开启Spark解析Hive表位置域名信息的开关,需要配置为true。

    spark.sql.catalogImplementation

    访问Hive数据源时,填写为hive

    spark.hadoop.javax.jdo.option.ConnectionDriverName

    连接驱动程序名称。

    登录EMR on ECS控制台,在集群服务页面的Hive配置中查看hivemetastore-site.xml中的javax.jdo.option.ConnectionDriverName对应的配置值。

    spark.hadoop.javax.jdo.option.ConnectionUserName

    自建RDS或内置MySQL数据库账号名称。

    登录EMR on ECS控制台,在集群服务页面的Hive配置中查看hivemetastore-site.xml中的javax.jdo.option.ConnectionUserName对应的配置值。

    spark.hadoop.javax.jdo.option.ConnectionPassword

    数据库账号对应的密码。

    登录EMR on ECS控制台,在集群服务页面的Hive配置中查看hivemetastore-site.xml中的javax.jdo.option.ConnectionPassword对应的配置值。

    spark.hadoop.javax.jdo.option.ConnectionURL

    数据库访问地址和库名。

    登录EMR on ECS控制台,在集群服务页面的Hive配置中查看hivemetastore-site.xml中的javax.jdo.option.ConnectionURL对应的配置值。

    spark.kubernetes.driverEnv.ADB_SPARK_DOWNLOAD_FILES

    Spark Driver节点参数,用于指定hadoop.keytab、core-site.xmlhdfs-site.xml文件所在的OSS路径。

    spark.executorEnv.ADB_SPARK_DOWNLOAD_FILES

    Spark Executor节点参数,用于指定krb5.conf、hadoop.keytab、core-site.xmlhdfs-site.xml文件所在的OSS路径。

    spark.kubernetes.driverEnv.HADOOP_CONF_DIR

    Spark Driver节点参数,用于指定hadoop.keytab、core-site.xmlhdfs-site.xml文件所在的本地路径。格式为/tmp/<文件所在OSS目录>

    例如,hadoop.keytab、core-site.xmlhdfs-site.xml文件所在的OSS目录为oss://testBucketname/hadoop,则本地路径为/tmp/testBucketname/hadoop

    spark.executorEnv.HADOOP_CONF_DIR

    Spark Executor节点参数,用于指定hadoop.keytab、core-site.xmlhdfs-site.xml文件所在的本地路径。格式为/tmp/<文件所在OSS目录>

    例如,hadoop.keytab、core-site.xmlhdfs-site.xml文件所在的OSS目录为oss://testBucketname/hadoop,则本地路径为/tmp/testBucketname/hadoop

    spark.kerberos.keytab

    hadoop.keytab文件所在的本地路径。格式为:local:///tmp/<hadoop.keytab文件OSS路径>

    例如,hadoop.keytab文件所在的OSS路径为oss://testBucketname/hadoop/hadoop.keytab,则本地路径为local:///tmp/testBucketname/hadoop/hadoop.keytab

    spark.executor.extraJavaOptions

    Spark Executor节点参数。用于指定krb5.conf文件所在的本地路径。格式为:/tmp/<krb5.conf文件OSS路径>

    例如,krb5.conf文件所在的OSS路径为oss://testBucketname/hadoop/krb5.conf,则本地路径为/tmp/testBucketname/hadoop/krb5.conf

    spark.kubernetes.kerberos.krb5.path

    krb5.conf文件所在的OSS路径。

    spark.kerberos.principal

    准备工作中获取的Principal。

    spark.adb.eni.extraHosts

    Spark解析Hive表位置时,需要额外传入IP和表格存储节点Host的映射关系,以便Spark能正确解析表位置的域名信息。

    • 获取域名:在自建集群的<Hive_CONF_DIR>/core-site.xml文件中查看fs.defaultFS获取域名。例如,fs.defaultFs的值为: hdfs://master-1.c-9c9b322d****.cn-hangzhou.emr.aliyuncs.com:9000,则域名为master-1.c-9c9b322d****.cn-hangzhou.emr.aliyuncs.com。

    • 获取IP:登录自建集群的Master节点,在/etc/hosts中查看IP和域名的对应关系,获取IP。

    说明
    • 当集群为自建Hive集群,且遇到域名无法解析时,此参数必填。如果是E-MapReduce集群,DNS服务可以解析该域名,此参数非必填。

    • IP和域名之间用空格隔开。多个IP和域名用英文逗号(,)隔开,如 "ip0 master0, ip1 master1"。

    spark.sql.hive.metastore.jars

    固定取值为path

    说明

    当服务端Hive版本低于Hive 2.3,且出现Hive版本不兼容时,此参数必填。

    spark.sql.hive.metastore.version

    服务端Hive版本号。

    说明

    当服务端Hive版本低于Hive 2.3,且出现Hive版本不兼容时,此参数必填。

    spark.sql.hive.metastore.jars.path

    固定取值为/tmp/*/*.jar

    说明

    当服务端Hive版本低于Hive 2.3,且出现Hive版本不兼容时,此参数必填。

    conf其他参数

    与开源Spark中的配置项基本一致,参数格式为key:value形式,多个参数之间以英文逗号(,)分隔。更多conf参数,请参见Spark应用配置参数说明

Spark SQL访问Hive数据源

  1. 登录云原生数据仓库AnalyticDB MySQL控制台,在左上角选择集群所在地域。在左侧导航栏,单击集群列表,在企业版、基础版或湖仓版页签下,单击目标集群ID。

  2. 在左侧导航栏,单击作业开发 > SQL开发

  3. 在编辑器窗口上方,选Spark引擎Job型资源组,编写Spark SQL作业后,单击执行SQL

    访问Hive数据源

    支持通过不同协议方式连接元数据库。

    通过Thrift 协议连接元数据库

    SET spark.adb.eni.enabled=true;
    SET spark.adb.eni.vswitchId=vsw-bp1mbnyrjtf3ih1****; 
    SET spark.adb.eni.securityGroupId=sg-bp180fryne3qle****;
    SET spark.adb.eni.adbHostAlias.enabled=true;
    SET spark.driver.resourceSpec=medium;
    SET spark.executor.instances=1;
    SET spark.executor.resourceSpe=medium;
    SET spark.sql.catalogImplementation=hive;
    SET spark.hadoop.hive.metastore.uris=thrift://master-1-1.c-9c9b32****.cn-hangzhou.emr.aliyuncs.com:9083;
    SET spark.sql.hive.metastore.version=2.3.9.adb;
    -- 仅E-MapReduce集群为高可用集群时,需配置以下参数。
    SET spark.hadoop.dfs.nameservices=<dfs.nameservices名称>;
    SET spark.hadoop.dfs.client.failover.proxy.provider.<dfs.nameservices名称>=org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider;
    SET spark.hadoop.dfs.ha.namenodes.<dfs.nameservices名称>=<namenode名称>;
    SET spark.hadoop.dfs.namenode.rpc-address.<dfs.nameservices名称>.<NameNode名称>=master-1-1.c-9c9b322****.cn-hangzhou.emr.aliyuncs.com:9000;
    -- 服务端Hive版本低于Hive 2.3,且出现Hive版本不兼容时,自定义Hive版本的配置项。
    SET spark.sql.hive.metastore.jars=path;
    SET spark.sql.hive.metastore.version=实际的Hive版本;
    SET spark.sql.hive.metastore.jars.path=/tmp/*/*.jar;
    -- SQL语句。
    SHOW databases;

    参数说明请参见参数说明

    通过JDBC 协议连接元数据库

    SET spark.adb.eni.enabled=true;
    SET spark.adb.eni.vswitchId=vsw-bp1mbnyrjtf3ih1****; 
    SET spark.adb.eni.securityGroupId=sg-bp180fryne3qle****;
    SET spark.adb.eni.adbHostAlias.enabled=true;
    SET spark.driver.resourceSpec=medium;
    SET spark.executor.instances=1;
    SET spark.executor.resourceSpe=medium;
    SET spark.sql.catalogImplementation=hive;
    SET spark.hadoop.javax.jdo.option.ConnectionDriverName=com.mysql.jdbc.Driver;
    SET spark.hadoop.javax.jdo.option.ConnectionUserName=hive_username;
    SET spark.hadoop.javax.jdo.option.ConnectionPassword=hive_password;
    SET spark.hadoop.javax.jdo.option.ConnectionURL=jdbc:mysql://rm-bp1h5d11r8qtm****.mysql.rds.aliyuncs.com/dbname;
    SET spark.sql.hive.metastore.version=2.3.9.adb;
    -- 服务端Hive版本低于Hive 2.3,且出现Hive版本不兼容时,自定义Hive版本的配置项。
    SET spark.sql.hive.metastore.jars=path;
    SET spark.sql.hive.metastore.version=实际的Hive版本;
    SET spark.sql.hive.metastore.jars.path=/tmp/*/*.jar;
    -- SQL语句。
    SHOW databases;

    参数说明请参见参数说明

    访问Kerberos加密的Hive数据源

    SET spark.adb.eni.enabled=true;
    SET spark.adb.eni.vswitchId=vsw-bp1mbnyrjtf3ih1****; 
    SET spark.adb.eni.securityGroupId=sg-bp180fryne3qle****;
    SET spark.adb.eni.adbHostAlias.enabled=true;
    SET spark.driver.resourceSpec=medium;
    SET spark.executor.instances=1;
    SET spark.executor.resourceSpe=medium;
    SET spark.sql.catalogImplementation=hive;
    SET spark.hadoop.javax.jdo.option.ConnectionDriverName=com.mysql.jdbc.Driver;
    SET spark.hadoop.javax.jdo.option.ConnectionUserName=hive_username;
    SET spark.hadoop.javax.jdo.option.ConnectionPassword=hive_password;
    SET spark.hadoop.javax.jdo.option.ConnectionURL=jdbc:mysql://rm-bp1h5d11r8qtm****.mysql.rds.aliyuncs.com/dbname;
    SET spark.kubernetes.driverEnv.ADB_SPARK_DOWNLOAD_FILES=oss://testBucketname/hadoop/hadoop.keytab, oss://testBucketname/hadoop/core-site.xml, oss://testBucketname/hadoop/hdfs-site.xml;
    SET spark.executorEnv.ADB_SPARK_DOWNLOAD_FILES=oss://testBucketname/hadoop/krb5.conf, oss://testBucketname/hadoop/hadoop.keytab, oss://testBucketname/hadoop/core-site.xml, oss://testBucketname/hadoop/hdfs-site.xml;
    SET spark.kubernetes.driverEnv.HADOOP_CONF_DIR=/tmp/testBucketname/hadoop;
    SET spark.executorEnv.HADOOP_CONF_DIR=/tmp/testBucketname/hadoop;
    SET spark.kerberos.keytab=local:///tmp/testBucketname/hadoop/hadoop.keytab;
    SET spark.kubernetes.kerberos.krb5.path=oss://testBucketname/hadoop/krb5.conf;
    SET spark.executor.extraJavaOptions=-Djava.security.krb5.conf=/tmp/testBucketname/hadoop/krb5.conf;
    SET spark.kerberos.principal=hadoop/master-1-1.c-49f95900****.cn-beijing.emr.aliyuncs.com@EMR.C-49F95900****.COM;
    SET spark.sql.hive.metastore.version=2.3.9.adb;
    -- 服务端Hive版本低于Hive 2.3,且出现Hive版本不兼容时,自定义Hive版本的配置项。
    SET spark.sql.hive.metastore.jars=path;
    SET spark.sql.hive.metastore.version=实际的Hive版本;
    SET spark.sql.hive.metastore.jars.path=/tmp/*/*.jar;
    -- SQL语句。
    SHOW databases;

    参数说明请参见参数说明