2017-05-31 31 views
1

我一直在嘗試使用spark-submit來運行我的作業,當我使用jdbc從Postgresql中獲取DataFrame時,我遇到了問題。spark-submit netty使用jdbc時的NoSuchMethodError

所有的JDBC驅動程序首先是我的工作,罐子裏面,但我不得不加載這樣的司機我的代碼裏面

sparkSession.read.option("driver", "org.postgresql.Driver").jdbc(jdbcdn, query, props) 

能正常工作並與數據庫的連接時,我知道這是因爲如果服務器沒有找到,我會從驅動程序收到相應的異常。 但是,如果連接成功,我總是會收到以下異常和作業掛起:

17/05/31 10:56:16 ERROR server.TransportRequestHandler: Error sending result StreamResponse{streamId=/jars/bibi-1.0.0-spark.jar, byteCount=3345077, body=FileSegmentManagedBuffer{file=/srv/jobs/bibi-1.0.0-spark.jar, offset=0, length=3345077}} to /127.0.0.1:50087; closing connection 
io.netty.handler.codec.EncoderException: java.lang.NoSuchMethodError: io.netty.channel.DefaultFileRegion.<init>(Ljava/io/File;JJ)V 
    at io.netty.handler.codec.MessageToMessageEncoder.write(MessageToMessageEncoder.java:107) 
    at io.netty.channel.AbstractChannelHandlerContext.invokeWrite(AbstractChannelHandlerContext.java:658) 
    at io.netty.channel.AbstractChannelHandlerContext.write(AbstractChannelHandlerContext.java:716) 
    at io.netty.channel.AbstractChannelHandlerContext.write(AbstractChannelHandlerContext.java:651) 
    at io.netty.handler.timeout.IdleStateHandler.write(IdleStateHandler.java:266) 
    at io.netty.channel.AbstractChannelHandlerContext.invokeWrite(AbstractChannelHandlerContext.java:658) 
    at io.netty.channel.AbstractChannelHandlerContext.write(AbstractChannelHandlerContext.java:716) 
    at io.netty.channel.AbstractChannelHandlerContext.writeAndFlush(AbstractChannelHandlerContext.java:706) 
    at io.netty.channel.AbstractChannelHandlerContext.writeAndFlush(AbstractChannelHandlerContext.java:741) 
    at io.netty.channel.DefaultChannelPipeline.writeAndFlush(DefaultChannelPipeline.java:895) 
    at io.netty.channel.AbstractChannel.writeAndFlush(AbstractChannel.java:240) 
    at org.apache.spark.network.server.TransportRequestHandler.respond(TransportRequestHandler.java:194) 
    at org.apache.spark.network.server.TransportRequestHandler.processStreamRequest(TransportRequestHandler.java:150) 
    at org.apache.spark.network.server.TransportRequestHandler.handle(TransportRequestHandler.java:111) 
    at org.apache.spark.network.server.TransportChannelHandler.channelRead(TransportChannelHandler.java:118) 
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:333) 
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:319) 
    at io.netty.handler.timeout.IdleStateHandler.channelRead(IdleStateHandler.java:254) 
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:333) 
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:319) 
    at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:103) 
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:333) 
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:319) 
    at org.apache.spark.network.util.TransportFrameDecoder.channelRead(TransportFrameDecoder.java:85) 
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:333) 
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:319) 
    at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:787) 
    at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:130) 
    at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:511) 
    at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:468) 
    at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:382) 
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:354) 
    at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:116) 
    at io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:137) 
    at java.lang.Thread.run(Thread.java:748) 
Caused by: java.lang.NoSuchMethodError: io.netty.channel.DefaultFileRegion.<init>(Ljava/io/File;JJ)V 
    at org.apache.spark.network.buffer.FileSegmentManagedBuffer.convertToNetty(FileSegmentManagedBuffer.java:133) 
    at org.apache.spark.network.protocol.MessageEncoder.encode(MessageEncoder.java:58) 
    at org.apache.spark.network.protocol.MessageEncoder.encode(MessageEncoder.java:33) 
    at io.netty.handler.codec.MessageToMessageEncoder.write(MessageToMessageEncoder.java:89) 
    ... 34 more 

我試過以下(我用搖籃)的

  • 從我的項目中排除網狀依賴
  • 包括netty的一個版本在我的影子中
  • 重新定位所包含的網絡

但我試過的一切都沒有效果。 我想知道的是我註冊驅動程序時遇到的問題,因爲您可以在網上找到的所有標準方法都不能用spark/scala/jdbc工作,而且我必須使用上面的代碼。 在我看來,jdbc調用是在自己的環境中,無論我在我的項目gradle中做什麼都不會影響這個環境。

由於option("driver", "org.postgresql.Driver")很難找到,我不知道這裏是否有某些未公開的文檔,以及我是否需要找到一種方法來指示jdbc運行時使用哪個netty版本。

回答

1

好吧,我繼續我的搜索,並最終找到發生了什麼事情。 我自己安裝了spark-master和hadoop服務器,因爲hadoop罐子將放在同一臺服務器上,我在沒有hadoop的情況下安裝了spark。

使用「hadoop classpath」命令添加Hadoop罐以激發類路徑。

事情就是hadoop 2.7.3用netty 3.6.2/4.0.23發佈。最後用netty 3.8.0/4.0.42啓動船。最後 兩者都是在classpath中引發問題。

我所做的就是將兩個netty jar從火花複製到hadoop中的所有地方,基本上升級hadoop使用的netty版本。

到目前爲止我沒有看到問題,但我使用了hadoop可以做的一小部分,並且可能會出現問題。

編輯:另一個快速解決方案是使用spark-with-hadoop tar並且不添加hadoop類路徑,這種方式都使用自己的jar而不會相互衝突。 這實際上是我最終做的,因爲我在訪問sparkUI時遇到了另一個jar衝突,並且無法通過像netty那樣複製jar來糾正它。

結論是:切勿使用spark-without-hadoop下載。

相關問題