全部产品
Search
文档中心

云原生数据湖分析 DLA - 文档停止维护:Hive

更新时间:Jan 15, 2024

本文主要介绍如何使用DLA Spark访问用户VPC中的Hive集群。

重要

云原生数据湖分析(DLA)产品已退市,云原生数据仓库 AnalyticDB MySQL 版湖仓版支持DLA已有功能,并提供更多的功能和更好的性能。AnalyticDB for MySQL相关使用文档,请参见访问Hive数据源

前提条件

  • 您已开通数据湖分析DLA(Data Lake Analytics)服务,如何开通,请参见开通云原生数据湖分析服务

  • 您已登录云原生数据库分析DLA控制台,在云原生数据湖分析DLA控制台上创建了Spark虚拟集群创建虚拟集群

  • 您已开通对象存储OSS(Object Storage Service)服务。如何开通,请参见开通OSS服务

  • 准备创建Spark计算节点所需要的交换机ID安全组ID,可以选择已有的交换机和安全组,也可以新建交换机和安全组。交换机和安全组需要满足以下条件:

    • 交换机需要与您的Hive服务集群在同一VPC下。可使用您Hive集群控制台上的交换机ID。

    • 安全组需要与您的Hive服务集群在同一VPC下。您可以前往ECS管理控制台-网络与安全-安全组按照专有网络(VPC)ID搜索该VPC下的安全组,任意选择一个安全组ID即可。

    • 如果您的Hive服务有白名单控制,需要您将交换机网段加入到您Hive服务的白名单中。

