本帖最后由 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. 代码
- import org.apache.spark.SparkConf
- import org.apache.spark.streaming.{Seconds, StreamingContext}
- /**
- * Created by wangwei01 on 2017/2/3.
- */
- object StreamingDemo {
- def main(args: Array[String]): Unit = {
- // 创建SparkConf对象
- val conf = new SparkConf()
- // .setAppName("StreamingDemo")
- // .setMaster("local[*]")
- // 创建StreamingContext对象
- val ssc = new StreamingContext(conf, Seconds(10))
- val hostname = "192.168.1.10" // 即我们的master虚拟机
- val port = 9999 // 端口号
- // 创建DStream对象
- val lines = ssc.socketTextStream(hostname, port)
- val words = lines.flatMap(_.split(" "))
- val wordCounts = words.map(x => (x, 1)).reduceByKey(_ + _)
- wordCounts.foreachRDD(rdd => println(rdd))
- wordCounts.print()
- ssc.start()
- ssc.awaitTermination()
- }
- }
复制代码
在这里,我们没有通过 SparkConf 来指定AppName和Master,因为我们需要在使用 spark-submit 命令提交时指定。
二、Idea 代码打包
1. 打开 Artifact
File -》 Project Structure -》 Artifact -》 + -》 JAR -》 From module with dependencies
2. 选择一个Module,之后再选择一个主类。
3. 选择要打包的依赖。
这儿使用全量打包
4. 编译
Build -》 Build Artifact -》 项目名称 -》Build
三、上传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应用的运行模式和名称。
首先在一个端口中输入下面命令:
然后使用spark-submit来提交应用,先以本地模式运行。
- 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
这是因为jar包里有一些类冲突,所有生成了一些SF、RSA文件,我们需要使用zip命令来删除。
- zip -d aboutyun_log_analysis.jar 'META-INF/.SF' 'META-INF/.RSA' 'META-INF/*SF'
- spark-submit --master local[4] --name demo_loacl aboutyun_log_analysis.jar
复制代码
做完上面的操作,我们会发现程序可以正常跑起来了。而且每隔十分钟,屏幕中都会打印出类似下面的日志:
由于我们没有在启动 nc 的终端上输入任何单词,所以这儿打印的内容为空。我们可以尝试输入一些单词。
然后在启动spark streaming 的终端上可以看到如下输出:
注意:
以本地模式运行时,不能指定单个进程,因为spark streaming 接收器就需要占用一个进程,如果只启动一个进程的话,spark streaming会接收传来的数据,但是没有进程可以去处理这些接收到的数据,所以这些数据会被丢弃掉。
现在以standalone集群模式来运行程序。
- spark-submit --master spark://master:7077 --name demo_standalone aboutyun_log_analysis.jar
复制代码
启动之后,屏幕最后会一直输出 scheduler.JobScheduler: Added jobs for time *** ms,但是得不到任何结果。
这个问题待解决。
|