Which version of Hadoop are you running on?

Yohann Jardin

Le 6/21/2017 à 1:06 AM, N B a écrit :
Ok some more info about this issue to see if someone can shine a light on what 
could be going on. I turned on debug logging for 
org.apache.spark.streaming.scheduler in the driver process and this is what 
gets thrown in the logs and keeps throwing it even after the downed HDFS node 
is restarted. Using Spark 2.1.1 and HDFS 2.7.3 here.

2017-06-20 22:38:11,302 WARN JobGenerator ReceivedBlockTracker.logWarning - 
Exception thrown while writing record: BatchCleanupEvent(ArrayBuffer()) to the 
WriteAheadLog.
org.apache.spark.SparkException: Exception thrown in awaitResult:
at org.apache.spark.util.ThreadUtils$.awaitResult(ThreadUtils.scala:194)
at 
org.apache.spark.streaming.util.BatchedWriteAheadLog.write(BatchedWriteAheadLog.scala:83)
at 
org.apache.spark.streaming.scheduler.ReceivedBlockTracker.writeToLog(ReceivedBlockTracker.scala:234)
at 
org.apache.spark.streaming.scheduler.ReceivedBlockTracker.cleanupOldBatches(ReceivedBlockTracker.scala:171)
at 
org.apache.spark.streaming.scheduler.ReceiverTracker.cleanupOldBlocksAndBatches(ReceiverTracker.scala:233)
at 
org.apache.spark.streaming.scheduler.JobGenerator.clearCheckpointData(JobGenerator.scala:287)
at 
org.apache.spark.streaming.scheduler.JobGenerator.org<http://org.apache.spark.streaming.scheduler.JobGenerator.org>$apache$spark$streaming$scheduler$JobGenerator$$processEvent(JobGenerator.scala:187)
at 
org.apache.spark.streaming.scheduler.JobGenerator$$anon$1.onReceive(JobGenerator.scala:89)
at 
org.apache.spark.streaming.scheduler.JobGenerator$$anon$1.onReceive(JobGenerator.scala:88)
at org.apache.spark.util.EventLoop$$anon$1.run(EventLoop.scala:48)
Caused by: 
org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.HadoopIllegalArgumentException):
 Missing storageIDs: It is likely that the HDFS client, who made this call, is 
running in an older version of Hadoop which does not support storageIDs. 
datanodeID.length=1, 
src=/vm/spark-checkpoint/receivedBlockMetadata/log-1497997390799-1497997450799, 
fileId=0, blk=BP-1450953312-10.0.0.9-1490120290209:blk_1081472520_7731872, 
clientName=DFSClient_NONMAPREDUCE_-23097586_1, clientMachine=10.0.0.17
at 
org.apache.hadoop.hdfs.server.blockmanagement.DatanodeManager.getDatanodeStorageInfos(DatanodeManager.java:514)
at 
org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getAdditionalDatanode(FSNamesystem.java:3353)
at 
org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.getAdditionalDatanode(NameNodeRpcServer.java:759)
at 
org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolServerSideTranslatorPB.getAdditionalDatanode(ClientNamenodeProtocolServerSideTranslatorPB.java:515)
at 
org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos$ClientNamenodeProtocol$2.callBlockingMethod(ClientNamenodeProtocolProtos.java)
at 
org.apache.hadoop.ipc.ProtobufRpcEngine$Server$ProtoBufRpcInvoker.call(ProtobufRpcEngine.java:616)
at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:982)
at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:2049)
at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:2045)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:422)
at 
org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1698)
at org.apache.hadoop.ipc.Server$Handler.run(Server.java:2043)

