Spark submit案例

本文介绍了一个使用Apache Spark进行词频统计和行单词数分析的项目。通过Scala脚本,我们实现了从HDFS读取数据,进行词频统计,并将结果保存回HDFS的功能。此外,还展示了如何统计包含特定关键词的行数及其平均单词数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

准备文件及脚本层级

build用于存放scala编译后的类,src用于存放scala源码
compilescala.sh是编译命令,run_wordcount.sh是以spark submit形式向集群提交任务命令

$ ls
build  compilescala.sh  run_wordcount.sh  src

scala源码

task1:词频统计
$ cat ./src/wordcount.scala 
import org.apache.spark.SparkContext
import org.apache.spark.SparkContext._
import org.apache.spark.SparkConf

object wordcount{
    val conf = new SparkConf().setAppName("WordCount")
    val sc = new SparkContext(conf)
   
    def main(args:Array[String]){
        val inputpath = args(0)
        val outputpath = args(1)
        val textFile = sc.textFile(inputpath)

        val wordCounts = textFile.flatMap(line => line.split(" "))
        .map(word => (word,1)).reduceByKey((a,b) => a+b).collect()  //词频统计
        sc.parallelize(wordCounts).repartition(2).saveAsTextFile(outputpath)   //生成2个hdfs part

        sc.stop()
}
}
$ cat compilescala.sh 
rm -rf build/classes/*
scalac -d build/classes -cp /usr/bin/hadoop/software/spark/lib/spark-assembly-1.6.0-U22-hadoop2.7.2U6.jar src/wordcount.scala
jar -cvf build/wordcount.jar -C build/classes .

#spark-submit --class click_diary build/click_diary.jar --master local[4]


$ ./compilescala.sh 
已添加清单
正在添加: wordcount$$anonfun$2.class(输入 = 1325) (输出 = 644)(压缩了 51%)
正在添加: wordcount$$anonfun$3.class(输入 = 1215) (输出 = 609)(压缩了 49%)
正在添加: wordcount$$anonfun$1.class(输入 = 1054) (输出 = 599)(压缩了 43%)
正在添加: wordcount$.class(输入 = 3186) (输出 = 1422)(压缩了 55%)
正在添加: wordcount.class(输入 = 1029) (输出 = 744)(压缩了 27%)

数据文件上传到hdfs集群inputpath目录下

$ cat run_wordcount.sh 
inputpath="/home/users/Spark/test/README.md"
outputpath="/home/users/Spark/test/wordcount/"

hadoop fs -rmr ${outputpath}

spark-submit \
--conf spark.storage.memoryFraction=0.6 \
--conf spark.kryoserializer.buffer.max=512m \
--conf spark.kryoserializer.buffer=64m \
--class "wordcount" \
--driver-memory 6g \
--num-executors 10 \
--executor-cores 2 \
--executor-memory 6g \
--master yarn-client \
--priority HIGH \
build/wordcount.jar \
${inputpath} \
${outputpath}

$./run_wordcount.sh 

在这里插入图片描述

task2:统计每行单词数
$ cat ./src/wordcount.scala 
import org.apache.spark.SparkContext
import org.apache.spark.SparkContext._
import org.apache.spark.SparkConf
import java.lang.Math

object wordcount{
    val conf = new SparkConf().setAppName("WordCount")
    val sc = new SparkContext(conf)
   
    def main(args:Array[String]){
        val inputpath = args(0)
        val outputpath = args(1)
        val textFile = sc.textFile(inputpath)

        //val cnt = textFile.count()
        //val fir = textFile.first()
        //Spark可以将数据集存放在集群中的缓存中,在数据集经常被访问的场景下很有用,如PageRank这样的需要迭代很多次的算法。
        var linesWithSpark = textFile.filter(line => line.contains("Spark")).cache()   //有多少行包含Spark
        var size = linesWithSpark.map(line => line.split(" ").size)   //每行包含多少词 
        //var maxsize = size.reduce((a,b) => if (a>b) a else b)   //查看单词最多的行有多少词
        var maxsize0 = size.reduce((a,b) => Math.max(a,b))
        println(maxsize0)
        val select = linesWithSpark.count()
        println(select)
       
        //linesWithSpark.saveAsTextFile(outputpath)
        size.saveAsTextFile(outputpath)
        sc.stop()
}
}

在这里插入图片描述

### 配置和提交Spark作业于IntelliJ IDEA #### 创建项目并设置依赖项 为了在IntelliJ IDEA中配置和运行Apache Spark应用程序,首先需要创建一个新的Scala项目。接着,在项目的`build.sbt`文件里添加必要的库依赖来支持Spark应用开发[^2]。 ```scala libraryDependencies += "org.apache.spark" %% "spark-core" % "1.6.0" libraryDependencies += "org.apache.spark" %% "spark-sql" % "1.6.0" ``` 上述代码片段展示了如何向构建脚本添加两个主要的Spark组件——核心模块以及SQL处理能力的支持。 #### 设置环境变量 确保已正确设置了SPARK_HOME环境变量指向本地安装好的Spark版本路径,并且将%SPARK_HOME%\bin加入到系统的PATH环境中去。这一步骤对于能够顺利启动Spark上下文至关重要[^1]。 #### 编写简单的Word Count程序作为测试案例 下面给出了一段用于验证集群是否正常工作的简单例子: ```scala import org.apache.spark.{SparkConf, SparkContext} object WordCount { def main(args: Array[String]): Unit = { val conf = new SparkConf().setAppName("word count").setMaster("local[*]") val sc = new SparkContext(conf) val textFile = sc.textFile("README.md") val counts = textFile.flatMap(line => line.split(" ")) .map(word => (word, 1)) .reduceByKey(_ + _) println(counts.collect().mkString("\n")) sc.stop() } } ``` 这段代码实现了基本的文字计数逻辑,通过读取指定文档的内容来进行单词频率统计操作[^3]。 #### 提交任务至远程YARN集群执行 当准备就绪之后,可以通过命令行工具或者直接利用IDEA内置终端输入如下指令完成分布式计算工作负载分发: ```bash spark-submit --class com.example.WordCount \ --master yarn-cluster \ target/scala-2.11/simple-project_2.11-1.0.jar ``` 此命令假设打包后的JAR包位于目标目录下,并指定了入口类的位置以便于框架识别要加载的应用实例。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值