我得到以下例外:
java.io.FileNotFoundException: File does not exist: /log1/20131025/2013102509_at1.1382659200021.tmp
at org.apache.hadoop.hdfs.DFSClient$DFSInputStream.fetchLocatedBlocks(DFSClient.java:2006)
at org.apache.hadoop.hdfs.DFSClient$DFSInputStream.openInfo(DFSClient.java:1975)
...
当job先生在运行的时候。flume更改文件名 .tmp
至 .
mr任务找不到文件(mr正在尝试读取 .tmp
)并抛出错误。
我不知道怎样才能避免filenotfoundexception。
我正在通过hadoop流媒体运行mrjob( $hadoop jar contrib/streaming/hadoop-streaming-1.2.1.jar...
)
是否有排除.tmp文件的选项?
2条答案
按热度按时间zz2j4svz1#
我也有同样的经历,我通过在flume配置文件中添加hdfs sink配置来解决这个问题
hdfs.inUsePrefix = . hdfs.inUseSuffix = .temp
我使用了“.”的“hdfs.inuseprefix”值,以便在流式传输时从配置单元查询中隐藏该文件。发行
我注意到,在配置单元上运行“选择查询”时,如果外部表中有文件流到其中的位置,我会遇到如下错误:
java.io.FileNotFoundException: File does not exist: hdfs://hmaster:9000/data/etl/sdp/statistics/ppasinterface/some/path/to/a/partition/some_files.tmp
检查flume日志文件显示,将some_file.tmp重命名为some.file是失败的原因。您也可以参考《hari shreedharan使用flume》一书[如果使用epub,请参阅第177/178页]http://flume.apache.org/flumeuserguide.html#hdfs-Flume
wmomyfyw2#
我解决这个问题的方法是分区,假设我想对来自flume的数据运行hadoop查询,flume将使用时间戳发布数据(您可以使用时间戳拦截器配置sink以使用目标目录中的日期)。
之后,确保不读取最新分区(最近一天),我个人在完全不同的地方有一个主存储器,我通过flume定期读取上一个时段的分区来聚合hdfs中的数据。
e、 g.flume将事件放在文件夹2013-10-27-01中,因为这是凌晨1点的数据,我想每小时处理一次。凌晨2点,我运行hadoop将这些数据移动到主存储器,但仅此而已,我没有阅读2013-10-27-02中的内容,这是flume现在(凌晨2点)要写入的文件夹
flume.conf示例