文档

EMR Serverless Spark连接外部Hive Metastore

更新时间:

EMR Serverless Spark支持连接外部Hive Metastore服务,您可以便捷地访问存储在Hive Metastore中的数据。本文将介绍如何在EMR Serverless Spark中配置和连接外部Hive Metastore服务,以便在工作环境中高效管理和利用数据资源。

前提条件

已创建工作空间和SQL Compute,详情请参见创建工作空间管理SQL Compute

使用限制

  • 当前Hive Metastore仅提供预览功能。如需使用Hive Metastore服务,请在Serverless Spark用户支持群58570004119中反馈。

  • 使用Hive Metastore需要您重启工作空间中现有的Compute服务。

  • 设置Hive Metastore为默认Catalog后,您的工作流任务将默认依赖于Hive Metastore。

操作流程

步骤一:准备Hive Metastore服务

说明

本文采用EMR on ECS的Hive Metastore作为外部服务,如果您的VPC内已经有Hive Metastore服务,则请忽略该步骤。

  1. 在EMR on ECS页面创建包含Hive服务,元数据内置MySQL的DataLake集群,详情请参见创建集群

  2. 使用SSH方式登录集群的Master节点,详情请参见登录集群

  3. 执行以下命令,进入Hive命令行。

    hive
  4. 执行以下命令,创建一个指向OSS的表(dw_users)并写入数据。

    CREATE TABLE `dw_users`(
      `name` string)
    LOCATION
      'oss://<yourBucket>/path/to/file';
    
    INSERT INTO dw_users select 'Bob';

步骤二:新增网络连接

  1. 进入网络连接页面。

    1. 登录E-MapReduce控制台

    2. 在左侧导航栏,选择EMR Serverless > Spark

    3. Spark页面,单击目标工作空间名称。

    4. EMR Serverless Spark页面,单击左侧导航栏中的网络连接

  2. 网络连接页面,单击新增网络连接

  3. 新增网络连接对话框中,配置以下信息,单击确定

    参数

    说明

    连接名称

    输入新增连接的名称。

    专有网络

    选择与EMR集群相同的专有网络。

    交换机

    选择与EMR集群部署在同一专有网络下的相同交换机。

    状态显示为已成功时,表示新增网络连接成功。

    image

步骤三:开放Hive Metastore服务端口

  1. 获取已创建网络连接中指定交换机的网段。

    您可以登录专有网络管理控制台,在交换机页面获取交换机的网段。

    image

  2. 添加安全组规则。

    1. 登录EMR on ECS控制台

    2. EMR on ECS页面,单击目标集群的集群ID。

    3. 基础信息页面,单击集群安全组后面的链接。

    4. 安全组页面,单击手动添加,填写端口范围授权对象,然后单击保存

      参数

      说明

      端口范围

      填写9083端口。

      授权对象

      填写前一步骤中获取的指定交换机的网段。

      重要

      为防止被外部的用户攻击导致安全问题,授权对象禁止填写为0.0.0.0/0

步骤四:连接Hive Metastore

  1. EMR Serverless Spark页面,单击左侧导航栏中的数据目录

  2. 数据目录页面,单击添加数据目录

  3. 在弹出的对话框中,单击外部Hive Metastore,配置以下信息。

    image

    参数

    说明

    网络连接

    选择步骤二中新增的网络连接。

    Metastore服务地址

    Hive MetaStore的URI。格式为thrift://<Hive metastore的IP地址>:9083

    <Hive metastore的IP地址>为HMS服务的内网IP地址。本示例为EMR集群Master节点的内网IP,您可以在EMR集群的节点管理页面中查看。

  4. 单击确定

步骤五:使用Hive Metastore

  1. 数据目录页面,单击hive_metastore操作列的设为默认,设置hive_metastore为工作空间的默认数据目录。

    image

  2. 重启SQL Compute。

    如果您的工作空间中已有SQL Compute,您需先停止SQL Compute,然后再启动SQL Compute,以确保hive_metastore生效。

  3. 在SQL开发中查询hive_metastore表的数据。

    1. 新建SQL开发,详情请参见SQL开发

    2. 执行以下命令,查询hive_metastore中的dw_users表。

      SELECT * FROM dw_users;

      image

常见问题

如何访问HDFS数据?

根据HDFS集群是否配置了高可用(HA)模式,需要采取不同的配置策略。

  • 非HA HDFS路径访问

    当表的location指向一个没有启用高可用配置的HDFS路径时,由于只有一个NameNode负责管理文件系统的命名空间,因此,不需要特别的配置即可直接访问数据。

  • HA HDFS路径访问

    如果表的location指向的是一个启用了高可用的HDFS路径,由于存在多个NameNode,需要在Compute的Spark配置中额外配置以下内容,以确保Java Runtime或Fusion引擎能够正常访问数据。

    Java Runtime访问HDFS数据

    在EMR集群的集群服务页面的HDFS服务的配置页签,参照hdfs-site.xml中内容新增下面的配置。

    说明
    • 在控制台查看配置项时,需去掉配置项中的spark.hadoop.前缀。

    • 以下配置项的值仅为示例,具体以控制台查询结果为准。

    spark.hadoop.dfs.namenode.rpc-address.hdfs-cluster.nn1  master-1-1.<cluster-id>.<region>.emr.aliyuncs.com:***
    spark.hadoop.dfs.nameservices                       hdfs-cluster
    spark.hadoop.dfs.ha.namenodes.hdfs-cluster          nn1,nn2,nn3
    spark.hadoop.dfs.client.failover.proxy.provider.hdfs-cluster  org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider

    例如,在EMR控制台查看配置信息。

    image

    Fusion引擎访问HDFS数据

    1. 在EMR集群的集群服务页面的HDFS服务的配置页签,参照hdfs-site.xml中内容新增下面的配置。

      说明
      • 在控制台查看配置项时,需去掉配置项中的spark.hadoop.前缀。

      • 以下配置项的值仅为示例,具体以控制台查询结果为准。

      spark.hadoop.dfs.namenode.rpc-address.hdfs-cluster.nn1  master-1-1.<cluster-id>.<region>.emr.aliyuncs.com:****
      spark.hadoop.dfs.nameservices                       hdfs-cluster
      spark.hadoop.dfs.ha.namenodes.hdfs-cluster          nn1,nn2,nn3
      spark.hadoop.dfs.client.failover.proxy.provider.hdfs-cluster  org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider

      例如,在EMR控制台查看配置信息。

      image

    2. 将集群的HDFS服务的hdfs-site.xml文件拷贝到OSS上,并重命名为hdfs-client.xml。例如,oss://<bucket>/tmp/hdfs-client.xml。

      关于配置文件路径,请参见常用文件路径

    3. 再在Compute的Spark配置中额外新增以下内容。

      spark.files                                         oss://<bucket>/tmp/hdfs-client.xml
      spark.executorEnv.LIBHDFS3_CONF                     /opt/spark/work-dir/hdfs-client.xml