Spark 2.2.1 处理HDFS文件数据源的案例与解读

Spark 2.2.1 处理HDFS文件数据源的案例与解读

上一节讲解了从Sockets获取数据,Spark StreamingContext API还提供了从其他基础数据源创建DStream实例的方法,这里以文件数据源作为例子,对文件流进行处理。

在企业中可引入类似Flume的工具收集数据,企业从各种数据源获取数据,存入某个文件存储系统(一般使用HDFS)。例如将从Flume数据源收集来的日志文件,存入HDFS文件系统。Spark Streaming通过监控某一目录下的新建文件的方法,使用文件流的方式去处理。

本案例以手动构建文件,并移入监控目录来简化外部数据源存入该目录;在IDEA中运行应用程序,Spark Streaming使用Local本地方式运行,这种方式下,可以方便代码的调试。具体代码如下:

HdfsWordCount.scala的源代码:

1.      

   package stream

2.         import org.apache.spark.SparkConf

3.         import org.apache.spark.examples.streaming.StreamingExamples

4.         import org.apache.spark.streaming.{Seconds, StreamingContext}

5.         object HdfsWordCount {

6.           def main(args: Array[String]) {

7.             if (args.length < 1) {

8.               System.err.println("Usage:HdfsWordCount ")

9.               // System.exit(1)

10.          }

11.          importorg.apache.log4j.{Level, Logger}

12.          Logger.getLogger("org.apache.spark").setLevel(Level.ALL)

13.          //StreamingExamples.setStreamingLogLevels()

14.          val sparkConf = newSparkConf().setAppName("HdfsWordCount").setMaster("local[2]")

15.          // Create the context

16.          val ssc = newStreamingContext(sparkConf, Seconds(60))

17.       

18.       

19.          // Create the FileInputDStreamon the directory and use the

20.          // stream to count words innew files created

21.       

22.          val lines =ssc.textFileStream(args(0))

23.          val words = lines.flatMap(_.split(""))

24.          val wordCounts = words.map(x=> (x, 1)).reduceByKey(_ + _)

25.       

26.          wordCounts.print()

27.          ssc.start()

28.          ssc.awaitTermination()

29.        }

30.      }

31.       

 

打开IDEA配置Run的窗口,如图4-30所示。

Spark 2.2.1 处理HDFS文件数据源的案例与解读_第1张图片

图 4 - 30 IDEA的应用的run配置

         进入Run配置的编辑界面,如图4-31所示。

Spark 2.2.1 处理HDFS文件数据源的案例与解读_第2张图片

图 4 - 31 IDEA的应用的run配置的编辑菜单

输入具体配置信息,如图4-32所示。

Spark 2.2.1 处理HDFS文件数据源的案例与解读_第3张图片

图 4 - 32 IDEA的应用的run配置的编辑界面

其中,Program arguments是需监控的目录路径,这里设置为本地文件系统下的监控目录:"E:/MonitorDirectory/"。由于不是集群模式提交,因此Mainclass可以设置为当前的应用类,需要使用类的全路径。

单击窗口的Run按钮,启动流处理。然后,手动将文件添加到监控目录下。

注意:

  • 监控目录下的文件应该有一样的数据格式,避免在内部分析时报错;
  • 文件必须是在监控目录下创建,可以通过原子性的移动或重命名操作,放入目录;
  • 一旦移入目录,文件就不能再修改了,如果文件是持续写入的话,新的数据是无法读取的。
  • 为方便观察日志,时间间隔可以从1秒调整为60秒。日志记录级别调整为Level.ALL
  • 案例中,必须在Spark Streaming启动后在监控目录里面新建一个文件,或者将新建文件复制到这个目录,文件创建时间如果比Spark Streaming启动时间早的文件,在Spark Streaming扫描文件目录时不会被Spark Streaming处理。如图4-33所示。

图 4 - 33  Spark Streaming读入新建文件

