Skip to content

Druid - Spark interoperation is problematic due to Netty dependency mismatch #4390

@leventov

Description

@leventov

Spark task (https://github.com/metamx/druid-spark-batch) which uses Druid fails with AbstractMethodError:

java.lang.AbstractMethodError
	at io.netty.util.ReferenceCountUtil.touch(ReferenceCountUtil.java:73) ~[druid-selfcontained-0.10.1-mmx17.jar:0.10.1-mmx17]
	at io.netty.channel.DefaultChannelPipeline.touch(DefaultChannelPipeline.java:107) ~[druid-selfcontained-0.10.1-mmx17.jar:0.10.1-mmx17]
	at io.netty.channel.AbstractChannelHandlerContext.write(AbstractChannelHandlerContext.java:810) ~[druid-selfcontained-0.10.1-mmx17.jar:0.10.1-mmx17]
	at io.netty.channel.AbstractChannelHandlerContext.write(AbstractChannelHandlerContext.java:723) [druid-selfcontained-0.10.1-mmx17.jar:0.10.1-mmx17]
	at io.netty.handler.codec.MessageToMessageEncoder.write(MessageToMessageEncoder.java:111) ~[druid-selfcontained-0.10.1-mmx17.jar:0.10.1-mmx17]
	at io.netty.channel.AbstractChannelHandlerContext.invokeWrite0(AbstractChannelHandlerContext.java:738) [druid-selfcontained-0.10.1-mmx17.jar:0.10.1-mmx17]
	at io.netty.channel.AbstractChannelHandlerContext.invokeWrite(AbstractChannelHandlerContext.java:730) [druid-selfcontained-0.10.1-mmx17.jar:0.10.1-mmx17]
	at io.netty.channel.AbstractChannelHandlerContext.write(AbstractChannelHandlerContext.java:816) [druid-selfcontained-0.10.1-mmx17.jar:0.10.1-mmx17]
	at io.netty.channel.AbstractChannelHandlerContext.write(AbstractChannelHandlerContext.java:723) [druid-selfcontained-0.10.1-mmx17.jar:0.10.1-mmx17]
	at io.netty.handler.timeout.IdleStateHandler.write(IdleStateHandler.java:305) [druid-selfcontained-0.10.1-mmx17.jar:0.10.1-mmx17]
	at io.netty.channel.AbstractChannelHandlerContext.invokeWrite0(AbstractChannelHandlerContext.java:738) [druid-selfcontained-0.10.1-mmx17.jar:0.10.1-mmx17]
	at io.netty.channel.AbstractChannelHandlerContext.invokeWrite(AbstractChannelHandlerContext.java:730) [druid-selfcontained-0.10.1-mmx17.jar:0.10.1-mmx17]
	at io.netty.channel.AbstractChannelHandlerContext.access$1900(AbstractChannelHandlerContext.java:38) [druid-selfcontained-0.10.1-mmx17.jar:0.10.1-mmx17]
	at io.netty.channel.AbstractChannelHandlerContext$AbstractWriteTask.write(AbstractChannelHandlerContext.java:1089) [druid-selfcontained-0.10.1-mmx17.jar:0.10.1-mmx17]
	at io.netty.channel.AbstractChannelHandlerContext$WriteAndFlushTask.write(AbstractChannelHandlerContext.java:1136) [druid-selfcontained-0.10.1-mmx17.jar:0.10.1-mmx17]
	at io.netty.channel.AbstractChannelHandlerContext$AbstractWriteTask.run(AbstractChannelHandlerContext.java:1078) [druid-selfcontained-0.10.1-mmx17.jar:0.10.1-mmx17]
	at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:163) [druid-selfcontained-0.10.1-mmx17.jar:0.10.1-mmx17]
	at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:403) [druid-selfcontained-0.10.1-mmx17.jar:0.10.1-mmx17]
	at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:462) [druid-selfcontained-0.10.1-mmx17.jar:0.10.1-mmx17]
	at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:858) [druid-selfcontained-0.10.1-mmx17.jar:0.10.1-mmx17]
	at io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:138) [druid-selfcontained-0.10.1-mmx17.jar:0.10.1-mmx17]
	at java.lang.Thread.run(Thread.java:745) [?:1.8.0_111]

It doesn't seem that Spark will upgrade to Netty 4.1 soon, so proposed solution is to isolate Druid's usage of Netty somehow, e. g. via shading.

Modules which currently depend on Netty 4.1 in Druid:

  • druid-sql
  • druid-rocketmq
  • druid-avro-extensions
  • druid-services via druid-sql
  • druid-historgram via druid-sql
  • druid-indexing-service via hadoop-client
  • druid-indexing-hadoop

But pretty much all everything in Druid is going to depend on Netty 4.1 via http-client, see metamx/http-client#29.

@gianm @drcrallen @himanshug any thoughts?

Metadata

Metadata

Assignees

No one assigned

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions