flume打到hdfs上時,按照文件大小生成文件,在達到指定大小以前數據都是以.tmp文件形式保存在hdfs上,hive外部表也會加載這些文件,可是當文件完成後.tmp會消失,這時候hive會報找不到文件的錯誤。解決方法是本身寫hive的pathfilter類,hive加載數據的時候把tmp文件過濾掉不加載便可。 java
錯誤信息以下: 服務器
自定義PathFilter類以下: code
/** * * @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"); } }
<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>切記:不能有回車換行這樣的字符,要否則回報一些亂七八糟的錯誤,博主就被坑的七零八碎的!!!!