HiveServer2 scratchdir 在本地存储一些临时文件。如果使用 kill -9 停止 HiveServer2 时,来不及清理本地的 scratchdir。再次启动时,默认是不清理本地的 scratchdir 的。那么多次重启 HiveServer2 后,有可能在本地有大量垃圾文件,这些文件永远不再访问。造成两个问题。
- 浪费存储空间。
- 如果一个目录下的子目录和文件的数目很多,造成访问变慢。如在 scratchdir 下创建或者查询子目录(文件)非常慢。
1. 查看 scratchdir 的配置目录
注意此目录是 HDFS 目录,在此目录下再为每个用户创建一个子目录。
<property>
<name>hive.exec.scratchdir</name>
<value>/tmp/hive</value>
<description>HDFS root scratch dir for Hive jobs which gets created with write all (733) permission. For each connecting user, an HDFS scratch dir: ${hive.exec.scratchdir}/<username> is created, with ${hive.scratch.dir.permission}.</description>
</property>
2. 查看 HiveServer 启动时是否清理 scratchdir
当配置为true时,在启动 HiveServer2 时,先删除 hive.exec.scratchdir
设置的目录
hive> set hive.start.cleanup.scratchdir;
hive.start.cleanup.scratchdir=false
3. 是否定时清理 scratchdir
hive> set hive.server2.clear.dangling.scratchdir;
hive.server2.clear.dangling.scratchdir=false
- 定时周期默认 1800 秒。
hive> set hive.server2.clear.dangling.scratchdir.interval;
hive.server2.clear.dangling.scratchdir.interval=1800s
4. 其他
本地 scratchdir 的配置为:
<property>
<name>hive.exec.local.scratchdir</name>
<value>${system:java.io.tmpdir}/${system:user.name}</value>
<description>Local scratch space for Hive jobs</description>
</property>
当用户名为 hive 时,hive.exec.local.scratchdir 也是 ‘/tmp/hive’,容易和hive.exec.scratchdir
混淆。
hive> set hive.exec.local.scratchdir;
hive.exec.local.scratchdir=/tmp/hive
当用户为 hive 时,hive.exec.local.scratchdir 本地的目录是 ‘/tmp/hive’,注意:hive 是根据用户名生成的。
hive.exec.scratchdir HDFS 目录是 ‘/tmp/hive/hive’,最后的 hive 是根据用户名生成的。