Flume推送数据给streaming其实是配置
把数据推送给端口,streaming直接去读端口。
Flume的安装:
1.配置系统环境变量
2.配置flume的conf文件,里面有agent,channel,sink
3.可以在spark-env中配置java_home 和java_opts
关于数据采集flume和kafka选择的理由?
数据大规模或者持续产生时采用kafka
数据量不稳定时用flume
其他的
rocketMQ
Zeromq
Activemq
Flume 用push的方式给streaming注意的问题?
1.可能streaming无法及时处理,导致崩溃。
解决办法:限速。但是可能会导致port崩溃
2.先启动streaming,在启动flume
3.综上所述的问题,最好的办法仍然是使用flume+kafka的配合。
Streaming一直产生rdd,rdd是对象,内存撑爆怎么办(重要)?
1.每次触发作用都会触发一个消息给消息循环体,消息循环清理rdd
2.发现状态报错,会checkpoint,此时由内存转为磁盘。
代码实现:
SparkConf conf = new SparkConf().setMaster("local[4]").setAppName("FlumePushDate2SparkStreaming");
JavaStreamingContext jsc = new JavaStreamingContext(conf, Durations.seconds(30));
JavaReceiverInputDStream lines = FlumeUtils.createStream(jsc,"Master", 9999);
/*
* 第四步:接下来就像对于RDD编程一样基于DStream进行编程!!!原因是DStream是RDD产生的模板(或者说类),在Spark Streaming具体
* 发生计算前,其实质是把每个Batch的DStream的操作翻译成为对RDD的操作!!!
*对初始的DStream进行Transformation级别的处理,例如map、filter等高阶函数等的编程,来进行具体的数据计算
* 第4.1步:讲每一行的字符串拆分成单个的单词
*/
JavaDStream<String> words = lines.flatMap(new FlatMapFunction<SparkFlumeEvent, String>() { //如果是Scala,由于SAM转换,所以可以写成val words = lines.flatMap { line => line.split(" ")}
@Override
public Iterable<String> call(SparkFlumeEvent event) throws Exception {
String line = new String(event.event().getBody().array());
return Arrays.asList(line.split(" "));
}
});