
# 配置Hudi通过Guardian访问OBS
参考[配置Guardian服务不启用Ranger OBS路径鉴权](https://support.huaweicloud.com/usermanual-mrs/mrs_01_300579.html)或[配置Guardian服务启用Ranger OBS路径鉴权](https://support.huaweicloud.com/usermanual-mrs/mrs_01_300419.html)完成Guardian对接OBS后，即可在spark-shell中创建Hudi COW表存储到OBS中。
#### 前提条件
如果参考[配置Guardian服务启用Ranger OBS路径鉴权](https://support.huaweicloud.com/usermanual-mrs/mrs_01_300419.html)完成Guardian对接OBS，还需参考[Ranger权限配置]在Ranger中为组件操作用户赋予OBS路径的"Read"和"Write"权限。
#### Hudi对接OBS
1. 使用客户端安装用户登录客户端安装节点。
2. 配置环境变量。 
   加载环境变量：
   ```
   source 客户端安装目录/bigdata_env
   ```
   加载组件环境变量：
   ```
   source 客户端安装目录/Hudi/component_env
   ```
   
   
3. 修改配置文件： 
   ```
   vim 客户端安装目录/Hudi/hudi/conf/hdfs-site.xml
   ```
   修改如下内容，"dfs.namenode.acls.enabled"参数用于设置是否启用HDFS ACL功能：
   ```
   <property>
   <name>dfs.namenode.acls.enabled</name>
   <value>false</value>
   </property>
   ```
   
   
4. 如果集群已启用Kerberos认证（安全模式），执行以下命令使用具有相应OBS路径"Read"和"Write"权限的用户进行认证，如果集群未启用Kerberos认证（普通模式），则无需执行此命令。 
   ```
   kinit 用户名
   ```
   
   
5. 启动**spark-shell** ，执行下面的命令创建COW表存储到OBS中：
   
   ```
   spark-shell --master yarn
   import org.apache.hudi.QuickstartUtils._
   import scala.collection.JavaConversions._
   import org.apache.spark.sql.SaveMode._
   import org.apache.hudi.DataSourceReadOptions._
   import org.apache.hudi.DataSourceWriteOptions._
   import org.apache.hudi.config.HoodieWriteConfig._
   val tableName = "hudi_cow_table"
   val basePath = "obs://testhudi/cow_table/"
   val dataGen = new DataGenerator
   val inserts = convertToStringList(dataGen.generateInserts(10))
   val df = spark.read.json(spark.sparkContext.parallelize(inserts, 2))
   df.write.format("org.apache.hudi").
   options(getQuickstartWriteConfigs).
   option(PRECOMBINE_FIELD_OPT_KEY, "ts").
   option(RECORDKEY_FIELD_OPT_KEY, "uuid").
   option(PARTITIONPATH_FIELD_OPT_KEY, "partitionpath").
   option(TABLE_NAME, tableName).
   mode(Overwrite).
   save(basePath);
   ```
   其中，"obs://testhudi/cow_table/"是OBS路径，"testhudi"是OBS并行系统文件名称，请根据实际情况修改。
   
   
6. 使用datasource查看表建立成功，数据正常。 
   ```
   val roViewDF = spark.
   read.
   format("org.apache.hudi").
   load(basePath + "/*/*/*/*")
   roViewDF.createOrReplaceTempView("hudi_ro_table")
   spark.sql("select * from  hudi_ro_table").show()
   ```
   
   
7. 执行以下命令退出**spark-shell** 命令行。
   
   ```
   :q
   ```
   
   
 
 #### Ranger权限配置
1. 登录MRS集群Manager界面，选择"系统 \> 权限 \> 用户组 \> 添加用户组"。 
   登录集群Manager界面请参考[访问MRS集群Manager](https://support.huaweicloud.com/usermanual-mrs/mrs_01_0128.html)。
   
   
2. 创建一个空角色的用户组，例如，名称为"obs_hudi"，并将该用户组绑定给对应用户。
3. 使用**rangeradmin**用户登录Ranger管理页面。
4. 在首页中单击"EXTERNAL AUTHORIZATION"区域的组件插件名称"OBS"。
5. 单击"Add New Policy"，为[步骤 2]新建的用户组添加相应OBS路径的"Read"和"Write"权限，OBS目录若不存在则需要提前创建，且不允许带通配符**\*** 。
   
   图1为Hudi用户组赋予OBS路径读和写权限   
   ![](https://support.huaweicloud.com/usermanual-mrs/zh-cn_image_0000001925619785.png "点击放大")
   对接OBS后，如需通过Ranger配置组件关于OBS相关路径的权限策略，需确保OBS服务已开启AccessLabel功能，若未开启，需手动开启，详细操作请联系OBS服务运维人员。
   
   
 