at org.apache.hadoop.ipc.Client.call(Client.java:1347)
at org.apache.hadoop.ipc.Client.call(Client.java:1300)
at 
org.apache.hadoop.ipc.ProtobufRpcEngine$Invoker.invoke(ProtobufRpcEngine.java:206)
at com.sun.proxy.$Proxy10.getAdditionalDatanode(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at 
org.apache.hadoop.io.retry.RetryInvocationHandler.invokeMethod(RetryInvocationHandler.java:186)
at 
org.apache.hadoop.io.retry.RetryInvocationHandler.invoke(RetryInvocationHandler.java:102)
at com.sun.proxy.$Proxy10.getAdditionalDatanode(Unknown Source)
at 
org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolTranslatorPB.getAdditionalDatanode(ClientNamenodeProtocolTranslatorPB.java:352)
at 
org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.addDatanode2ExistingPipeline(DFSOutputStream.java:919)
at 
org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.setupPipelineForAppendOrRecovery(DFSOutputStream.java:1031)
at 
org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.processDatanodeError(DFSOutputStream.java:823)
at 
org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.run(DFSOutputStream.java:475)
polygraph-engine 2017-06-20 22:38:11,302 WARN JobGenerator 
ReceivedBlockTracker.logWarning - Failed to acknowledge batch clean up in the 
Write Ahead Log.

Thanks
N B


On Tue, Jun 20, 2017 at 10:24 AM, N B 
<nb.nos...@gmail.com<mailto:nb.nos...@gmail.com>> wrote:
BTW, this is running on Spark 2.1.1.

I have been trying to debug this issue and what I have found till now is that 
it is somehow related to the Spark WAL. The directory named <checkpoint dir in 
HDFS>/receivedBlockMetadata seems to stop getting written to after the point of 
an HDFS node being killed and restarted. I have a couple questions around this :

1. Why is the flume receiver even writing to the WAL? I have not enabled the 
'spark.streaming.receiver.writeAheadLog.enable' property and even after I set 
it explicitly to false in the driver, the WAL seems to be getting written to.

2. Why would the receive receive metadata but not write to the WAL after an 
HDFS node is lost and restarted? HDFS replication factor is at its default of 2.

Thanks
N B


On Mon, Jun 19, 2017 at 6:23 PM, N B 
<nb.nos...@gmail.com<mailto:nb.nos...@gmail.com>> wrote:
Hi all,

We are running a Standalone Spark Cluster for running a streaming application. 
The application consumes data from Flume using a Flume Polling stream created 
as such :


flumeStream = FlumeUtils.createPollingStream(streamingContext,
    socketAddress.toArray(new InetSocketAddress[socketAddress.size()]),
    StorageLevel.MEMORY_AND_DISK_SER(), 100, 5);




The checkpoint directory is configured to be on an HDFS cluster and Spark 
workers have their SPARK_LOCAL_DIRS and SPARK_WORKER_DIR defined to be on their 
respective local filesystems.

What we are seeing is some odd behavior and unable to explain. During normal 
operation, everything runs as expected with flume delivering events to Spark. 
However, while running, if I kill one of the HDFS nodes (does not matter which 
one), the Flume Receiver in Spark stops producing any data to the data 
processing.

I enabled debug logging for org.apache.spark.streaming.flume on Spark worker 
nodes and looked at the logs for the one that gets to run the Flume Receiver 
and it keeps chugging along receiving data from Flume as shown in a sample of 
the log below, but the resulting batches in the Stream start receiving 0 
records soon as the HDFS node is killed, with no errors being produced to 
indicate any issue.

17/06/20 01:05:42 DEBUG FlumeBatchFetcher: Ack sent for sequence number: 
09fa05f59050
17/06/20 01:05:44 DEBUG FlumeBatchFetcher: Received batch of 100 events with 
sequence number: 09fa05f59052
17/06/20 01:05:44 DEBUG FlumeBatchFetcher: Sending ack for sequence number: 
09fa05f59052
17/06/20 01:05:44 DEBUG FlumeBatchFetcher: Ack sent for sequence number: 
09fa05f59052
17/06/20 01:05:47 DEBUG FlumeBatchFetcher: Received batch of 100 events with 
sequence number: 09fa05f59054
17/06/20 01:05:47 DEBUG FlumeBatchFetcher: Sending ack for sequence number: 
09fa05f59054

The driver output for the application shows (printed via 
Dstream.count().map().print()):

-------------------------------------------
Time: 1497920770000 ms
-------------------------------------------
Received 0     flume events.


Any insights about where to look in order to find the root cause will be 
greatly appreciated.

Thanks
N B




Reply via email to