1. Push 方式(flume 主动)
Flume 将消息推送到 SparkStreaming 中 worker 的 executor 处理,但是其缺点是 flume 只能指定一个executor 来处理,这样会给单个节点中executor造成很大的压力,故不推荐该方式。
部分实例代码
//推送方式: flume向spark(spark 地址一个,具体来说启动的是spark集群中某个work的地址)发送数据 val flumeStream = FlumeUtils.createStream(ssc, "192.168.2.2", 8888)
注意:192.168.2.2 是spark集群中某个worker地址,这个造成该方式的缺点。
2. Poll 方式(sparkStreaming 主动)
Spark Streaming 会从Flume中 拉取数据,可以指定多个flume地址。但是其处理该数据的worker可以指定多个,可以设置为默认值,故不会出现单个executor处理数据压力很大的情况。
部分实例代码
//从flume中拉取数据(flume的地址,可以多个) val address = Seq(new InetSocketAddress("192.168.2.181", 8888)) val flumeStream = FlumeUtils.createPollingStream(ssc, address, StorageLevel.MEMORY_AND_DISK) val words = flumeStream.flatMap(x => new String(x.event.getBody().array()).split(" ")).map((_,1)) val results = words.updateStateByKey(updateFunc, new HashPartitioner(ssc.sparkContext.defaultParallelism), true)
3、总结
推荐使用 poll方式!