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