Ошибка на планшетном сервере Accumulo при сканировании данных

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

2015-11-12 04:38:56,107 [hdfs.DFSClient] WARN : Failed to connect to /192.168.250.12:50010 for block, add to deadNodes and continue. java.io.IOException: Got error, status message opReadBlock BP-1881591466-192.168.1.111-1438767154643:blk_1073773956_33167 received exception java.io.IOException:  Offset 16320 and length 20 don't match block BP-1881591466-192.168.1.111-1438767154643:blk_1073773956_33167 ( blockLen 0 ), for OP_READ_BLOCK, self=/192.168.250.202:55915, remote=/192.168.250.12:50010, for file /accumulo/tables/1/default_tablet/F0000gne.rf, for pool BP-1881591466-192.168.1.111-1438767154643 block 1073773956_33167
java.io.IOException: Got error, status message opReadBlock BP-1881591466-192.168.1.111-1438767154643:blk_1073773956_33167 received exception java.io.IOException:  Offset 16320 and length 20 don't match block BP-1881591466-192.168.1.111-1438767154643:blk_1073773956_33167 ( blockLen 0 ), for OP_READ_BLOCK, self=/192.168.250.202:55915, remote=/192.168.250.12:50010, for file /accumulo/tables/1/default_tablet/F0000gne.rf, for pool BP-1881591466-192.168.1.111-1438767154643 block 1073773956_33167
 at org.apache.hadoop.hdfs.protocol.datatransfer.DataTransferProtoUtil.checkBlockOpStatus(DataTransferProtoUtil.java:140)
        at org.apache.hadoop.hdfs.RemoteBlockReader2.checkSuccess(RemoteBlockReader2.java:456)
        at org.apache.hadoop.hdfs.RemoteBlockReader2.newBlockReader(RemoteBlockReader2.java:424)
        at org.apache.hadoop.hdfs.BlockReaderFactory.getRemoteBlockReader(BlockReaderFactory.java:818)
        at org.apache.hadoop.hdfs.BlockReaderFactory.getRemoteBlockReaderFromTcp(BlockReaderFactory.java:697)
        at org.apache.hadoop.hdfs.BlockReaderFactory.build(BlockReaderFactory.java:355)
        at org.apache.hadoop.hdfs.DFSInputStream.blockSeekTo(DFSInputStream.java:618)
        at org.apache.hadoop.hdfs.DFSInputStream.readWithStrategy(DFSInputStream.java:844)
        at org.apache.hadoop.hdfs.DFSInputStream.read(DFSInputStream.java:896)
        at org.apache.hadoop.hdfs.DFSInputStream.read(DFSInputStream.java:697)
        at java.io.DataInputStream.readShort(DataInputStream.java:312)
        at org.apache.accumulo.core.file.rfile.bcfile.Utils$Version.<init>(Utils.java:264)
        at org.apache.accumulo.core.file.rfile.bcfile.BCFile$Reader.<init>(BCFile.java:823)
        at org.apache.accumulo.core.file.blockfile.impl.CachableBlockFile$Reader.init(CachableBlockFile.java:246)
        at org.apache.accumulo.core.file.blockfile.impl.CachableBlockFile$Reader.getBCFile(CachableBlockFile.java:257)
        at org.apache.accumulo.core.file.blockfile.impl.CachableBlockFile$Reader.access$100(CachableBlockFile.java:137)
        at org.apache.accumulo.core.file.blockfile.impl.CachableBlockFile$Reader$MetaBlockLoader.get(CachableBlockFile.java:209)
        at org.apache.accumulo.core.file.blockfile.impl.CachableBlockFile$Reader.getBlock(CachableBlockFile.java:313)
        at org.apache.accumulo.core.file.blockfile.impl.CachableBlockFile$Reader.getMetaBlock(CachableBlockFile.java:368)
        at org.apache.accumulo.core.file.blockfile.impl.CachableBlockFile$Reader.getMetaBlock(CachableBlockFile.java:137)
        at org.apache.accumulo.core.file.rfile.RFile$Reader.<init>(RFile.java:843)
        at org.apache.accumulo.core.file.rfile.RFileOperations.openReader(RFileOperations.java:79)
        at org.apache.accumulo.core.file.DispatchingFileFactory.openReader(DispatchingFileFactory.java:69)
        at org.apache.accumulo.tserver.tablet.Compactor.openMapDataFiles(Compactor.java:279)
        at org.apache.accumulo.tserver.tablet.Compactor.compactLocalityGroup(Compactor.java:322)
        at org.apache.accumulo.tserver.tablet.Compactor.call(Compactor.java:214)
        at org.apache.accumulo.tserver.tablet.Tablet._majorCompact(Tablet.java:1976)
        at org.apache.accumulo.tserver.tablet.Tablet.majorCompact(Tablet.java:2093)
        at org.apache.accumulo.tserver.tablet.CompactionRunner.run(CompactionRunner.java:44)
        at org.apache.htrace.wrappers.TraceRunnable.run(TraceRunnable.java:57)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at org.apache.accumulo.fate.util.LoggingRunnable.run(LoggingRunnable.java:35)
        at java.lang.Thread.run(Thread.java:745)

