Hive外部分区表加载flume打到hdfs上文件,读不到.tmp文件

摘要 flume打到hdfs上时,按照文件大小生成文件,在达到指定大小之前数据都是以.tmp文件形式保存在hdfs上,hive外部表也会加载这些文件,但是当文件完成后.tmp会消失,这时候hive会报找不到文件的错误。类似于:Caused by:org.apache.ahdoop.ipc.RemoteException(java.io.FileNotFoundException):File does not exist:/......../..../..xxx.log.tmp


 

    flume打到hdfs上时,按照文件大小生成文件,在达到指定大小之前数据都是以.tmp文件形式保存在hdfs上,hive外部表也会加载这些文件,但是当文件完成后.tmp会消失,这时候hive会报找不到文件的错误。解决方法是自己写hive的pathfilter类,hive加载数据的时候把tmp文件过滤掉不加载即可。

 错误信息如下:

自定义PathFilter类如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/**
 
   * @Title: FileFilterExcludeTmpFiles.java 
   * @Description: hive加载分区表时会加载.tmp的文件,该类型文件在flume滚动数据之后就会消失,此时hive找不到该文件就会报错
   *                     该类会将.tmp的文件过滤掉,不加载进hive的分区表中 
   * @version V0.1.0
   * @see
 */ public class FileFilterExcludeTmpFiles implements PathFilter{
    private static final Logger logger = LoggerFactory.getLogger(FileFilterExcludeTmpFiles.class);
    public boolean accept(Path path) {
        // TODO Auto-generated method stub         return !name.startsWith("_") && !name.startsWith(".") && !name.endsWith(".tmp");
    }
  
}



编写完后,打成jar包上传服务器,再修改hive-site.xml文件,修改如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<property>
  
    <name>hive.aux.jars.path</name><value>file:///usr/lib/mylib/FilterTmpPath.jar</value>
  
    <description>The location of the plugin jars that contain implementations of user defined functions and serdes.</description>
  
  </property>
  
  <property>
  
    <name>mapred.input.pathFilter.class</name>
  
    <value>cn.utils.hive.FileFilterExcludeTmpFiles</value>
  
  </property>



切记:不能有回车换行这样的字符,要不然回报一些乱七八糟的错误,博主就被坑的七零八碎的!!!!
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值