2016-10-24 1 views
0

У меня есть система регистрации, которая записывает 5-минутные агрегаты в Hadoop, более ~ 60 ГБ данных каждый час. Моя проблема возникает, когда, просматривая данные, некоторые часы пик кажутся неполными (только часть журналов подается). Эта потеря информации совпадает с самыми высокими периодами нагрузки. Я слежу за журналами и читаю каждую трассировку, которую я могу, но я не могу понять, в чем проблема.Hadoop пишет неполный файл для HDFS

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

2016-10-08 14:16:24 INFO Exception in createBlockOutputStream 
java.io.IOException: Got error, status message , ack with firstBadLink as <dnip>:50010 
     at org.apache.hadoop.hdfs.protocol.datatransfer.DataTransferProtoUtil.checkBlockOpStatus(DataTransferProtoUtil.java:140) 
     at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.createBlockOutputStream(DFSOutputStream.java:1397) 
     at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.nextBlockOutputStream(DFSOutputStream.java:1299) 
     at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.run(DFSOutputStream.java:464) 
2016-10-08 14:16:24 INFO Abandoning BP-1891784736-10.118.249.120-1467026091136:blk_1077950482_131390250 
2016-10-08 14:16:24 INFO Excluding datanode DatanodeInfoWithStorage[<dnip>:50010,DS-d1b79bfe-3ee8-4dba-b3a3-48e50a357b30,DISK] 

Через несколько секунд появляются новые ошибки:

2016-10-08 14:17:34 INFO Exception in createBlockOutputStream 
java.net.SocketTimeoutException: 65000 millis timeout while waiting for channel to be ready for read. ch : java.nio.channels.SocketChannel 

После чего ошибки, пакетный процесс начинает закрывать файлы. Затем, только для некоторых файлов, есть некоторые новые ошибки:

2016-10-08 14:17:34 WARN DataStreamer Exception 
org.apache.hadoop.ipc.RemoteException(java.io.IOException): File /my/log/path/log.gz could only be replicated to 0 nodes instead of minRep 
lication (=1). There are 2 datanode(s) running and 2 node(s) are excluded in this operation. 

Для этих конкретных файлов размер - cero. В противном случае они записываются только частично, теряя некоторые данные. Кроме того, HDFS регистрирует состояние, что:

2016-10-08 14:21:22,789 WARN datanode.DataNode (BlockReceiver.java:receivePacket(694)) - Slow BlockReceiver write data to disk cost:2143ms (threshold=300ms) 

и

DataXceiver error processing WRITE_BLOCK operation 

Просмотр всех журналов Предупреждать на HDFS, кажется, коррелирует с потерей информации, а также createBlockOutputStream. Всякий раз, когда есть много строк с этими ошибками, происходит потеря данных.

Любые журналы, которые я должен проверить? Может быть, Hadoop тюнинг?

+0

Указывается, что 2 из 2-х данных не исключены. Доступны ли эти узлы достаточной емкости? (Внутри и снаружи hdfs). Обходным путем может быть, конечно, использование 1-минутных агрегатов. –

ответ

0

В качестве частичного ответа мы обнаружили, что в рабочих узлах GC вызывал много длинных пауз (3 ~ 5 секунд) каждые шесть часов (предопределенный промежуток GC). Мы увеличили кучу от 1 ГБ до 4 ГБ и, похоже, решили. То, что вызывает постоянное заполнение кучи, остается открытым вопросом, но выходит за рамки этого. После увеличения кучи в журналах больше нет ошибок (связанных с этим).

+0

Помогло ли это решить эту проблему, пожалуйста, скажите мне, какая память кучи вы увеличили. –