
# 配置Hive插入数据到不存在的目录中
#### 操作场景
在Hive数据处理场景中，使用INSERT OVERWRITE DIRECTORY语句将查询结果写入指定的HDFS目录时，默认情况下如果目标目录不存在，语句会执行失败。这在自动化数据处理流程中可能导致任务中断，需要预先创建目录或修改脚本逻辑。如何让Hive在写入数据时自动创建不存在的目录，简化数据处理流程？MRS Hive提供自动创建目录功能，当执行INSERT OVERWRITE DIRECTORY语句时，如果目标目录不存在，Hive会自动创建该目录并写入数据。
本章节指导用户开启Hive能插入数据到不存在的目录中的功能，例如执行**insert overwrite directory** *"* */path1/path2/path3"*命令，"/path1/path2"目录权限为700且属主为当前用户，"path3"目录不存在。执行以上命令后系统会自动创建"path3"目录，并写数据成功。
#### 约束与限制
- 本功能在Hive参数"hive.server2.enable.doAs"为"true"时已经支持，本指导新增当"hive.server2.enable.doAs"为"false"时，如何配置Hive能插入数据到不存在的目录中。"hive.server2.enable.doAs"参数用于控制HiveServer2是否以客户端用户的身份执行Hive查询。
- 该功能仅适用于INSERT OVERWRITE DIRECTORY语句。
- MRS 3.6.0-LTS及之后版本，该参数动态生效，不需要重启Hive服务。
 
#### 前提条件
- 已安装Hive客户端。下载并安装集群客户端的具体操作，请参考[安装MRS集群客户端](https://support.huaweicloud.com/usermanual-mrs/mrs_01_0089.html)。
- Hive服务正常运行。
- 当前用户对目标目录的父目录具有写权限。
 
#### 操作步骤
1. 登录Manager页面，选择"集群 \> 服务 \> Hive \> 配置 \> 全部配置"，进入Hive配置页面。
2. 选择"HiveServer（角色） \> 安全"，修改"hive.server2.enable.doAs"参数值为"false"。
3. 选择"HiveServer（角色） \> 自定义"，对参数文件"hive-site.xml"添加自定义参数，设置"名称"为"hive.overwrite.directory.move.trash"，"值"为"true"。
4. MRS 3.6.0-LTS之前版本，单击"保存"保存配置。单击"实例"，勾选所有Hive实例，选择"更多 \> 重启实例"，输入当前用户密码，单击"确定"重启所有Hive实例。 
   MRS 3.6.0-LTS及之后版本，单击"保存"保存配置，等待界面提示"操作成功"，单击"完成"，配置已修改。该参数动态生效，不需要重启Hive服务。
   
   
5. 以客户端安装用户登录安装客户端的节点。 
   下载并安装集群客户端的具体操作，请参考[安装MRS集群客户端](https://support.huaweicloud.com/usermanual-mrs/mrs_01_0089.html)。
   
   
6. 执行以下命令配置环境变量并认证用户。 
   切换至客户端安装目录：
   ```
   cd 客户端安装目录
   ```
   加载环境变量：
   ```
   source bigdata_env
   ```
   认证用户，未开启Kerberos认证的集群请跳过该步骤：
   ```
   kinit Hive业务用户
   ```
   
   
7. 执行以下命令创建HDFS目录，例如"/user/test"： 
   ```
   hdfs dfs -mkdir /user/test
   ```
   
   
8. 执行以下命令登录Hive客户端： 
   ```
   beeline
   ```
   
   
9. 创建Hive表并插入数据。例如创建表"test"：
   
   执行以下命令创建表，例如"test"：
   ```
   create table test(id int,name string);
   ```
   执行以下命令向表中插入数据：
   ```
   insert into table test(id,name) values("11","A");
   ```
   
   
10. 执行以下命令查询Hive表数据并写入至HDFS中，例如"/user/test/hive"目录下： 
    ```
    insert overwrite directory '/user/test/hive' select * from test;
    ```
    数据写入命令执行成功。
    
    
11. 执行以下命令退出Hive客户端： 
    ```
    !q
    ```
    
    
12. 查看HDFS的"/user/test"目录下是否新创建了"hive"目录，且写入的数据保存在该目录下。 
    1. 执行以下命令查看HDFS的"/user/test"目录：
       ```
       hdfs dfs -ls /user/test
       ```
       自动创建目录成功：
       图1查看目录   
       ![](https://support.huaweicloud.com/cmpntguide-lts-mrs/zh-cn_image_0000002357820869.png "点击放大") 
    
    2. 执行以下命令查看"/user/test/hive"目录下的文件数据：
       ```
       hdfs dfs -cat /user/test/hive/000000_0
       ```
       文件内容为，与[9]插入的表数据一致：
       ```
       11A
       ```
       
    
    
    
    
**验证操作：**
配置完成后，可通过以下方式验证自动创建目录功能是否生效：
1. 执行INSERT OVERWRITE DIRECTORY语句，指定一个不存在的路径。
2. 执行**hdfs dfs -ls**命令，确认目录已自动创建。
3. 执行**hdfs dfs -cat**命令，确认数据已正确写入。
 
#### 常见问题
- **自动创建目录失败**
  自动创建目录失败的常见原因包括：用户对父目录没有写权限、参数配置不正确、HDFS服务异常等。
  请检查用户对目标目录的父目录是否具有写权限。检查HDFS服务状态是否正常。
  
- **hive.server2.enable.doAs参数的作用**
  hive.server2.enable.doAs参数控制HiveServer2执行查询时的用户身份，影响权限检查和自动创建目录功能。
  
- **自动创建的目录权限不正确**
  自动创建的目录权限继承自父目录，如果父目录权限设置不当，可能导致创建的目录权限不符合预期。
  请检查父目录的权限设置。如果需要特定的目录权限，可以在创建目录后使用**hdfs dfs -chmod**命令修改目录权限。
  
 
#### 相关文档
- 了解Hive数据操作，请参考[Hive数据存储及加密配置](https://support.huaweicloud.com/cmpntguide-lts-mrs/mrs_01_300253.html)。
- 了解Hive常见问题，请参考[Hive常见问题](https://support.huaweicloud.com/cmpntguide-lts-mrs/mrs_01_1752.html)。
- 了解Hive各角色日志文件说明，请参考[Hive日志介绍](https://support.huaweicloud.com/cmpntguide-lts-mrs/mrs_01_0976.html)。
 
