
# 湖仓一体：DWS通过对接LakeFormation读取MRS的Hive数据
#### 场景介绍
当前数据湖、数仓、AI数据处于孤岛化，导致数据虽然可以统一存储在OBS，但各个服务，各个集群的元数据仍然独自管理，形成数据管理的孤立状态。
DWS想要访问MRS存储在OBS上的数据只能通过创建外表的方式来访问，会出现各服务元数据不能统一配置和管理的问题。
图1DWS访问MRS   
![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002610452903.png "点击放大")
**[湖仓构建LakeFormation](https://support.huaweicloud.com/lakeformation/index.html)**作为企业级数据湖一站式构建服务，在存算分离架构基础上提供数据湖元数据统一管理、数据权限管理及API，打通数据壁垒，实现真正数智融合。支持对接MapReduce服务（MRS）、数据仓库服务 DWS、数据湖探索（DLI）、AI开发平台ModelArts、数据治理中心 DataArts Studio等多种计算引擎及大数据云服务，使用户可以便捷高效地构建数据湖和运营相关业务，加速释放业务数据价值。
DWS通过对接LakeFormation服务，可以打破数据孤岛，DWS无需创建外表，通过直接访问LakeFormation，便可获取到各个服务的表的元数据，进而访问各服务存储在OBS上的数据，并且可以通过LakeFormation服务的权限管理来实现细粒度权限控制。
图2DWS对接LakeFormation   
![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002579932940.png "点击放大")
#### 基本流程
本实践介绍DWS通过与LakeFormation建立连接并读取MRS的Hive数据的过程。整个流程分为以下操作，如果已有MRS并已与LakeFormation对接完成，则可跳过相应步骤。
**本实践预计时长：** **2小时** 。实验过程用到的云服务包括**数据仓库服务 DWS** 、**MapReduce服务** **MRS** 、**对象存储服务 OBS** 、**湖仓构建LakeFormation** 、**VPC终端节点** 、**统一身份认证 IAM**。
1. [步骤一：创建LakeFormation实例]
2. [步骤二：配置MRS与LakeFormation对接]
3. [步骤三：配置DWS与LakeFormation对接]
4. [步骤四：通过LakeFormation读取MRS的Hive数据]
 
#### 使用约束
- 读取的MRS集群必须为MRS 3.3.0-LTS及之后版本，已开启Kerberos认证。
- 支持表存储格式：ORC、PARQUET、TEXT、CSV、HUDI。
- 目前仅支持读取LakeFormation服务中MRS服务的表。
- 目前仅支持查询操作。
- 不支持表包含map、struct、array、binary、tinyint、uniontype字段类型。
- 不支持analyze。
 
#### 前提条件
- 已创建DWS集群。
- 已创建MRS集群。
- 已创建包含LakeFormation权限的委托（包含最小权限）。
 
 #### 步骤一：创建LakeFormation实例
在创建LakeFormation实例前，要先规划元数据存储的OBS桶，再进行LakeFormation实例及其Catalog、数据库的创建。
1. 参见[OBS章节](https://support.huaweicloud.com/usermanual-obs/zh-cn_topic_0045829088.html)创建OBS桶，本例OBS桶名设为lakeformation-obs-xx，其中xx以数字命名，例如lakeformation-obs-01，如有冲突，则往后递增。
2. 进入OBS桶，创建文件夹命名为hive，在hive文件夹中继续创建子文件夹，命名为default。
3. 登录[LakeFormation控制台](https://console.huaweicloud.com/lake-formation)，单击页面右上角"购买实例"。
   
   填写以下关键信息，其他默认即可，了解参数含义，请参见[创建LakeFormation实例](https://support.huaweicloud.com/usermanual-lakeformation/lakeformation_03_00007.html)。
   表1创建LakeFormation 
   | 关键参数 | 取值                     |
   |:---|:---|
   | 类型   | **共享**                 |
   | 计费模式 | **按需收费**               |
   | 名称   | **lakeformation-demo** |
      
   
   
4. 单击"立即购买"。
5. 购买成功后，回到LakeFormation控制台首页，刷新页面，在左侧选取到新创建的LakeFormation后，选择"元数据 \> Catalog"。
6. 单击"创建Catalog"，填写以下参数后单击"提交"。
   
   - Catalog名称：hive**（固定名称，不可自定义）**
   
   - 选择位置：选择上面创建的OBS桶，路径选择如下：obs://lakeformation-obs-01/hive/。
   
   
   ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002579868706.png "点击放大")
   
   
   
7. 左侧导航选择"元数据 \> 数据库"，单击"创建数据库"。
8. 填写以下参数后单击"提交"。 
   - 库名称：default**（固定名称，不可自定义）**
   
   - 所属Catalog：hive
   
   - 选择位置：选择hive Catalog存储路径下的位置，例如"obs://lakeformation-obs-01/hive/default"。
   
   
   ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002579712288.png "点击放大")
   
   
   
9. 选择"接入管理 \> 创建客户端"，创建LakeFormation实例接入管理客户端。其中"虚拟私有云"和"所属子网"需要与待对接的MRS集群保持一致。 
   MRS集群的VPC子网信息可通过登录MRS管理控制台，在MRS集群的概览页面中获取。
   客户端创建完成后，在客户端详情信息中获取对应客户端的"接入IP"信息并记录。
   
   
10. **创建对接LakeFormation权限的委托** 。
    
    1. 登录[IAM控制台](https://console.huaweicloud.com/iam)。
    
    2. 在左侧导航栏选择"委托"，单击右上角的"创建委托"，配置相关参数，单击"下一步"。 参数配置如下：
       - 委托名称：例如"visit_lakeformation_agency"
       
       - 委托类型：选择"普通账号"
       
       - 委托的账号：输入被委托的华为云账号名称
       
       - 持续时间：根据实际情况自定义
        
    
    3. 在选择策略界面右上角单击"新建策略"，配置如下信息，单击"下一步"。
       - 策略名称：例如"dev_visit_lakeformation"
       
       - 策略配置方式："可视化视图"或"JSON视图"
       
       - 策略内容，选JSON视图，配置策略内容如下：
         ```
         {
             "Version": "1.1",
             "Statement": [
                 {
                     "Effect": "Allow",
                     "Action": [
                         "lakeformation:table:create",
                         "lakeformation:database:alter",
                         "lakeformation:table:alter",
                         "lakeformation:database:drop",
                         "lakeformation:database:create",
                         "lakeformation:role:describe",
                         "lakeformation:policy:create",
                         "lakeformation:policy:export",
                         "lakeformation:function:alter",
                         "lakeformation:function:describe",
                         "lakeformation:table:drop",
                         "lakeformation:catalog:describe",
                         "lakeformation:table:describe",
                         "lakeformation:function:drop",
                         "lakeformation:database:describe",
                         "lakeformation:function:create",
                         "lakeformation:transaction:operate",
                         "lakeformation:policy:drop",
                         "lakeformation:policy:describe",
                         "lakeformation:connection:describe"
                     ]
                 }
             ]
         }
         ```
         
        
    
    4. 确认后，回到策略列表，勾选上面新建的策略名称"dev_visit_lakeformation"，单击"下一步"。
    
    5. 选择授权范围方案，默认即可，单击"确定"。
    
    6. 在"委托"页面，将鼠标移动到新创建的委托名称上，获取具备访问LakeFormation权限的委托ID。
    
    
    
    
11. **创建对接OBS权限的委托** 。
    
    1. 登录[IAM控制台](https://console.huaweicloud.com/iam)。
    
    2. 在左侧导航栏选择"委托"，单击右上角的"创建委托"，选择相关参数，单击"下一步"。 参数选择如下：
       - 委托名称：例如"visit_obs_agency"。
       
       - 委托类型：选择"普通账号"。
       
       - 委托的账号：输入被委托的华为云账号名称。
       
       - 持续时间：根据实际情况自定义。
        
    
    3. 在选择策略界面右上角单击"新建策略"，配置如下信息，单击"下一步"。
       - 策略名称：例如"dev_visit_obs"。
       
       - 策略配置方式：JSON视图。
       
       - 策略内容：填入如下信息。
         ```
         {
             "Version": "1.1",
             "Statement": [
                 {
                     "Effect": "Allow",
                     "Action": [
                         "obs:bucket:GetBucketLocation",
                         "obs:bucket:ListBucketMultipartUploads",
                         "obs:object:GetObject",
                         "obs:object:ModifyObjectMetaData",
                         "obs:object:DeleteObject",
                         "obs:object:ListMultipartUploadParts",
                         "obs:bucket:HeadBucket",
                         "obs:object:AbortMultipartUpload",
                         "obs:bucket:ListBucket",
                         "obs:object:PutObject"
                     ],
                     "Resource": [
                         "OBS:*:*:bucket:*",
                         "OBS:*:*:object:*"
                     ]
                 }
             ]
         }
         ```
         
        
    
    4. 确认后，回到策略列表，勾选上面新建的策略名称"dev_visit_obs"，单击"下一步"。
    
    5. 选择授权范围方案，默认即可，单击"确定"。
    
    6. 在"委托"页面，将鼠标移动到新创建的委托名称上，获取具备访问OBS权限的委托ID。
    
    
    
    
12. **创建对接ECS/BMS云服务委托** 。
    
    1. 登录[IAM控制台](https://console.huaweicloud.com/iam)。
    
    2. 在左侧导航栏选择"委托"，单击右上角的"创建委托"，选择相关参数，单击"下一步"。 参数选择如下：
       - 委托名称：例如"lakeformation_test"。
       
       - 委托类型：选择"云服务"。
       
       - 云服务：选择"ECS BMS"。
       
       - 持续时间：根据实际情况自定义。
        
    
    3. 在选择策略界面右上角单击"新建策略"，配置如下信息，单击"下一步"。
       - 策略名称：自定义。
       
       - 策略配置方式：选择JSON视图。
       
       - 策略内容：配置如下信息，其中访问LakeFormation和OBS权限的委托ID分别参见[10.f]和[11.f]获取并修改。
         ```
         {
             "Version": "1.1",
             "Statement": [
                 {
                     "Action": [
                         "iam:agencies:assume"
                     ],
                     "Resource": {
                         "uri": [
                             "/iam/agencies/授予给自身账号具备访问LakeFormation权限的委托ID",
                             "/iam/agencies/授予给自身账号具备访问OBS权限的委托ID"
                         ]
                     },
                     "Effect": "Allow"
                 }
             ]
         }
         ```
         
        
    
    4. 确认后，回到策略列表，勾选上面新建的策略名称"lakeformation_test"，单击"下一步"。
    
    5. 选择授权范围方案，选择"所有资源"，单击"确定"。
    
    
    
    
13. **创建LakeFormation数据连接** 。
    
    1. 登录MRS控制台，在导航栏选择"数据连接"。
    
    2. 单击"新建数据连接 "。
    
    3. 填写以下参数。
       表2创建LakeFormation数据连接 
       | 参数              | 示例                | 说明                                                                                                                           |
       |:---|:---|:---|
       | 类型              | LakeFormation     | 选择"LakeFormation"，当前仅MRS 3.3.0-LTS及之后版本支持连接该类型。                                                                              |
       | 名称              | mrs_LakeFormation | 数据连接的名称。                                                                                                                     |
       | LakeFormation实例 | -                 | 选择LakeFormation实例名称。                                                                                                         |
       | 虚拟私有云           | -                 | 需要与待对接的MRS集群在同一虚拟私有云。                                                                                                        |
       | 子网              | -                 | 选择子网名称。                                                                                                                      |
       | VPC终端节点         | -                 | 选择VPC终端节点，或单击"创建对应LakeFormation实例的VPC终端节点"进行创建。 选择VPC终端节点后，产生的费用将由VPCEP服务收取。 |
       | LakeFormation委托 | 现有委托              | 选择"现有委托"，并选择[10]创建的委托，例如"visit_lakeformation_agency"。                        |
          
       
    
    4. 创建完成后，在"数据连接"页面记录已创建数据连接的ID。
    
    
    
    
 
 #### 步骤二：配置MRS与LakeFormation对接
1. 已创建MRS集群，注意MRS集群必须满足以下条件，详情请参见[MRS文档](https://support.huaweicloud.com/usermanual-mrs/mrs_01_249232.html)。
   
   - 版本必须为MRS 3.3.0-LTS及之后版本，已开启Kerberos认证，开启存算分离。
   
   - 集群需包含Hadoop、Ranger、Hive、Guardian、Spark（可选）、Flink（可选）等组件。
   
   - 创建集群时，需自定义购买，并勾选"拓扑调整"，勾选Ranger下面的至少1个PSC（PolicySync）实例，确保PolicySync和RangerAdmin实例部署在一个节点上，同时检查Guardian组件至少包含2个TokenServer（TS）实例。
   
   - 已通过MRS管理控制台同步IAM用户，且集群各服务运行正常。
   
   - MRS集群中Hive组件已开启Ranger鉴权，开启请参见[配置集群组件启用Ranger鉴权](https://support.huaweicloud.com/cmpntguide-lts-mrs/mrs_01_2393.html)。
   
   
   
   
2. 登录[MRS控制台](https://console.huaweicloud.com/mrs)，选择"现有集群"。
3. 单击待对接的MRS名称进入集群"概览"页签。
4. 单击"委托"后的"选择委托"，选择[12]创建的委托名称。
5. 单击"数据连接"右侧的"单击管理"，进入数据连接配置界面。
6. 单击"配置LakeFormation数据连接"，在下拉框中选择[13]记录的LakeFormation数据连接ID，单击"确定"。
7. 登录MRS集群的FusionInsight Manager页面，具体操作请参考[访问MRS集群Manager](https://support.huaweicloud.com/usermanual-mrs/mrs_01_0128.html)。
8. 配置Guardian。 
   1. 登录[IAM控制台](https://console.huaweicloud.com/iam)。
   
   2. 单击用户名，在下拉列表中单击"我的凭证"。
   
   3. 在"API凭证"页面获取"账号ID"、项目列表中查看项目ID。
   
   4. 在FusionInsight Manager界面，选择"集群 \> 服务 \> Guardian \> 配置 \> 全部配置"，搜索并修改以下参数后，单击"保存"。
      表3配置Guardian 
      | 参数                                    | 含义                                                                                                                                                                                                                                                                                                                                                                                                                                                                              | 取值                                                                                |
      |:---|:---|:---|
      | token.server.access.iam.domain.id     | 访问IAM的用户对应的账号 ID。 从[8.c]获取账号ID信息。                                                                                                                                                                                                                                                                                                                                               | xxx                                                                               |
      | token.server.access.iam.project.id    | 访问IAM的用户对应的项目ID。 从[8.c]获取项目ID信息。                                                                                                                                                                                                                                                                                                                                                 | xxx                                                                               |
      | token.server.access.label.agency.name | 指定IAM委托的名字，需要具有访问OBS的权限。 即[11]创建的委托名称。                                                                                                                                                                                                                                                                                                                                             | visit_obs_agency                                                                  |
      | fs.obs.delegation.token.providers     | delegation.token的产生类名，默认为空。 此处同时勾选以下参数值： - com.huawei.mrs.dt.MRSDelegationTokenProvider  - com.huawei.mrs.dt.GuardianDTProvider   | com.huawei.mrs.dt.MRSDelegationTokenProvider,com.huawei.mrs.dt.GuardianDTProvider |
      | fs.obs.guardian.accesslabel.enabled   | 是否开启使用Guardian对接OBS的access label。                                                                                                                                                                                                                                                                                                                                                                                                                                               | true                                                                              |
      | fs.obs.guardian.enabled               | 是否开启使用Guardian。                                                                                                                                                                                                                                                                                                                                                                                                                                                                 | true                                                                              |
         
      
   
   5. 进入Guardian服务"概览"页面，选择"更多 \> 重启服务"。
   
   
   
   
9. 配置Hive对接OBS文件系统。 
   1. 在FusionInsight Manager界面，选择"集群 \> 服务 \> Hive \> 配置 \> 全部配置"。
   
   2. 在左侧的导航列表中选择"HiveServer \> 自定义"。在自定义配置项中添加如下参数。
      表4配置Hive对接OBS 
      | 参数                                | 描述                                                                                                                                                                                                                                                                                                                                                                                                                                                | 取值样例                                                                                                                                                                                                                                                                                                                 |
      |:---|:---|:---|
      | hive.server.customized.configs    | - 添加参数"hive.metastore.warehouse.dir"。  - 设置值为[6]获取的hive Catalog在OBS中的存储路径。                                                                           | - 名称：hive.metastore.warehouse.dir  - 值：obs://lakeformation-obs-01/hive   |
      | hive.metastore.customized.configs | 仅MRS 3.3.1及之后版本集群需要添加该参数。 - 添加参数"hive.metastore.warehouse.dir"。  - 设置值为[6]获取的hive Catalog在OBS中的存储路径。   | - 名称：hive.metastore.warehouse.dir  - 值：obs://lakeformation-obs-01/hive        |
         
      
   
   3. 单击"保存"，保存配置。
   
   
   
   
10. 在MRS集群"组件管理"页签，查看是否存在"配置超期"的组件，如果存在请单击"操作"列的"重启"，重启相关组件。
11. 重新下载并安装MRS集群完整客户端。具体操作请参考[安装客户端](https://support.huaweicloud.com/usermanual-mrs/mrs_01_0089.html)。
12. 如果需要在管理控制台执行作业提交操作，需要更新集群内置客户端配置文件。 
    在MRS集群概览页面，获取弹性IP，使用该IP登录Master节点，执行如下命令刷新集群内置客户端。
    **su - omm**
    **sh /opt/executor/bin/refresh-client-config.sh**
    
    
13. 登录客户端安装节点，通过Hive客户端查看数据库，确认对接成功。 
    **source** *客户端安装路径* **/bigdata_env**
    **kinit** *组件业务用户*
    **beeline**
    **show databases;**
    **desc database default;**
    **!q**
    ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002581613610.png "点击放大")
    
    
 
 #### 步骤三：配置DWS与LakeFormation对接
1. 登录[DWS控制台](https://console.huaweicloud.com/dws)，单击"集群 \> 集群列表"，在集群列表中查看已创建好的集群。
2. 单击集群名称，进入"集群详情"页面，选择"数据源\>LakeFormation数据源"。
3. 在LakeFormation数据源页面，单击"创建LakeFormation数据源连接"，参考下面填写配置参数。 
   ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000002008819886.png "点击放大")
   表5创建LakeFormation数据源连接 
   | 参数名称            | 说明                                                                                                    |
   |:---|:---|
   | 数据源名称           | lakeformation-dws。                                                                                    |
   | LakeFormation实例 | 下拉框选择[步骤一：创建LakeFormation实例]创建的LakeFormation实例。 |
   | 数据库             | 要创建的LakeFormation数据源连接所在的数据库。                                                                         |
   | 委托              | 选择[10]创建的委托。                                          |
   | 描述              | -                                                                                                     |
      
   
   
4. 单击"确认"。
 
 #### 步骤四：通过LakeFormation读取MRS的Hive数据
1. 通过创建external schema来访问存储在LakeFormation服务中MRS服务表的元数据，进而访问存储在OBS上的表数据。 
   更多语法，请参见[CREATE EXTERNAL SCHEMA](https://support.huaweicloud.com/sqlreference-dws/dws_06_0367.html)。
   ```
   CREATE EXTERNAL SCHEMA ex_lf    --
       WITH SOURCE lakeformation   --外部元数据存储引擎的类型，此处填写lakeformation。
            DATABASE 'default'   --要访问的LakeFormation中的数据库的名称。
            SERVER lakeformation-dws    --创建的LakeFormation数据源名称    
            CATALOG 'hive'；   --LakeFormation中对应的要访问的catalog名称，此处填写hive。
   ```
   
   
2. 查看dws当前用户，例如dbadmin。 
   ```
   SELECT current_user;
   ```
   
   

3. 在LakeFormation创建同名角色，并授权。 
   1. 登录[LakeFormation控制台](https://console.huaweicloud.com/lake-formation)。
   
   2. 在左侧下拉框中选择待操作的LakeFormation实例，选择"数据权限 \> 角色"。
   
   3. 单击"创建角色"，在弹出的窗口中"角色名称"填写dbadmin，单击"确定"。
   
   4. 选择"数据权限 \> 数据授权"。单击"授权"，在弹出的窗口中参考下表配置参数后，单击"确定"。
      表6LakeFormation授权角色 
      | 参数   | 参数说明                            |
      |:---|:---|
      | 主体类型 | 角色                              |
      | 选择角色 | dbadmin                         |
      | 授权类型 | 资源                              |
      | 资源类型 | 选择"Catalog"为hive下的"default"数据库。 |
      | 权限   | ALL                             |
         
      
   
   5. 单击"确定"。
   
   
   
   
4. 回到DWS连接数据库的界面，执行以下SQL，查询Hive表数据成功。 
   ```
   SELECT * FROM ex_lf.test;
   ```
   
   
