我正在纱线上运行一个火花作业。作业在amazon电子病历上正常运行。(1个主设备和2个从设备,带m4.xlarge)
我已经设置了类似的基础设施使用HDP 2.6分布使用aws ec2机器。但是spark作业在某个特定阶段被卡住了,过了一段时间,我在容器日志中收到了以下错误。主要错误似乎是shuffle服务处于空闲状态。
18/06/25 07:15:31信息火花。MapOutputTrackerWorker:正在进行提取;跟踪器端点=NettyRpcEndpointRef(spark://MapOutputTracker@10.210.150.150:44343)18/06/25 07:15:31信息火花。MapOutputTrackerWorker:没有shuffle 9的映射输出,正在获取它们18/06/25 07:15:31信息火花。MapOutputTrackerWorker:没有shuffle 9的映射输出,正在获取它们18/06/25 07:15:31信息火花。MapOutputTrackerWorker:获取输出位置18/06/25 07:15:31信息存储。ShuffleBlockFetcherIterator:从1000个块中获取5个非空块18/06/25 07:15:31信息存储。ShuffleBlockFetcherIterator:在0毫秒内启动了1次远程回迁18/06/25 07:15:31信息存储。ShuffleBlockFetcherIterator:从1000个块中获取5个非空块18/06/25 07:15:31信息存储。ShuffleBlockFetcherIterator:在0毫秒内启动了0个远程回迁18/06/25 07:15:31信息存储。ShuffleBlockFetcherIterator:从1000个块中获取5个非空块18/06/25 07:15:31信息存储。ShuffleBlockFetcherIterator:在0毫秒内启动了1次远程回迁18/06/25 07:15:31信息存储。ShuffleBlockFetcherIterator:从1000个块中获取5个非空块18/06/25 07:15:31信息存储。ShuffleBlockFetcherIterator:在1毫秒内启动了1次远程回迁25年6月18日07:15:31信息编码。CodeGenerator:在4.822611毫秒内生成的代码25年6月18日07:15:31信息编码。CodeGenerator:8.430244毫秒内生成的代码18/06/25 07:17:31服务器错误。TransportChannelHandler:连接到ip-10-210-150-180.********/10.10.150.180:7447已静默120000毫秒,但仍有未完成的请求。假设连接已断开;如果这是错误的,请调整spark.network.timeout。18/06/25 07:17:31错误客户端。TransportResponseHandler:当ip-10-210-150-180的连接关闭时,仍有307个请求未完成。********/10.10.150.180:744718/06/25 07:17:31信息洗牌。RetryingBlockFetcher:5000毫秒后,正在为197个未完成的块重试提取(1/3)18/06/25 07:17:31错误洗牌。OneForOneBlockFetcher:启动块提取时失败java.io.IOException:从ip-10-210-150-180.********/10.10.150.180:7447的连接已关闭网址:org.apache.spark.network.client.TransportResponseHandler.channelInactive(TransportResponseHandler.java:146)网址:org.apache.spark.network.server.TransportChannelHandler.channelInactive(TransportChannelHandler.java:108)位于io.netty.channe.AbstractChannelHandlerContext.invokeChannelInactive(AbstractchannelHandlerContent.java:241)位于io.netty.channe.AbstractChannelHandlerContext.invokeChannelInactive(AbstractchannelHandlerContent.java:227)位于io.netty.channe.AbstractChannelHandlerContext.fireChannelInactive(AbstractchannelHandlerContent.java:220)位于io.nety.channel.ChannelInboundHandlerAdapter.channelInactive(ChannelInboundHandlerAdapter.java:75)在io.netty.handler.timeout.IidleStateHandler.channelInactive(IdleStateHandler.java:278)位于io.netty.channe.AbstractChannelHandlerContext.invokeChannelInactive(AbstractchannelHandlerContent.java:241)位于io.netty.channe.AbstractChannelHandlerContext.invokeChannelInactive(AbstractchannelHandlerContent.java:227)位于io.netty.channe.AbstractChannelHandlerContext.fireChannelInactive(AbstractchannelHandlerContent.java:220)位于io.nety.channel.ChannelInboundHandlerAdapter.channelInactive(ChannelInboundHandlerAdapter.java:75)位于io.netty.channe.AbstractChannelHandlerContext.invokeChannelInactive(AbstractchannelHandlerContent.java:241)位于io.netty.channe.AbstractChannelHandlerContext.invokeChannelInactive(AbstractchannelHandlerContent.java:227)位于io.netty.channe.AbstractChannelHandlerContext.fireChannelInactive(AbstractchannelHandlerContent.java:220)位于io.nety.channel.ChannelInboundHandlerAdapter.channelInactive(ChannelInboundHandlerAdapter.java:75)网址:org.apache.spark.network.util.TransportFrameDecoder.channelInactive(TransportFrameDecoder.java:182)位于io.netty.channe.AbstractChannelHandlerContext.invokeChannelInactive(AbstractchannelHandlerContent.java:241)位于io.netty.channe.AbstractChannelHandlerContext.invokeChannelInactive(AbstractchannelHandlerContent.java:227)位于io.netty.channe.AbstractChannelHandlerContext.fireChannelInactive(AbstractchannelHandlerContent.java:220)位于io.nety.channel.DefaultChannelPipeline$HeadContext.channelInactive(DefaultChannelPiperine.java:1289)位于io.netty.channe.AbstractChannelHandlerContext.invokeChannelInactive(AbstractchannelHandlerContent.java:241)位于io.netty.channe.AbstractChannelHandlerContext.invokeChannelInactive(AbstractchannelHandlerContent.java:227)位于io.netty.channe.DefaultChannelPipeline.fireChannelInactive(DefaultChannelPipeline.java:893)位于io.nety.channel.AbstractChannel$AbstractUnsafe$7.run(AbstractChannel.java:691)位于io.nety.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:399)位于io.nety.channel.nio.NioEventLoop.run(NioEventLoop.java:446)位于io.nety.util.concurrent.SingleThreadEventExecutiator$2.run(SingleThreadEventExecutor.java:131)位于io.nety.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:144)在java.lang.Thread.run(线程.java:748)18/06/25 07:17:31信息洗牌。RetryingBlockFetcher:5000毫秒后对166个未完成的块重试提取(1/3)18/06/25 07:17:31错误洗牌。OneForOneBlockFetcher:启动块提取时失败java.io.IOException:从ip-10-210-150-180.********/10.10.150.180:7447的连接已关闭网址:org.apache.spark.network.client.TransportResponseHandler.channelInactive(TransportResponseHandler.java:146)网址:org.apache.spark.network.server.TransportChannelHandler.channelInactive(TransportChannelHandler.java:108)位于io.netty.channe.AbstractChannelHandlerContext.invokeChannelInactive(AbstractchannelHandlerContent.java:241)位于io.netty.channe.AbstractChannelHandlerContext.invokeChannelInactive(AbstractchannelHandlerContent.java:227)位于io.netty.channe.AbstractChannelHandlerContext.fireChannelInactive(AbstractchannelHandlerContent.java:220)位于io.nety.channel.ChannelInboundHandlerAdapter.channelInactive(ChannelInboundHandlerAdapter.java:75)在io.netty.handler.timeout.IidleStateHandler.channelInactive(IdleStateHandler.java:278)位于io.netty.channe.AbstractChannelHandlerContext.invokeChannelInactive(AbstractchannelHandlerContent.java:241)位于io.netty.channe.AbstractChannelHandlerContext.invokeChannelInactive(AbstractchannelHandlerContent.java:227)位于io.netty.channe.AbstractChannelHandlerContext.fireChannelInactive(AbstractchannelHandlerContent.java:220)位于io.nety.channel.ChannelInboundHandlerAdapter.channelInactive(ChannelInboundHandlerAdapter.java:75)位于io.netty.channe.AbstractChannelHandlerContext.invokeChannelInactive(AbstractchannelHandlerContent.java:241)位于io.netty.channe.AbstractChannelHandlerContext.invokeChannelInactive(AbstractchannelHandlerContent.java:227)位于io.netty.channe.AbstractChannelHandlerContext.fireChannelInactive(AbstractchannelHandlerContent.java:220)位于io.nety.channel.ChannelInboundHandlerAdapter.channelInactive(ChannelInboundHandlerAdapter.java:75)网址:org.apache.spark.network.util.TransportFrameDecoder.channelInactive(TransportFrameDecoder.java:182)位于io.netty.channe.AbstractChannelHandlerContext.invokeChannelInactive(AbstractchannelHandlerContent.java:241)位于io.netty.channe.AbstractChannelHandlerContext.invokeChannelInactive(AbstractchannelHandlerContent.java:227)位于io.netty.channe.AbstractChannelHandlerContext.fireChannelInactive(AbstractchannelHandlerContent.java:220)位于io.nety.channel.DefaultChannelPipeline$HeadContext.channelInactive(DefaultChannelPiperine.java:1289)位于io.netty.channe.AbstractChannelHandlerContext.invokeChannelInactive(AbstractchannelHandlerContent.java:241)位于io.netty.channe.AbstractChannelHandlerContext.invokeChannelInactive(AbstractchannelHandlerContent.java:227)位于io.netty.channe.DefaultChannelPipeline.fireChannelInactive(DefaultChannelPipeline.java:893)位于io.nety.channel.AbstractChannel$AbstractUnsafe$7.run(AbstractChannel.java:691)位于io.nety.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:399)位于io.nety.channel.nio.NioEventLoop.run(NioEventLoop.java:446)位于io.nety.util.concurrent.SingleThreadEventExecutiator$2.run(SingleThreadEventExecutor.java:131)位于io.nety.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:144)在java.lang.Thread.run(Thread.java:748)
我目前正在纱线簇上运行以下火花默认配置的火花
spark.eventLog.dir=hdfs:///user/spark/applicationHistory
spark.eventLog.enabled=true
spark.yarn.historyServer.address=ppv-qa12-tenant8-spark-cluster-master.periscope-solutions.local:18080
spark.shuffle.service.enabled=true
spark.dynamicAllocation.enabled=true
spark.driver.extraLibraryPath=/usr/hdp/current/hadoop-client/lib/native:/usr/hdp/current/hadoop-client/lib/native/Linux-amd64-64
spark.executor.extraLibraryPath=/usr/hdp/current/hadoop-client/lib/native:/usr/hdp/current/hadoop-client/lib/native/Linux-amd64-64
spark.driver.maxResultSize=0
spark.driver.extraJavaOptions=-XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=70 -XX:MaxHeapFreeRatio=70 -XX:+CMSClassUnloadingEnabled -XX:OnOutOfMemoryError='kill -9 %p'
spark.executor.extraJavaOptions=-verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=70 -XX:MaxHeapFreeRatio=70 -XX:+CMSClassUnloadingEnabled -XX:OnOutOfMemoryError='kill -9 %p'
spark.executor.memory=5g
spark.driver.memory=1g
spark.executor.cores=4
我在从属机器的nodemanager中的yarn-site.xml中设置了以下内容
<configuration>
<property>
<name>yarn.application.classpath</name>
<value>/usr/hdp/current/spark2-client/aux/*,/etc/hadoop/conf,/usr/hdp/current/hadoop-client/*,/usr/hdp/current/hadoop-client/lib/*,/usr/hdp/current/hadoop-hdfs-client/*,/usr/hdp/current/hadoop-hdfs-client/lib/*,/usr/hdp/current/hadoop-yarn-client/*,/usr/hdp/current/hadoop-yarn-client/lib/*</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>spark2_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce_shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
<property>
<name>yarn.nodemanager.aux-services.spark2_shuffle.class</name>
<value>org.apache.spark.network.yarn.YarnShuffleService</value>
</property>
<property>
<name>yarn.nodemanager.container-manager.thread-count</name>
<value>64</value>
</property>
<property>
<name>yarn.nodemanager.localizer.client.thread-count</name>
<value>20</value>
</property>
<property>
<name>yarn.nodemanager.vmem-pmem-ratio</name>
<value>5</value>
</property>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>************</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.client.thread-count</name>
<value>64</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.client.thread-count</name>
<value>64</value>
</property>
<property>
<name>yarn.scheduler.increment-allocation-mb</name>
<value>32</value>
</property>
<property>
<name>yarn.scheduler.increment-allocation-vcores</name>
<value>1</value>
</property>
<property>
<name>yarn.scheduler.maximum-allocation-vcores</name>
<value>128</value>
</property>
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>32</value>
</property>
<property>
<name>yarn.timeline-service.enabled</name>
<value>true</value>
</property>
<property>
<name>yarn.nodemanager.resource.cpu-vcores</name>
<value>8</value>
</property>
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>11520</value>
</property>
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>11520</value>
</property>
<property>
<name>yarn.nodemanager.hostname</name>
<value>*************</value>
</property>
</configuration>
编辑:通过一些网络调试,我发现容器创建的用于连接shuffle服务的epeheral端口正在主动拒绝连接。(telnet立即抛出错误)
在查看内核和系统活动日志时,我们在/var/log/messages
中发现了以下问题
xen_netfront:xennet:skb乘坐火箭:19个插槽
这意味着我们的aws ec2机器出现了网络数据包丢失。
数据传输b/n容器和shuffle服务通过RPC调用(ChunkFetchRequest、ChunkFectSuccess和ChunkFetch Failure)进行,这些RPC调用被网络抑制。
有关此日志的更多信息可以在以下线程中找到。
http://www.brendangregg.com/blog/2014-09-11/perf-kernel-line-tracing.html
日志消息意味着我们超过了可以放入驱动程序环形缓冲队列(16)的数据包的最大缓冲区大小,并且这些SKB丢失了
分散-聚集收集多个响应,并将它们作为单个响应发送,这反过来又导致SKB大小的增加。
因此,我们使用以下命令关闭了散射聚集。
sudo ethtool -K eth0 sg off
在这之后,没有更多的数据包丢失。
性能也与我们过去在电子病历中的性能相似。