操作步骤

  1. 如果您的Hive元数据使用的是独立的RDS且表数据存放在OSS中,则可以使用下列配置并跳过后续步骤,否则请您从第二步开始配置。

    {
        
        "name": "spark-on-hive",
        "className": "com.aliyun.spark.SparkHive", #连接Hive的测试代码,按需修改名称
        "jars": [
            "oss://path/to/mysql-connector-java-5.1.47.jar"
        ],
        "conf": {
            "spark.dla.eni.vswitch.id": "<交换机ID>",    
            "spark.dla.eni.security.group.id": "<安全组ID>",
            "spark.dla.eni.enable": "true",
            "spark.driver.resourceSpec": "medium",
            "spark.dla.connectors": "oss",
            "spark.executor.instances": 1,
            "spark.sql.catalogImplementation": "hive",
            "spark.executor.resourceSpec": "medium",
            "spark.hadoop.javax.jdo.option.ConnectionDriverName": "com.mysql.jdbc.Driver",
            "spark.hadoop.javax.jdo.option.ConnectionUserName": "<hive_user_name>", #Hive RDS的用户名 
            "spark.hadoop.javax.jdo.option.ConnectionPassword": "<your_pass_word>", #Hive RDS的密码
            "spark.hadoop.javax.jdo.option.ConnectionURL": "<jdbc连接>", #Hive RDS 的jdbc链接
            "spark.dla.job.log.oss.uri": "<日志目录路径>"
        },
        "file": "<oss://主资源Jar包路径>"
    }
    说明

    jars中指定的Jar包是MySQL的jdbc连接器,可从官方Maven仓库,并上传到oss。

  2. 获取需要在DLA Spark配置的Hive相关参数。

    说明

    如果您无法在您的Hive服务所在的集群中执行spark作业,可以跳过这步。

    我们提供了工具来读取你Hive服务所在的集群的配置,您可以按照下面的地址下载spark-examples-0.0.1-SNAPSHOT-shaded.jar并上传至OSS, 然后提交Spark作业到您的Hive服务所在集群上执行,即可在作业输出中获得访问您Hive集群所需的配置。

    wget https://dla003.oss-cn-hangzhou.aliyuncs.com/GetSparkConf/spark-examples-0.0.1-SNAPSHOT-shaded.jar
    • EMR集群用户将Jar包上传至OSS后,可以通过以下命令提交作业到EMR集群获取配置作业:

      --class com.aliyun.spark.util.GetConfForServerlessSpark
      --deploy-mode client
      ossref://{path/to}/spark-examples-0.0.1-SNAPSHOT-shaded.jar
      get hive hadoop

      作业运行完毕后,可以通过SparkUI查看driver的stdout输出或者从作业详情中的提交日志中查看输出的配置。图片

    • 云Hbase-Spark用户可以将Jar包上传至资源管理目录后,用以下命令提交获取配置作业:

      --class com.aliyun.spark.util.GetConfForServerlessSpark
      /{path/to}/spark-examples-0.0.1-SNAPSHOT-shaded.jar
      get hive hadoop

      等待作业完成后,通过SparkUI的driver中的stdout查看输出配置。

    • 其他Hive集群,如果您在集群上未设置HIVE_CONF_DIR环境变量,则需要手动输入HIVE_CONF_DIR路径。

      --class com.aliyun.spark.util.GetConfForServerlessSpark
      --deploy-mode client
      /{path/to}/spark-examples-0.0.1-SNAPSHOT-shaded.jar
      get --hive-conf-dir </path/to/your/hive/conf/dir> hive hadoop
  3. 编写访问Hive的SparkApplication。

    以下示例代码可以首先根据用户传入的表名,在用户default namespace创建一个表,该表只有一列字符串类型的数据,内容为hello, dla-spark,然后从该表读出这一列数据,并打印到stdout:

    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, dla-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)
      }
    }
  4. 将SparkApplication Jar包和依赖上传至OSS中。

    详情请参见控制台上传文件

    说明

    OSS所在的region和Serverless Spark所在的region需要保持一致。

  5. 在DLA Spark中提交作业并进行计算。

    • 访问Hive,如果您集群中的HDFS是以高可用部署(即您的集群有一个以上Master节点/NameNode),详情请参见创建和执行Spark作业作业配置指南

      {
          "args": [
              "hello_dla"
          ],
          "name": "spark-on-hive",
          "className": "com.aliyun.spark.SparkHive",
          "conf": {
          "spark.sql.catalogImplementation":"hive",
          "spark.dla.eni.vswitch.id": "{您的交换机ID}",
          "spark.dla.eni.security.group.id": "{您的安全组ID}",
          "spark.dla.eni.enable": "true",
          "spark.driver.resourceSpec": "medium",
          "spark.executor.instances": 1,
          "spark.executor.resourceSpec": "medium",
          "spark.dla.job.log.oss.uri": "oss://<指定您存放SparkUI日志的目录/>",
          "spark.hadoop.hive.metastore.uris":"thrift://${ip}:${port},thrift://${ip}:${port}",
          "spark.hadoop.dfs.nameservices":"{您的nameservices名称}",
          "spark.hadoop.dfs.client.failover.proxy.provider.${nameservices}":"{您的failover proxy provider实现类全路径名称}",
          "spark.hadoop.dfs.ha.namenodes.${nameservices}":"{您的nameservices所属namenode列表}",
          "spark.hadoop.dfs.namenode.rpc-address.${nameservices}.${nn1}":"namenode0所属的ip:port",
          "spark.hadoop.dfs.namenode.rpc-address.${nameservices}.${nn2}":"namenode1所属的ip:port"
          },
          "file": "oss://{您的Jar包所属的oss路径}"
      }

      参数说明如下:

      参数

      说明

      备注

      spark.hadoop.hive.metastore.uris

      配置访问HiveMetaStore的Uri,对应${HIVE_CONF_DIR}/hive-site.xml中的hive.metastore.uris配置项。注意,一般该配置项的值都是域名:端口的形式,用户在serverless spark中配置参数的时候需要将它替换为对应IP+端口的形式。

      域名和IP的映射关系,一般可以登录集群的master节点查看本机的/etc/hosts,或者在master节点,直接使用ping+域名的方式获取,您也可以采用步骤2获取对应的配置参数。

      spark.dla.eni.vswitch.id

      您的交换机ID。

      spark.dla.eni.security.group.id

      您的安全组ID。

      spark.dla.eni.enable

      控制开启或关闭ENI。

      spark.hadoop.dfs.nameservices

      对应hdfs-site.xml中的dfs.nameservices

      spark.dla.job.log.oss.uri

      指定您存放SparkUI日志的OSS目录

      spark.hadoop.dfs.client.failover.proxy.provider.${nameservices}

      对应hdfs-site.xml中的dfs.client.failover.proxy.provider.${nameservices}

      spark.hadoop.dfs.ha.namenodes.${nameservices}

      对应hdfs-site.xml中的dfs.ha.namenodes.${nameservices}

      spark.hadoop.dfs.namenode.rpc-address.${nameservices}.${nn1/nn2}

      对应hdfs-site.xml中的dfs.namenode.rpc-address.${nameservices}.${nn1/nn2}

      注意该配置项应该写成IP:端口的形式,用户可以通过用户集群master节点中的/etc/hosts文件查看域名和IP的对应关系或者在master节点,直接使用ping+域名的方式获取,您也可以采用步骤2获取对应的配置参数。

      作业运行成功后,单击操作 > 日志,查看作业日志。图片

    • 访问Hive, 如果您集群中的HDFS是以非高可用部署的(即只有一个Master节点/NameNode)。

      {
          "args": [
              "hello_dla"
          ],
          "name": "spark-on-hive",
          "className": "com.aliyun.spark.SparkHive",
          "conf": {
              "spark.sql.catalogImplementation":"hive",
              "spark.dla.eni.vswitch.id": "{您的交换机ID}",
              "spark.dla.eni.security.group.id": "{您的安全组ID}",
              "spark.dla.eni.enable": "true",
              "spark.driver.resourceSpec": "medium",
              "spark.executor.instances": 1,
              "spark.executor.resourceSpec": "medium",
              "spark.dla.job.log.oss.uri": "oss://<指定您存放SparkUI日志的目录/>","
              "spark.hadoop.hive.metastore.uris":"thrift://${ip}:${port},thrift://${ip}:${port}",
              "spark.dla.eni.extra.hosts":"${ip0} ${hostname_0} ${hostname_1} ${hostname_n}"
          },
          "file": "oss://{您的Jar包所属的oss路径}"
      }

      参数

      说明

      备注

      spark.hadoop.hive.metastore.uris

      配置访问HiveMetaStore的Uri,对应${HIVE_CONF_DIR}/hive-site.xml中的hive.metastore.uris配置项。注意,一般该配置项的值都是域名+端口的形式,用户在serverless spark中配置参数的时候需要将它替换为对应ip:端口的形式。

      域名和IP的映射关系,一般可以登录集群的master节点查看本机的/etc/hosts, 或者在master节点,直接使用ping + 域名的方式获取,用户也可以采用步骤1获取对应的配置参数。

      spark.dla.job.log.oss.uri

      指定您存放SparkUI日志的OSS目录

      spark.dla.eni.vswitch.id

      您的交换机ID

      spark.dla.eni.security.group.id

      您的安全组ID

      spark.dla.eni.enable

      控制开启或关闭ENI

      spark.dla.eni.extra.hosts

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

      重要

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

      该值可从用户集群${Hive_CONF_DIR}/core-site.xml的fs.defaultFS获取。示例用户fs.defaultFs的值为: "hdfs://master-1:9000", 则需要配置spark.dla.eni.extra.hosts的值为:"${master-1的ip} master-1"。IP和域名的对应关系,您可以登录自建集群的master节点,从/etc/hosts中查看IP和域名的对应关系。您也可以从步骤2中获取相关参数。