
# 执行HDFS文件并发操作命令
#### 操作场景
MRS提供集群内并发修改文件和目录的权限及访问控制的工具，可以通过该工具多并发设置目录中所有文件的副本数、属主、权限、ACL信息等。
#### 约束与限制
本章节适用于MRS 3.x及后续版本。
#### 对系统的影响
因为集群内使用文件并发修改命令会对集群性能造成较大负担，所以在集群空闲时使用文件并发操作命令。
#### 前提条件
- 已安装包含HDFS的客户端。例如安装目录为"/opt/client"。
- 各组件业务用户由MRS集群管理员根据业务需要创建。安全模式下，"机机"用户需要下载keytab文件。"人机"用户第一次登录时需修改密码（普通模式不涉及）。
 
#### 操作步骤
1. 以客户端安装用户，登录安装客户端的节点。
2. 执行以下命令，切换到客户端安装目录。 
   ```
   cd /opt/client
   ```
   
   
3. 执行以下命令配置环境变量。 
   ```
   source bigdata_env
   ```
   
   
4. 如果集群为安全模式，执行的用户所属的用户组必须为**supergroup** 组，且执行以下命令进行用户认证。普通模式集群无需执行用户认证。
   
   ```
   kinit 组件业务用户
   ```
   
   
5. 增大客户端的JVM大小，防止OOM，方法如下。
   
   1. 执行以下命令编辑"*\<客户端安装路径\>* /HDFS/component_env"文件。
      ```
      vi <客户端安装路径>/HDFS/component_env
      ```
      
   
   2. 修改"CLIENT_GC_OPTS"参数来修改HDFS客户端的内存上限。例如，需要设置内存上限为1GB（1亿文件建议**32G** ），则设置：
      ```
      CLIENT_GC_OPTS="-Xmx1G"
      ```
      
   
   3. 在修改完后，使用如下命令刷新客户端配置，使之生效： **source** *\<客户端安装路径\>* **/bigdata_env**
      
   
   
   
   
6. 执行并发命令，命令详情如下表。 
   - 多并发设置目录中所有文件的副本数。
     ```
     hdfs quickcmds [-t threadsNumber] [-p principal] [-k keytab] -setrep <rep> <path> ...
     ```
     
   
   - 多并发设置目录中所有文件的属主。
     ```
     hdfs quickcmds [-t threadsNumber] [-p principal] [-k keytab] -chown [owner][:[group]] <path> ...
     ```
     
   
   - 多并发设置目录中所有文件的权限。
     ```
     hdfs quickcmds [-t threadsNumber] [-p principal] [-k keytab] -chmod <mode> <path> ...
     ```
     
   
   - 多并发设置目录中所有文件的ACL信息。
     ```
     hdfs quickcmds [-t threadsNumber] [-p principal] [-k keytab] -setfacl [{-b|-k} {-m|-x <acl_spec>} <path> ...]|[--set <acl_spec> <path> ...]
     ```
     
   
   
   以上命令中，相关参数说明如下：
   - threadsNumber：并发线程数，默认为本机CPU核数
   
   - principal：Kerberos用户
   
   - keytab：Keytab文件
   
   - rep：副本数
   
   - owner：所属用户
   
   - group：所属组
   
   - mode：权限（如754）
   
   - acl_spec：逗号分隔的ACL列表
   
   - path：HDFS目录
   
   
   
   
 
#### 常见问题
若执行HDFS客户端命令时，客户端程序异常退出，并且报"java.lang.OutOfMemoryError"错误。这个问题是由于HDFS客户端运行时的所需的内存超过了HDFS客户端设置的内存上限（默认128M）。可参考[5]来修改HDFS客户端的内存上限。
