Задания успешно завершаются, хотя возникает IOException
Я получаю различные IOException на своем главном узле при запуске GridMix, и мне интересно, действительно ли это то, о чем я должен беспокоиться, или это что-то временное, когда мои задания заканчиваются успешно:
IOException: Bad connect ack with firstBadLink: \
java.io.IOException: Bad response ERROR for block BP-49483579-10.0.1.190-1449960324681:blk_1073746606_5783 from datanode 10.0.1.192:50010
at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer$ResponseProcessor.run(DFSOutputStream.java:819)
2 ответа
Я не могу быть уверен, пока не пойму вашу полную настройку, но высока вероятность того, что эти исключения возникают при добавлении к настройке конвейера, с точки зрения кода, вы можете сказать, что stage == BlockConstructionStage.PIPELINE_SETUP_APPEND
,
В любом случае, поскольку ваши задания успешно завершаются, вам не нужно беспокоиться, и почему он успешно завершается, потому что при попытке открыть DataOutputStream для конвейера DataNode и возникает какое-то исключение, он продолжает пытаться, пока конвейер не будет настроен.
Исключение происходит из org.apache.hadoop.hdfs.DFSOutputStream
и ниже приведены важные фрагменты кода для вашего понимания.
private boolean createBlockOutputStream(DatanodeInfo[] nodes, long newGS, boolean recoveryFlag) {
//Code..
if (pipelineStatus != SUCCESS) {
if (pipelineStatus == Status.ERROR_ACCESS_TOKEN) {
throw new InvalidBlockTokenException(
"Got access token error for connect ack with firstBadLink as "
+ firstBadLink);
} else {
throw new IOException("Bad connect ack with firstBadLink as "
+ firstBadLink);
}
}
//Code..
}
Сейчас, createBlockOutputStream
вызывается из setupPipelineForAppendOrRecovery
и в комментарии к коду для этого метода упоминается: "Он продолжает пытаться, пока не будет настроен конвейер".
/**
* Open a DataOutputStream to a DataNode pipeline so that
* it can be written to.
* This happens when a file is appended or data streaming fails
* It keeps on trying until a pipeline is setup
*/
private boolean setupPipelineForAppendOrRecovery() throws IOException {
//Code..
while (!success && !streamerClosed && dfsClient.clientRunning) {
//Code..
success = createBlockOutputStream(nodes, newGS, isRecovery);
}
//Code..
}
И если вы пройдете через полный org.apache.hadoop.hdfs.DFSOutputStream
В коде вы поймете, что пробная установка конвейера будет продолжаться, пока конвейер не будет создан для добавления или нового использования.
Если вы хотите справиться с этим, то вы можете попробовать настроить dfs.datanode.max.xcievers
собственность от hdfs-site.xml
Максимум людей сообщили о решении из того же. Обратите внимание, что вам необходимо перезапустить сервисы hadoop после того, как вы установите свойство.
<property>
<name>dfs.datanode.max.xcievers</name>
<value>8192</value>
</property>
Игнорируй это?
try {
...
} catch (IOException iox) {
//***NOP***
}