查看日志,E:/MonitorDirectory/kv.txt新建文件被Spark Streaming处理,而E:/MonitorDirectory/kv_old_file.txt文件由于文件的时间戳早于Spark Streaming的时间戳,因此此文件被忽略,不做处理。

18/02/23 15:08:00 DEBUG FileInputDStream: Time1519369680000 ms is valid

18/02/23 15:08:00 DEBUG FileInputDStream: Getting newfiles for time 1519369680000, ignoring files older than 1519369620000

18/02/23 15:08:00 DEBUG FileInputDStream:file:/E:/MonitorDirectory/kv.txt accepted with mod time 1519369672606

18/02/23 15:08:00 DEBUG FileInputDStream:file:/E:/MonitorDirectory/kv_old_file.txt ignored as mod time 1511558919000<= ignore time 1519369620000

18/02/23 15:08:00 INFO FileInputDStream: Finding newfiles took 12 ms

18/02/23 15:08:00 DEBUG FileInputDStream: # cached filetimes = 2

18/02/23 15:08:00 INFO FileInputDStream: New files attime 1519369680000 ms:

file:/E:/MonitorDirectory/kv.txt

 

此新建kv.txt文件的内容格式为2列,第1列是随机数,第2列在随机数前加上“val_”的前缀,部分记录如下:

238 val_238

86 val_86

311 val_311

27 val_27

165 val_165

409 val_409

255 val_255

…….

 

由于没有安装HDFS,默认的是本地文件系统,不需要添加file://的scheme信息。对应在HDFS系统上时,可以增加”hdfs://”的scheme信息。

 

                   在IDEA中本地运行HdfsWordCount.scala代码,结果如下。

Using Spark's default log4j profile:org/apache/spark/log4j-defaults.properties

18/02/23 14:50:48 INFO SparkContext:Running Spark version 2.2.1

……

18/02/23 15:08:00 DEBUG ShuffledDStream: Clearingreferences to old RDDs: [1519369620000 ms -> 4]

18/02/23 15:08:00 DEBUG ShuffledDStream: Unpersisting oldRDDs: 4

-------------------------------------------

Time: 1519369680000 ms

-------------------------------------------

(273,3)

(419,1)

(282,2)

(82,1)

(val_457,1)

(val_150,1)

(332,1)

(345,1)

(val_24,2)

(val_345,1)

...

 

在企业级的实时流处理中往往会引入Kafka,作为分布式消息系统,以及Flume作为各种数据的收集系统。下面分别给出SparkStreaming整合Kafka的案例,以及整合Flume的案例。

 

2018年新春报喜!热烈祝贺王家林大咖大数据经典传奇著作《SPARK大数据商业实战三部曲》畅销书籍 清华大学出版社发行上市!


本书基于Spark 2.2.0最新版本(2017年7月11日发布),以Spark商业案例实战和Spark在生产环境下几乎所有类型的性能调优为核心,以Spark内核解密为基石,分为上篇、中篇、下篇,对企业生产环境下的Spark商业案例与性能调优抽丝剥茧地进行剖析。上篇基于Spark源码,从一个动手实战案例入手,循序渐进地全面解析了Spark 2.2新特性及Spark内核源码;中篇选取Spark开发中最具有代表的经典学习案例,深入浅出地介绍,在案例中综合应用Spark的大数据技术;下篇性能调优内容基本完全覆盖了Spark在生产环境下的所有调优技术。


本书适合所有Spark学习者和从业人员使用。对于有分布式计算框架应用经验的人员,本书也可以作为Spark高手修炼的参考书籍。同时,本书也特别适合作为高等院校的大数据教材使用。

当当网、京东、淘宝、亚马逊等网店已可购买!欢迎大家购买学习!

当当网址: http://product.dangdang.com/25230552.html

 

 

 

 

 

 

你可能感兴趣的:(AI,&,Big,Data案例实战课程)