filenotfoundexception

x7yiwoj4  于 2021-06-03  发布在  Hadoop
关注(0)|答案(2)|浏览(312)

我得到以下例外:

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文件的选项?

zz2j4svz

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

wmomyfyw

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示例

...
agent.sources.avroSource.interceptors = timestamp
agent.sources.avroSource.interceptors.timestamp.type = org.apache.flume.interceptor.TimestampInterceptor$Builder
...
agent.sinks.hdfsSink.type = hdfs
agent.sinks.hdfsSink.hdfs.path = /path/to/target/%y-%m-%d/
...

相关问题