1. 概述
本文描述的是 spark 学习的第三阶段知识点,主要目的是实现 spark streaming + flume + log4j 以 pull 模式进行实时统计,在<Spark 阶段总结 2 > (下文简称<2>)中,实现的是 push 模式。由于大部分工作都比较类似,因此本文主要是介绍差别。
2. 相同点
虚拟机环境、log4jTest都和 <2> 完全一样,在此不赘述。
3. Flume 配置
3.1 配置文件pull.conf
agent.sources=s1
agent.channels=c1
agent.sinks=k1
agent.sources.s1.type=exec
agent.sources.s1.channels=c1
agent.sources.s1.command= tail -F /mnt/hgfs/share/spark_dir/data/log4j.log
agent.channels.c1.type=file
agent.channels.c1.capacity=10000
agent.channels.c1.transactionCapacity=10000
agent.sinks.k1.type=org.apache.spark.streaming.flume.sink.SparkSink
agent.sinks.k1.hostname=localhost
agent.sinks.k1.port=11114
agent.sinks.k1.channel=c1
值得注意的修改点: k1.type、c1.capacity 和c1.transactionCapacity。
3.2 说明
为了使用 org.apache.spark.streaming.flume.sink.SparkSink,需要把相关jar 拷贝到$FLUME_HOME/lib 中,具体好像是scala-library-2.11.7.jar 和 spark-streaming-flume-sink_2.11-1.6.0.jar。
4. FlumeTest
4.1 代码 FlumeTest.scala
package com.leon
import org.apache.spark.streaming.flume._
import org.apache.spark.streaming.StreamingContext
import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.streaming.Seconds
import org.apache.spark.storage.StorageLevel
object FlumeTest {
def main(args: Array[String]) {
if (args.length < 2) {
print("please enter host and port")
System.exit(1)
}
val sc = new SparkConf().setAppName("FlumeEventCount")
//创建StreamingContext,20秒一个批次
val ssc = new StreamingContext(sc, Seconds(20))
val hostname = args(0)
val port = args(1).toInt
val storageLevel = StorageLevel.MEMORY_ONLY
println(hostname + " " +port)
val flumeStream = FlumeUtils.createPollingStream(ssc,hostname, port, storageLevel)
flumeStream.count().map(cnt => "Received " + cnt + " flume events." ).print()
flumeStream.count().saveAsTextFiles("./flume-spark-demo/")
//flumeStream.print()
//flumeStream.saveAsTextFiles("file://mnt/hgfs/share/spark_dir/flumeStream")
//开始运行
ssc.start()
//计算完毕退出
ssc.awaitTermination()
}
}
4.2区别
第28行的:val flumeStream = FlumeUtils.createPollingStream(ssc, hostname, port, storageLevel) 。