View

* ISSUE

1) spark 설치 후 yarn에 작업을 올려 수행하는 경우 ( beeline 수행, spark shell 수행, zeppelin 수행 등) yarn 에 올라간 작업이 아래 에러로그를 발생 시키면서 hang이 걸린다. 

2) spark thrift server 가 정상적으로 올라오지 않음. 


* ERROR LOG

17/06/04 11:47:03 WARN DefaultChannelPipeline: An exception 'java.lang.NoSuchMethodError: org.apache.spark.network.client.TransportClient.getChannel()Lio/netty/channel/Channel;' [enable DEBUG level for full stacktrace] was thrown by a user handler's exceptionCaught() method while handling the following exception: java.lang.NoSuchMethodError: org.apache.spark.network.client.TransportClient.getChannel()Lio/netty/channel/Channel; at org.apache.spark.rpc.netty.NettyRpcHandler.channelInactive(NettyRpcEnv.scala:621) at org.apache.spark.network.server.TransportRequestHandler.channelInactive(TransportRequestHandler.java:99) at org.apache.spark.network.server.TransportChannelHandler.channelInactive(TransportChannelHandler.java:103) at org.spark_project.io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:251) at org.spark_project.io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:237) at org.spark_project.io.netty.channel.AbstractChannelHandlerContext.fireChannelInactive(AbstractChannelHandlerContext.java:230) at org.spark_project.io.netty.channel.ChannelInboundHandlerAdapter.channelInactive(ChannelInboundHandlerAdapter.java:75) at org.spark_project.io.netty.handler.timeout.IdleStateHandler.channelInactive(IdleStateHandler.java:257) at org.spark_project.io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:251) at org.spark_project.io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:237) at org.spark_project.io.netty.channel.AbstractChannelHandlerContext.fireChannelInactive(AbstractChannelHandlerContext.java:230) at org.spark_project.io.netty.channel.ChannelInboundHandlerAdapter.channelInactive(ChannelInboundHandlerAdapter.java:75) at org.spark_project.io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:251) at org.spark_project.io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:237) at org.spark_project.io.netty.channel.AbstractChannelHandlerContext.fireChannelInactive(AbstractChannelHandlerContext.java:230) at org.spark_project.io.netty.channel.ChannelInboundHandlerAdapter.channelInactive(ChannelInboundHandlerAdapter.java:75) at org.apache.spark.network.util.TransportFrameDecoder.channelInactive(TransportFrameDecoder.java:182) at org.spark_project.io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:251) at org.spark_project.io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:237) at org.spark_project.io.netty.channel.AbstractChannelHandlerContext.fireChannelInactive(AbstractChannelHandlerContext.java:230) at org.spark_project.io.netty.channel.DefaultChannelPipeline$HeadContext.channelInactive(DefaultChannelPipeline.java:1289) at org.spark_project.io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:251) at org.spark_project.io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:237) at org.spark_project.io.netty.channel.DefaultChannelPipeline.fireChannelInactive(DefaultChannelPipeline.java:893) at org.spark_project.io.netty.channel.AbstractChannel$AbstractUnsafe$7.run(AbstractChannel.java:691) at org.spark_project.io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:376) at org.spark_project.io.netty.util.concurrent.SingleThreadEventExecutor.confirmShutdown(SingleThreadEventExecutor.java:680) at org.spark_project.io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:465) at org.spark_project.io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:140) at org.spark_project.io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:144) at java.lang.Thread.run(Thread.java:745) 17/06/04 11:47:03 INFO ShutdownHookManager: Shutdown hook called


* SOLVED

 구글신의 검색으로도 안나와서 나름 오랫동안 고생했던 이슈이다. 사실 해결 방법은 부끄러울 정도로 간단해서 당황스러웠지만 티끌만큼이나 다른 이에게 도움이될까 이런 실수를 공유한다. 이미 지난 이슈라서 생각나는데로 적기는 했으나 많이 부족할 수 있으니 혹시 동일한 문제를 앓고 있는 사람이 있다면 댓글이나 메일을 통해 질문을 부탁드린다. 

 Yarn 모드로 spark를 수행하는 경우 발생할 수 있는 오류로 TransportClient 에서 NoSuchMethodError가 발생한다. 
하지만 실제로 spark에는 1개의 'TransportClient'가 존재함으로 source level에서만 봐서는 이해가 되지 않는다. 

 이러한 에러는 직접 빌드를 수행한 spark release에서 발생할 수 있는데, 에러로그만 본다면 netty의 버전이슈처럼 보이기도 하지만, 실제로는 빌드 수행시 java class에 대해 shadowing이 수행됨으로써 동일한 'TransportClient' class가 서로 다른 패키지 명으로 빌드됨으로 발생하는 것인데, 이는 여러 모듈에서 동일한 class를 충돌없이 사용하기 위해서 사용되는 기법이다. 

 실제로 간단한 script를 짜서 확인해본 결과 (하위 경로의 모든 jar 파일의 목록을 확인하여 TransportClient로 grep) 두 개의 jar 파일에서 각각 TransportClient를 가지고 있는 것을 확인하였으며, 서로 다른 package 경로를 가지고 있는 것을 확인하였다.
netty에서 요청하는 TransportClient org.apache.spark.network.client.TransportClient.getChannel' 이지만 jar 파일의 충돌로 다른 패키지의 TransportClient를 참조하여 문제가 발생하였다.

사실 이 문제는 rpm 파일을 생성하면서 특정 spark-yarn-shuffle에만 필요한 jar 파일을 별도의 디렉토리로 분리하지 않아서 발생한 문제였기 때문에 yarn 이라는 경로를 생성하여 jar파일을 옮겨주었다. 그 후 별 이슈 없이 잘 해결되었다. 


* error log ref (http://blog.csdn.net/GG584741/article/details/72858371)


Share Link
reply
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30