
# 配置HDFS冷热数据迁移
#### 配置场景
冷热数据迁移工具根据配置的策略移动HDFS文件。配置策略是条件或非条件规则的集合。如果规则匹配文件集，则该工具将对该文件执行一组行为操作。
冷热数据迁移工具支持以下规则和行为。
- 迁移规则：
  - 根据文件的最后访问时间迁移数据
  
  - 根据年龄时间迁移数据（修改时间）
  
  - 无条件迁移数据
  
  
  表1规则条件标签 
  | 条件标签                    | 描述            |
  |:---|:---|
  | \<age operator="lt"\>   | 定义年龄/修改时间的条件。 |
  | \<atime operator="gt"\> | 定义访问时间的条件。    |
     
  ![](https://support.huaweicloud.com/cmpntguide-mrs/public_sys-resources/note_3.0-zh-cn.png)
  对于手动迁移规则，不需要条件。
  

- 行为列表：
  - 将存储策略设置为给定的数据层名称
  
  - 迁移到其他文件夹
  
  - 为文件设置新的副本数
  
  - 删除文件
  
  - 设置节点标签（NodeLabel）
  
  
  表2行为类型 
  | 行为类型           | 描述                                            | 所需参数                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
  |:---|:---|:---|
  | MARK           | 为确定数据的冷热度并设置相应的数据存储策略。                        | \<param\> \<name\>targettier\</name\> \<value\>STORAGE_POLICY\</value\> \<param\>                                                                                                                                                                                                                                                                                                                                                                                                                        |
  | MOVE           | 为设置数据存储策略或NodeLabel并调用HDFS Mover工具。           | \<param\> \<name\>targettier\</name\> \<value\>STORAGE_POLICY\</value\> \<param\> \<param\> \<name\>targetnodelabels\</name\> \<value\>SOME_EXPRESSION\</value\> \<param\> 说明： 用户可以配置其中任一参数或两者都配置。 |
  | SET_REPL       | 为文件设置新的副本数。                                   | \<param\> \<name\>replcount\</name\> \<value\>INTEGER\</value\> \<param\>                                                                                                                                                                                                                                                                                                                                                                                                                                |
  | MOVE_TO_FOLDER | 将文件移动到目标文件夹。如果"overwrite"参数为"true"，则目标路径将被覆盖。 | \<param\> \<name\>target\</name\> \<value\>PATH\</value\> \<param\> \<param\> \<name\>overwrite\</name\> \<value\>true/false\</value\> \<param\> 说明： "overwrite"是可选参数，如果未配置，则默认值为"false"。    |
  | DELETE         | 删除文件。                                         | NA                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
     
  
 
#### 配置描述
必须定期调用迁移工具，并需要在客户端的"hdfs-site.xml"文件中进行以下配置。
表3参数描述 
| **参数**                              | 描述                                                                                                                                                      | **默认值**                                                              |
|:---|:---|:---|
| dfs.auto-data-movement.policy.class | 用于指定默认的数据迁移策略。 说明： 当前只支持DefaultDataMovementPolicy。 | com.huawei.hadoop.hdfs.datamovement.policy.DefaultDataMovementPolicy |
| dfs.auto.data.mover.id              | 冷热数据迁移输出（行为状态）文件的名称。                                                                                                                                    | 当前系统时间（毫秒）                                                           |
| dfs.auto.data.mover.output.dir      | 冷热数据迁移输出在HDFS中的目录名称。迁移工具将在此处写入行为状态文件。                                                                                                                   | /system/datamovement                                                 |
   
DefaultDataMovementPolicy拥有配置文件"default-datamovement-policy.xml"。用户需要定义所有基于age/accessTime的规则和在此文件中采取的行为操作，此文件必须存储在客户端的classpath中。
如下为"default-datamovement-policy.xml"配置文件的示例：
```
<policies>
  <policy>
    <fileset>
      <file>
        <name>/opt/data/1.txt</name>
      </file>
      <file>
        <name>/opt/data/*/subpath/</name>
        <excludes>
          <name>/opt/data/some/subpath/sub1</name>
        </excludes>
      </file>
    </fileset>
    <rules>
      <rule>
        <age>2w</age>
        <action>
          <type>MOVE</type>
          <params>
            <param>
              <name>targettier</name>
              <value>HOT</value>
            </param>
          </params>
        </action>
      </rule>
    </rules>
  </policy>
</policies>
```
![](https://support.huaweicloud.com/cmpntguide-mrs/public_sys-resources/note_3.0-zh-cn.png)
在策略，规则和行为操作中使用的标签中，可以添加其他属性，例如"name"可用于管理用户界面（例如：Hue UI）和工具输入xml之间的映射。
示例： \<policy name="Manage_File1"\>
标签（Tag）说明如下：
表4配置标签（Tag）描述 
| 标签（Tag）名称              | 描述                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                | 是否可重复使用           |
|:---|:---|:---|
| **\<policy\>**         | 定义单一策略。 - idempotent属性：指定当策略中有多个规则时，如果满足当前规则，是否检查下一个规则。 示例：\<policy name ="policy2" idempotent ="true"\>。 其默认值为"true"，表示其中的规则和行为操作是幂等的，可以继续检查下一个规则。如果值为"false"，则将在当前规则处停止评估。     - hours_allowed属性：配置是否根据系统时间执行策略评估。 hours_allowed的值是以逗号分隔的数字，范围从0到23，表示系统时间。  示例：\<policy name ="policy1" hours_allowed ="2-6,13-14"\> 如果当前系统时间在配置的范围内，则继续评估。否则，将跳过评估。 说明：  在输入XML中，每个文件仅支持一个策略。因此，文件中的所有规则必须由一个策略标签覆盖。    | Yes               |
| **\<fileset\>**        | 为每个策略定义一组文件/文件夹。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  | No （在policy标签内）   |
| **\<file\>**           | 定义文件和/或文件夹在\<file\>标签内被配置一个或者多个\<name\>标签。文件/文件夹名支持POSIX globs配置。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 | Yes （在fileset标签内） |
| **\<excludes\>**       | 在\<file\>标签内定义该标签，该标签下可以包含多个\<name\>标签，在\<file\>标签中配置的文件或文件夹范围下，\<name\>标签所包含的文件或文件夹将会被排除。文件或文件夹名支持POSIX globs配置。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 | No （在fileset标签内）  |
| **\<rules\>**          | 针对策略定义多个规则。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       | No （在policy标签内）   |
| **\<rule\>**           | 定义单一规则。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           | Yes （在rules标签内）   |
| **\<age\>or\<atime\>** | 定义在\<fileset\>中定义的文件的age/accesstime。策略将匹配该age。age可以用\[num\]y\[num\]m\[num\]w\[num\]d\[num\]h的格式表示。其中num表示数字。 其中字母的意思如下： \* y--年（一年是365天）。 \* m--月（一个月是30天）。 \* w--周（一周是7天）。 \* d--天。 \* h--小时。 可以单独使用年，月，周，天或小时，也可以将时间组合。比如，1y2d表示1年零2天或者367天。 如果没有单位（即数字后面没有任何上述字母），默认单位为天。  说明： 用户可以在\<age\>和\<atime\>标签中配置"gt"（greater）和"lt"（less），默认运算符为"gt"。 示例：\<age operator="lt"\>                                                                                                                                                                                                                    | No （在rule标签内）     |
| **\<action\>**         | 如果规则匹配，这个标签定义了要执行的action。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         | No (在rule标签内)     |
| **\<type\>**           | 定义了action类型。当前支持的action类型是MOVE和MARK。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              | No (在action标签内)   |
| \<**params**\>         | 定义与每个action相关的参数。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 | No (在action标签内)   |
| **\<param\>**          | 定义单个使用\<name\>和\<value\>标签的name-value格式参数。 对于MARK和MOVE，只支持参数名"targettier"。该参数表示如果满足age规则，则指定数据存储策略。 如果多个param中具有相同name的参数，则采用第一个参数值。 对于MARK，支持的"targettier"参数值为"ALL_SSD"，"ONE_SSD"，"HOT"，"WARM"，"COLD"。 对于MOVE，支持的"targettier"参数值为"ALL_SSD"，"ONE_SSD"，"HOT"，"WARM"和"COLD"。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    | Yes (在params标签内)  |
   
对于在\<file\>标签下的文件/文件夹使用FileSystem#globStatus API，对于其他的使用GlobPattern类（被GlobFilter使用）。参照支持的API的细节。例如，对于globStatus，"/opt/hadoop/\*"将匹配"/opt/hadoop"文件夹下的一切。"/opt/\*/hadoop"将匹配/"opt"目录的子目录下的所有hadoop文件夹。
对于globStatus，分别匹配每个路径组件的glob模式，而对于其他的，直接匹配glob模式。
<https://hadoop.apache.org/docs/r3.1.1/api/org/apache/hadoop/fs/FileSystem.html#globStatus(org.apache.hadoop.fs.Path)>
![](https://support.huaweicloud.com/cmpntguide-mrs/zh-cn_image_0272687067.jpg)
#### 行为操作示例
- MARK
  ```
  <action>
    <type>MARK</type>
    <params>
      <param>
        <name>targettier</name>
        <value>HOT</value>
      </param>
    </params>
  </action>
  ```
  
- MOVE
  ```
  <action>
    <type>MOVE</type>
    <params>
      <param>
        <name>targettier</name>
        <value>HOT</value>
      </param>
      <param>
        <name>targetnodelabels</name>
        <value>SOME_EXPRESSION</value>
      </param>
    </params>
  </action>
  ```
  
- SET_REPL
  ```
  <action>
    <type>SET_REPL</type>
    <params>
      <param>
        <name>replcount</name>
        <value>5</value>
      </param>
    </params>
  </action>
  ```
  
- MOVE_TO_FOLDER
  ```
  <action>
    <type>MOVE_TO_FOLDER</type>
    <params>
      <param>
        <name>target</name>
        <value>path</value>
      </param>
      <param>
        <name>overwrite</name>
        <value>true</value>
      </param>
    </params>
  </action>
  ```
  ![](https://support.huaweicloud.com/cmpntguide-mrs/public_sys-resources/note_3.0-zh-cn.png)
  MOVE_TO_FOLDER操作只是将文件路径更改为目标文件夹，不会更改块位置。如果想要移动块，则需要配置一个独立的move策略。
  
- DELETE
  ```
  <action>
    <type>DELETE</type>
  </action>
  ```
  
![](https://support.huaweicloud.com/cmpntguide-mrs/public_sys-resources/note_3.0-zh-cn.png)
- 在编写xml文件时，用户应该注意行为操作的配置和顺序。冷热数据迁移工具按照输入xml中给定的顺序执行规则。
- 如果只希望运行基于atime/age的一个规则，则按照时间逆序排列，且将idempotent属性设置为false。
- 如果为文件集配置删除操作，则在删除操作后不能再配置其他规则。
- 支持使用"-fs"选项，用于指定客户端默认的文件系统地址。
 
#### 审计日志
冷热数据迁移工具支持以下操作的审计日志。
- 工具启动状态
- 行为类型及参数详细信息和状态
- 工具完成状态
对于启用审计日志工具，在"\<HADOOP_CONF_DIR\>/log4j.property"文件中添加以下属性。
```
autodatatool.logger=INFO, ADMTRFA
autodatatool.log.file=HDFSAutoDataMovementTool.audit
log4j.logger.com.huawei.hadoop.hdfs.datamovement.HDFSAutoDataMovementTool.audit=${autodatatool.logger}
log4j.additivity.com.huawei.hadoop.hdfs.datamovement.HDFSAutoDataMovementTool-audit=false
log4j.appender.ADMTRFA=org.apache.log4j.RollingFileAppender
log4j.appender.ADMTRFA.File=${hadoop.log.dir}/${autodatatool.log.file}
log4j.appender.ADMTRFA.layout=org.apache.log4j.PatternLayout
log4j.appender.ADMTRFA.layout.ConversionPattern=%d{ISO8601} %p %c: %m%n
log4j.appender.ADMTRFA.MaxBackupIndex=10
log4j.appender.ADMTRFA.MaxFileSize=64MB
```
![](https://support.huaweicloud.com/cmpntguide-mrs/public_sys-resources/note_3.0-zh-cn.png)
具体请参考"\<HADOOP_CONF_DIR\>/log4j_autodata_movment_template.properties"文件。