Я думаю, что это скорее проблема, связанная с HDFS, а не с Accumulo, поэтому я проверил журналы узла данных и нашел то же сообщение:

Offset 16320 and length 20 don't match block BP-1881591466-192.168.1.111-1438767154643:blk_1073773956_33167 ( blockLen 0 ), for OP_READ_BLOCK, self=/192.168.250.202:55915, remote=/192.168.250.12:50010, for file /accumulo/tables/1/default_tablet/F0000gne.rf, for pool BP-1881591466-192.168.1.111-1438767154643 block 1073773956_33167

А вот как ИНФО в логах. Чего я не понимаю, так это почему я получаю эту ошибку.

Я вижу, что имя пула файла (BP-1881591466-192.168.1.111-1438767154643), к которому я пытаюсь получить доступ, содержит IP-адрес (192.168.1.111), который не совпадает с IP-адресом любого из серверов (собственно и дистанционно). На самом деле 192.168.1.111 был старым IP-адресом главного сервера Hadoop, но я его изменил. Я использую доменные имена вместо IP-адресов, поэтому единственным местом, где я вносил изменения, были файлы хостов машин в кластере. Ни одна из конфигураций Hadoop/Accumulo не использует IP-адреса. Кто-нибудь знает, в чем здесь проблема? Я потратил на это дни и до сих пор не могу понять это.


person thisisshantzz    schedule 12.11.2015    source источник


Ответы (1)


Ошибка, которую вы получаете, указывает на то, что Accumulo не может прочитать часть одного из своих файлов из HDFS. NameNode сообщает, что блок находится в определенном DataNode (в вашем случае 192.168.250.12). Однако, когда Accumulo пытается прочитать данные из этого узла данных, происходит сбой.

Вероятно, это указывает на поврежденный блок в HDFS или временную проблему с сетью. Вы можете попробовать запустить hadoop fsck / (точная команда может отличаться в зависимости от версии), чтобы выполнить проверку работоспособности HDFS.

Кроме того, несоответствие IP-адреса в DataNode, по-видимому, указывает на то, что DataNode запутался в пуле HDFS, частью которого он является. Вы должны перезапустить этот DataNode после двойной проверки его конфигурации, DNS и /etc/hosts на наличие любых аномалий.

person Christopher    schedule 13.11.2015
comment
Спасибо за ответ. Когда вы говорите «перезагрузка», вы имеете в виду, что мне нужно отформатировать namenode, а затем запустить службы Hadoop или просто выполнить ./stop-dfs.sh, а затем ./start-dfs.sh? - person thisisshantzz; 13.11.2015
comment
Я проверил файл hosts кластера, и IP-адреса там правильные. Кажется, что старый IP-адрес где-то кэшируется, и в конечном итоге хауп использует эти кэшированные IP-адреса, но я не уверен. - person thisisshantzz; 13.11.2015
comment
Я просто имел в виду остановку/запуск dfs. - person Christopher; 14.11.2015
comment
Вероятно, лучше всего задать вопрос в списке рассылки [email protected], так как это похоже на проблему HDFS с вашим узлом данных. - person Christopher; 15.11.2015