Hi David

How does your block replica count compare to the number of datanodes in
your cluster?

Anyway...I found this in the online doc.  You may want to use the NEVER
policy.

dfs.client.block.write.replace-datanode-on-failure.enable true If there is
a datanode/network failure in the write pipeline, DFSClient will try to
remove the failed datanode from the pipeline and then continue writing with
the remaining datanodes. As a result, the number of datanodes in the
pipeline is decreased. The feature is to add new datanodes to the pipeline.
This is a site-wide property to enable/disable the feature. When the
cluster size is extremely small, e.g. 3 nodes or less, cluster
administrators may want to set the policy to NEVER in the default
configuration file or disable this feature. Otherwise, users may experience
an unusually high rate of pipeline failures since it is impossible to find
new datanodes for replacement. See also
dfs.client.block.write.replace-datanode-on-failure.policy
dfs.client.block.write.replace-datanode-on-failure.policy DEFAULT This
property is used only if the value of
dfs.client.block.write.replace-datanode-on-failure.enable is true. ALWAYS:
always add a new datanode when an existing datanode is removed. NEVER:
never add a new datanode. DEFAULT: Let r be the replication number. Let n
be the number of existing datanodes. Add a new datanode only if r is
greater than or equal to 3 and either (1) floor(r/2) is greater than or
equal to n; or (2) r is greater than n and the block is hflushed/appended.

Allan
On Oct 30, 2013 5:52 AM, "David Mankellow" <dmankel...@swiftserve.com>
wrote:

