2013-10-25 1 views
2

Я получаю следующее исключение:Hadoop MapReduce Streaming для Flume моек файлов - FileNotFoundException

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) 
... 

пока MR задание выполняется. Flume изменяет имя файла с xxx.tmp на xxx. , а задача MR не может найти файл (MR пытается прочитать xxx.tmp) и выдает ошибку.

Я понятия не имею, как я могу избежать FileNotFoundException.

Я бегу MR работу через Hadoop потоковом ($hadoop jar contrib/streaming/hadoop-streaming-1.2.1.jar...)

Имеет это любой вариант для исключения файла xxx.tmp?

ответ

0

Способ, которым я решаю это путем разбиения на разделы, допустим, что я хочу запускать запросы хаопов по данным, поступающим из флюма, flume будет размещать данные с помощью метки времени (вы можете настроить приемник с помощью временного перехватчика, чтобы использовать дату в целевой каталог).

После этого вы убедитесь, что вы не прочитали последний раздел (последний день), у меня лично есть основное хранилище в каком-то совершенно другом месте, и я периодически суммирую данные, погруженные в hdfs с помощью flume, путем чтения разделов из Последний период.

например. flume помещает события в папку 2013-10-27-01, потому что это данные с 1 часа ночи, и я хочу обрабатывать их почасово. В 2 часа я запустил hadoop, чтобы перенести эти данные в основное хранилище, но только это, и я не читаю с 2013-10-27-02, где находится папка, где сейчас будет писать поток (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/ 
... 
+0

Хммм. поэтому я должен перемещать или копировать файлы (не .tmp-файл) в другое место для MR. правильно? Благодарю. – user2918147

+0

Я обновил свой ответ с помощью примера конфигурации того, как вы можете сделать flum сделать это за вас – fd8s0

1

у меня был такой же опыт, и я решил, добавив к моим водопропускных конфигурационные файлы в HDFS тонуть конфигура 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

Исследованием транспортера файл журнала показал переименование файла some_file.tmp для some.file.

Вы можете обратиться к книге «Использование Подводящий канал Хари Shreedharan» [Страница 177/178 при использовании EPUB] проверка Также http://flume.apache.org/FlumeUserGuide.html#hdfs-sink

+0

Это лучший ответ, он решил мою проблему! Спасибо –

+1

@AndreaRomagnoli Действительно хороший мой комментарий помог вам выйти. –