1、编辑需要运行的spark代码
最好是在linux环境的spark-shell,测试成功
package cn.edu.swpu.scs
import org.apache.spark.{SparkConf, SparkContext}
object App {
def main(args: Array[String]){
val sparkConf = new SparkConf()
val sc = new SparkContext(sparkConf)
val rdd = sc.textFile("hdfs://node1:9000/lab2")
/**
* 统计各咖啡商品的销售额,按金额降序排列后保存
*/
//将Online Retail.txt按行读取至RDD
val rdd1 = rdd.map(x=>x.split("\t")) //按照\t切分为数据
.filter(x=>x(2).matches(".*COFFEE.*")) //正则表达式匹配
.map(x=>(x(1)->x(5).toDouble)).groupByKey() //将字符数组转化为key-value,并将value.toDouble
.map(x=>(x._1,x._2.sum)).sortBy(x=>x._2,false) //对数据销售额求和,降序排列
.saveAsTextFile("hdfs://node1:9000/OutputLab2_1") //持久化
val rdd4= rdd.map(x=>x.split("\t")).map(x=>(x(6)->x(5).toDouble))
/**
* 统计各顾客的总消费金额,按金额降序排列后保存
*/
val rdd2 = rdd4.groupByKey().map(x=>(x._1,x._2.sum))
.sortBy(x=>x._2,false)
.saveAsTextFile("hdfs://node1:9000/OutputLab2_2")
/**
* 统计各顾客最贵订单的金额,按金额降序排列后保存
*/
val rdd3 = rdd4.groupByKey().map(x=>(x._1,x._2.max))
.sortBy(x=>x._2,false)
.saveAsTextFile("hdfs://node1:9000//OutputLab2_3")
}
}
2、编译
在主类中点击右键,选择“Recompile …”编译项目;
也可运行build --> recompile执行编译。
下面放一个我编译遇见的错误
3、打包jar包
执行:File --> Project Structure --> Project Settings --> Artifacts --> + --> JAR --> Empty
添加成功编译的class文件
注意要实现编译,才有此class文件,没编译或编译失败都无此文件
执行Build --> Build Artifacts,
完成后,在项目的out目录中可找到创建的JAR包,如下图:
4、执行jar包
将程序打包好的jar包上传至linux中(采用PuTTY 或者 Xftp都可以)
若需读取HDFS数据,则要先启动HDFS并将数据传上去
在linux中提交JAR包,输入spark-submit命令即可,具体的命令格式为:
spark-submit --class cn.edu.swpu.scs.App
--master yarn \
--deploy-mode cluster\
~/SparkTest.jar
注:
① \ 是Linux命令换行符,命令太长的情况可输入 \ 换下一行输入后续命令
② --是spark-submit的参数符号,后跟spark-submit命令参数
参数解释:
① class 主类包名和类名,请自行替换为jar包中实际的包名和类名
② master 程序提交模式,参数取值:local 本地模式(单线程);local[*] 本地模式(最大线程数量);local[n] 本地模式(执行线程数量);spark://node1:7077 Standalone模式,请自行替换为实际的Master地址;yarn YARN模式;若不指定该参数,缺省值为local[*]
③ deploy-mode 指定集群模式,参数取值:client(缺省值),cluster;当master设置为Standalone模式或YARN模式又需要使用cluster模式时可配置该参数
④ 也可以在这里配置其他的spark-conf参数
成功运行
记录一个提交过程的错误