> Hi all,
>
> We are having difficulty writing any logs to a HDFS cluster of less than 3
> nodes. This has been since the update between cdh4.2 and 4.3 (4.4 is also
> the same). Has anything changed that may make this occur and is there
> anything that can be done to rectify the situation, so we can use a single
> datanode once more?
>
> The error log contains errors about "lease recovery" and "Failed to add a
> datanode".
>
> Here is an example stack trace:
>
> java.io.IOException: Failed to add a datanode.  User may turn off this
> feature by setting 
> dfs.client.block.write.**replace-datanode-on-failure.**policy
> in configuration, where the current policy is DEFAULT.  (Nodes: current=[
> 5.9.130.139:50010, 5.9.130.140:50010], original=[5.9.130.139:50010,
> 5.9.130.140:50010])
>     at org.apache.hadoop.hdfs.**DFSOutputStream$DataStreamer.**
> findNewDatanode(**DFSOutputStream.java:816)
>     at org.apache.hadoop.hdfs.**DFSOutputStream$DataStreamer.**
> addDatanode2ExistingPipeline(**DFSOutputStream.java:876)
>     at org.apache.hadoop.hdfs.**DFSOutputStream$DataStreamer.**
> setupPipelineForAppendOrRecove**ry(DFSOutputStream.java:982)
>     at org.apache.hadoop.hdfs.**DFSOutputStream$DataStreamer.**
> run(DFSOutputStream.java:493)
> FSDataOutputStream#close error:
> java.io.IOException: Failed to add a datanode.  User may turn off this
> feature by setting 
> dfs.client.block.write.**replace-datanode-on-failure.**policy
> in configuration, where the current policy is DEFAULT.  (Nodes: current=[
> 5.9.130.139:50010, 5.9.130.140:50010], original=[5.9.130.139:50010,
> 5.9.130.140:50010])
>     at org.apache.hadoop.hdfs.**DFSOutputStream$DataStreamer.**
> findNewDatanode(**DFSOutputStream.java:816)
>     at org.apache.hadoop.hdfs.**DFSOutputStream$DataStreamer.**
> addDatanode2ExistingPipeline(**DFSOutputStream.java:876)
>     at org.apache.hadoop.hdfs.**DFSOutputStream$DataStreamer.**
> setupPipelineForAppendOrRecove**ry(DFSOutputStream.java:982)
>     at org.apache.hadoop.hdfs.**DFSOutputStream$DataStreamer.**
> run(DFSOutputStream.java:493)
> hdfsOpenFile(hdfs://storage1.**testing.swiftserve.com:9000/**
> scribe/logs/test/log1.testing.**swiftserve.com/test-2013-10-**14_00000<http://storage1.testing.swiftserve.com:9000/scribe/logs/test/log1.testing.swiftserve.com/test-2013-10-14_00000>):
> FileSystem#append((Lorg/**apache/hadoop/fs/Path;)Lorg/**apache/hadoop/fs/*
> *FSDataOutputStream;) error:
> org.apache.hadoop.ipc.**RemoteException(org.apache.**hadoop.hdfs.protocol.
> **AlreadyBeingCreatedException): Failed to create file [/scribe/logs/test/
> log1.**testing.swiftserve.com/test-**2013-10-14_00000<http://log1.testing.swiftserve.com/test-2013-10-14_00000>]
> for [DFSClient_NONMAPREDUCE_**1056562813_1] on client [5.9.130.136],
> because this file is already being created by 
> [DFSClient_NONMAPREDUCE_**2007800327_1]
> on [5.9.130.136]
>     at org.apache.hadoop.hdfs.server.**namenode.FSNamesystem.**
> recoverLeaseInternal(**FSNamesystem.java:2062)
>     at org.apache.hadoop.hdfs.server.**namenode.FSNamesystem.**
> startFileInternal(**FSNamesystem.java:1862)
>     at org.apache.hadoop.hdfs.server.**namenode.FSNamesystem.**
> appendFileInt(FSNamesystem.**java:2105)
>     at org.apache.hadoop.hdfs.server.**namenode.FSNamesystem.**
> appendFile(FSNamesystem.java:**2081)
>     at org.apache.hadoop.hdfs.server.**namenode.NameNodeRpcServer.**
> append(NameNodeRpcServer.java:**434)
>     at org.apache.hadoop.hdfs.**protocolPB.**
> ClientNamenodeProtocolServerSi**deTranslatorPB.append(**
> ClientNamenodeProtocolServerSi**deTranslatorPB.java:224)
>     at org.apache.hadoop.hdfs.**protocol.proto.**
> ClientNamenodeProtocolProtos$**ClientNamenodeProtocol$2.**
> callBlockingMethod(**ClientNamenodeProtocolProtos.**java:44944)
>     at org.apache.hadoop.ipc.**ProtobufRpcEngine$Server$**
> ProtoBufRpcInvoker.call(**ProtobufRpcEngine.java:453)
>     at org.apache.hadoop.ipc.RPC$**Server.call(RPC.java:1002)
>     at org.apache.hadoop.ipc.Server$**Handler$1.run(Server.java:**1701)
>     at org.apache.hadoop.ipc.Server$**Handler$1.run(Server.java:**1697)
>     at java.security.**AccessController.doPrivileged(**Native Method)
>     at javax.security.auth.Subject.**doAs(Subject.java:396)
>     at org.apache.hadoop.security.**UserGroupInformation.doAs(**
> UserGroupInformation.java:**1408)
>     at org.apache.hadoop.ipc.Server$**Handler.run(Server.java:1695)
>
>     at org.apache.hadoop.ipc.Client.**call(Client.java:1231)
>     at org.apache.hadoop.ipc.**ProtobufRpcEngine$Invoker.**
> invoke(ProtobufRpcEngine.java:**202)
>     at $Proxy9.append(Unknown Source)
>     at sun.reflect.**GeneratedMethodAccessor6.**invoke(Unknown Source)
>     at sun.reflect.**DelegatingMethodAccessorImpl.**invoke(**
> DelegatingMethodAccessorImpl.**java:25)
>     at java.lang.reflect.Method.**invoke(Method.java:597)
>     at org.apache.hadoop.io.retry.**RetryInvocationHandler.**invokeMethod(
> **RetryInvocationHandler.java:**164)
>     at org.apache.hadoop.io.retry.**RetryInvocationHandler.invoke(**
> RetryInvocationHandler.java:**83)
>     at $Proxy9.append(Unknown Source)
>     at org.apache.hadoop.hdfs.**protocolPB.**
> ClientNamenodeProtocolTranslat**orPB.append(**
> ClientNamenodeProtocolTranslat**orPB.java:210)
>     at org.apache.hadoop.hdfs.**DFSClient.callAppend(**
> DFSClient.java:1352)
>     at org.apache.hadoop.hdfs.**DFSClient.append(DFSClient.**java:1391)
>     at org.apache.hadoop.hdfs.**DFSClient.append(DFSClient.**java:1379)
>     at org.apache.hadoop.hdfs.**DistributedFileSystem.append(**
> DistributedFileSystem.java:**257)
>     at org.apache.hadoop.hdfs.**DistributedFileSystem.append(**
> DistributedFileSystem.java:81)
>     at org.apache.hadoop.fs.**FileSystem.append(FileSystem.**java:1106)
>
> The exception suggests we have already set " dfs.client.block.write.**
> replace-datanode-on-failure.**policy" to "NEVER" but hadoop ignores it.
>
> Any help would be appreciated.
>
> Thanks,
> David Mankellow
>

Reply via email to