文章地址:http://www.haha174.top/article/details/259720
基于hdfs 文件的实时计算,其实就是监控一个hdfs 目录,只要其中有新文件出现,就实时处理。相当于处理实时的文件流。
spark Streaming 会监视指定的hdfs 目录,并且 处理出现再目录底下的文件,要注意的是所有放入到hdfs 目录中的文件都必须有相同的格式,必须使用移动或者重命名的方式将文件一如目录:一旦处理之后文件的内容即便改变了也不会处理了。
基于h’d’f’s 的数据源没有Receiver 因此不会占用一个cpu core 。
下面给出java 示例:
public class HDFSWorldCount {
public static void main(String[] args) throws InterruptedException {
SparkConf conf=new SparkConf().setAppName("HDFSWorldCount").setMaster("local[2]");
JavaStreamingContext jssc=new JavaStreamingContext(conf, Durations.seconds(5));
JavaDStream<String> lines=jssc.textFileStream("hdfs://192.168.1.26:8020/study/spark/streaming");
JavaDStream<String> lineFlat= lines.flatMap(new FlatMapFunction<String, String>() {
@Override
public Iterator<String> call(String s) throws Exception {
return Arrays.asList(s.split(" ")).iterator();
}
});
JavaPairDStream<String,Integer> linePair=lineFlat.mapToPair(new PairFunction<String, String, Integer>() {
@Override
public Tuple2<String, Integer> call(String s) throws Exception {
return new Tuple2<String, Integer>(s,1);
}
});
JavaPairDStream<String,Integer> lineWorldCount=linePair.reduceByKey(new Function2<Integer, Integer, Integer>() {
@Override
public Integer call(Integer v1, Integer v2) throws Exception {
return v1+v2;
}
});
lineWorldCount.print();
jssc.start();
jssc.awaitTermination();
jssc.stop();
}
}
下面给出scala 示例
object HdfsWorldCount {
def main(args: Array[String]): Unit = {
val conf = new SparkConf().setAppName("HDFSWorldCount").setMaster("local[2]")
val jssc = new StreamingContext(conf, Durations.seconds(5))
val lines = jssc.textFileStream("hdfs://192.168.1.26:8020/study/spark/streaming")
val counts = lines.flatMap(line => line.split(" ")) .map(word => (word, 1))
.reduceByKey(_ + _)
counts.print()
jssc.start()
jssc.awaitTermination()
jssc.stop()
}
}