请求一些我正面临的问题的帮助/指针。
我们有一个解决方案,我们通过Apache Kafka从Windows读取Web服务器日志文件,然后通过Storm处理它,然后将其存储在HBase中。我们已经能够完成前两部分 - 通过Kafka读取文件并通过Storm处理它们。但是我们在将处理过的数据存储到HBase时遇到了问题。
为了存储到HBase中,我们编写了一个Storm Bolt来读取数据,对其进行处理(根据分隔符对线进行简单处理),然后将其发送到HBase。在bolt中,我们使用ConnectionFactory Java API创建HBase连接,我们可以看到通过日志建立相同的连接。
一旦喷口和前一个螺栓传递数据,我们就会发现HBase螺栓中存在不一致的行为。有时,它继续将数据插入HBase(我们能够通过bolt日志和hbase shell验证相同),但在其他时候,它会抛出一个SocketTimeoutException(包含在下面)。当我们重启HBase时,异常就会消失(有时一次重启会有效,而有时我们不得不重启2-3次)。
执行代码时,会触发Bolt,但不会插入任何行。在Storm UI上,我们看到日志显示SocketTimeoutException。在我们重新启动HBase几次然后插入行之后,这就消失了。每次我们以SocketTimeoutException结束时,都必须完成重启HBase的过程。在此期间,我们看到喷口和先前的螺栓工作正常(在Ambari的Storm UI中更改发射和传输的数字)。
我们看到两种情况:
根据螺栓日志,HBase螺栓没有重新清除。即使先前的螺栓和喷口显示数据被发射,这也是如此。一旦HBase群集重新启动,这就消失了。
HBase相关的螺栓显示通过Storm UI和螺栓日志读取的数据,但是没有看到插入HBASE表中的数据(通过HBase SHell验证)。
请求一些关于如何最好地解决这个问题的指示?我们已经尝试在清除Storm Local Directory并重新启动完整集群后执行运行。
环境详情: Apache Kafka - 0.9.0 Apache Storm - 0.10.0
异常详情
2017-11-24 07:19:36.562 k.c.SimpleConsumer [INFO] Reconnect due to error:
java.net.SocketTimeoutException
at sun.nio.ch.SocketAdaptor$SocketInputStream.read(SocketAdaptor.java:211) ~[?:1.8.0_144]
at sun.nio.ch.ChannelInputStream.read(ChannelInputStream.java:103) ~[?:1.8.0_144]
at java.nio.channels.Channels$ReadableByteChannelImpl.read(Channels.java:385) ~[?:1.8.0_144]
at org.apache.kafka.common.network.NetworkReceive.readFromReadableChannel(NetworkReceive.java:81) ~[kafka-clients-0.9.0.2.4.3.0-227.jar:?]
at kafka.network.BlockingChannel.readCompletely(BlockingChannel.scala:140) ~[kafka_2.10-0.9.0.2.4.3.0-227.jar:?]
at kafka.network.BlockingChannel.receive(BlockingChannel.scala:131) ~[kafka_2.10-0.9.0.2.4.3.0-227.jar:?]
at kafka.consumer.SimpleConsumer.liftedTree1$1(SimpleConsumer.scala:102) [kafka_2.10-0.9.0.2.4.3.0-227.jar:?]
at kafka.consumer.SimpleConsumer.kafka$consumer$SimpleConsumer$$sendRequest(SimpleConsumer.scala:99) [kafka_2.10-0.9.0.2.4.3.0-227.jar:?]
at kafka.consumer.SimpleConsumer$$anonfun$fetch$1$$anonfun$apply$mcV$sp$1.apply$mcV$sp(SimpleConsumer.scala:148) [kafka_2.10-0.9.0.2.4.3.0-227.jar:?]
at kafka.consumer.SimpleConsumer$$anonfun$fetch$1$$anonfun$apply$mcV$sp$1.apply(SimpleConsumer.scala:148) [kafka_2.10-0.9.0.2.4.3.0-227.jar:?]
at kafka.consumer.SimpleConsumer$$anonfun$fetch$1$$anonfun$apply$mcV$sp$1.apply(SimpleConsumer.scala:148) [kafka_2.10-0.9.0.2.4.3.0-227.jar:?]
at kafka.metrics.KafkaTimer.time(KafkaTimer.scala:33) [kafka_2.10-0.9.0.2.4.3.0-227.jar:?]
at kafka.consumer.SimpleConsumer$$anonfun$fetch$1.apply$mcV$sp(SimpleConsumer.scala:147) [kafka_2.10-0.9.0.2.4.3.0-227.jar:?]
at kafka.consumer.SimpleConsumer$$anonfun$fetch$1.apply(SimpleConsumer.scala:147) [kafka_2.10-0.9.0.2.4.3.0-227.jar:?]
at kafka.consumer.SimpleConsumer$$anonfun$fetch$1.apply(SimpleConsumer.scala:147) [kafka_2.10-0.9.0.2.4.3.0-227.jar:?]
at kafka.metrics.KafkaTimer.time(KafkaTimer.scala:33) [kafka_2.10-0.9.0.2.4.3.0-227.jar:?]
at kafka.consumer.SimpleConsumer.fetch(SimpleConsumer.scala:146) [kafka_2.10-0.9.0.2.4.3.0-227.jar:?]
at kafka.javaapi.consumer.SimpleConsumer.fetch(SimpleConsumer.scala:54) [kafka_2.10-0.9.0.2.4.3.0-227.jar:?]
at storm.kafka.KafkaUtils.fetchMessages(KafkaUtils.java:165) [storm-kafka-0.10.0.2.4.3.0-227.jar:0.10.0.2.4.3.0-227]
at storm.kafka.PartitionManager.fill(PartitionManager.java:170) [storm-kafka-0.10.0.2.4.3.0-227.jar:0.10.0.2.4.3.0-227]
at storm.kafka.PartitionManager.next(PartitionManager.java:132) [storm-kafka-0.10.0.2.4.3.0-227.jar:0.10.0.2.4.3.0-227]
at storm.kafka.KafkaSpout.nextTuple(KafkaSpout.java:144) [storm-kafka-0.10.0.2.4.3.0-227.jar:0.10.0.2.4.3.0-227]
at backtype.storm.daemon.executor$fn__6191$fn__6206$fn__6235.invoke(executor.clj:601) [storm-core-0.10.0.2.4.3.0-227.jar:0.10.0.2.4.3.0-227]
at backtype.storm.util$async_loop$fn__545.invoke(util.clj:479) [storm-core-0.10.0.2.4.3.0-227.jar:0.10.0.2.4.3.0-227]
at clojure.lang.AFn.run(AFn.java:22) [clojure-1.6.0.jar:?]
at java.lang.Thread.run(Thread.java:748) [?:1.8.0_144]