分享

about云日志分析项目准备10-4:将Spark Streaming程序运行在Spark集群上

Oner 发表于 2017-3-5 23:46:31 [显示全部楼层] 只看大图 回帖奖励 阅读模式 关闭右栏 0 3219
本帖最后由 Oner 于 2017-3-5 23:46 编辑
接上篇 about云日志分析项目准备10-2:Windows Intellij idea配置scala开发环境

这篇我们讲解如何将 Spark Streaming程序打包放在集群中运行。
一、编写程序

1. 程序位置

之前我们在aboutyun_log_analysis/src/test/scala目录下创建了一个 Streaming.scala 文件,这次我们需要在 aboutyun_log_analysis/src/main/scala 目录下创建一个 Streaming.scala 文件。

2. 代码

  1. import org.apache.spark.SparkConf
  2. import org.apache.spark.streaming.{Seconds, StreamingContext}

  3. /**
  4.   * Created by wangwei01 on 2017/2/3.
  5.   */
  6. object StreamingDemo {
  7.   def main(args: Array[String]): Unit = {
  8.     // 创建SparkConf对象
  9.     val conf = new SparkConf()
  10. //      .setAppName("StreamingDemo")
  11. //      .setMaster("local[*]")

  12.     // 创建StreamingContext对象
  13.     val ssc = new StreamingContext(conf, Seconds(10))

  14.     val hostname = "192.168.1.10" // 即我们的master虚拟机
  15.     val port = 9999 // 端口号

  16.     // 创建DStream对象
  17.     val lines = ssc.socketTextStream(hostname, port)
  18.     val words = lines.flatMap(_.split(" "))
  19.     val wordCounts = words.map(x => (x, 1)).reduceByKey(_ + _)

  20.     wordCounts.foreachRDD(rdd => println(rdd))
  21.     wordCounts.print()

  22.     ssc.start()
  23.     ssc.awaitTermination()

  24.   }
  25. }
复制代码

在这里,我们没有通过 SparkConf 来指定AppName和Master,因为我们需要在使用 spark-submit 命令提交时指定。
二、Idea 代码打包

1. 打开 Artifact

File -》 Project  Structure -》 Artifact -》 + -》 JAR -》 From module with dependencies
20170219201819.jpg
20170219202116.jpg

2. 选择一个Module,之后再选择一个主类。
20170219202431.jpg

3. 选择要打包的依赖。


这儿使用全量打包
20170219203817.jpg


4. 编译
Build -》 Build Artifact -》 项目名称 -》Build
20170219203922.jpg

20170219204102.jpg



三、上传jar包

打包完成后,生成的jar包目录会存放在 /aboutyun_log_analysis/out/artifacts/aboutyun_log_analysis_jar中,名称为aboutyun_log_analysis.jar。
将该jar包上传到 spark集群的master节点上。

四、提交应用

使用 spark-submit 命令提交spark应用。提交时,spark-submit必至少提供--master和--name参数,这两个参数分别用来设置spark应用的运行模式和名称。

首先在一个端口中输入下面命令:
  1. nc -lk 9999
复制代码

然后使用spark-submit来提交应用,先以本地模式运行。
  1. spark-submit --master local[4] --name demo_local aboutyun_log_analysis.jar
复制代码

这里我们启动了4个进程来运行 spark streaming 程序。
输入完命令我们会发现报错了:
Exception in thread "main" java.lang.SecurityException: Invalid signature file digest for Manifest main attributes
QQ截图20170305232655.jpg

这是因为jar包里有一些类冲突,所有生成了一些SF、RSA文件,我们需要使用zip命令来删除。

  1. zip -d aboutyun_log_analysis.jar 'META-INF/.SF' 'META-INF/.RSA' 'META-INF/*SF'
  2. spark-submit --master local[4] --name demo_loacl aboutyun_log_analysis.jar
复制代码

做完上面的操作,我们会发现程序可以正常跑起来了。而且每隔十分钟,屏幕中都会打印出类似下面的日志: QQ截图20170305233049.jpg

由于我们没有在启动 nc 的终端上输入任何单词,所以这儿打印的内容为空。我们可以尝试输入一些单词。
QQ截图20170305233540.jpg

然后在启动spark streaming 的终端上可以看到如下输出:
QQ截图20170305233529.jpg
注意:
以本地模式运行时,不能指定单个进程,因为spark streaming 接收器就需要占用一个进程,如果只启动一个进程的话,spark streaming会接收传来的数据,但是没有进程可以去处理这些接收到的数据,所以这些数据会被丢弃掉。

现在以standalone集群模式来运行程序。
  1. spark-submit --master spark://master:7077 --name demo_standalone aboutyun_log_analysis.jar
复制代码

启动之后,屏幕最后会一直输出 scheduler.JobScheduler: Added jobs for time *** ms,但是得不到任何结果。
QQ截图20170305234100.jpg

这个问题待解决。



没找到任何评论,期待你打破沉寂

关闭

推荐上一条 /2 下一条