12.30
实验7
Spark初级编程实践
1.实验目的
(1)掌握使用Spark访问本地文件和HDFS文件的方法
(2)掌握Spark应用程序的编写、编译和运行方法
2.实验平台
(1)操作系统:Ubuntu18.04(或Ubuntu16.04);
(2)Spark版本:2.4.0;
(3)Hadoop版本:3.1.3。
3.实验步骤
(1)Spark读取文件系统的数据
(1)在spark-shell中读取Linux系统本地文件“/home/hadoop/test.txt”,然后统计出文件的行数;
val hdfsFile = sc.textFile("/user/hadoop/test.txt") val lineCount = hdfsFile.count() println(s"Line count: $lineCount")
(2)在spark-shell中读取HDFS系统文件“/user/hadoop/test.txt”(如果该文件不存在,请先创建),然后,统计出文件的行数;
val hdfsFile = sc.textFile("/user/hadoop/test.txt") val lineCount = hdfsFile.count() println(s"Line count: $lineCount")
(3)编写独立应用程序(推荐使用Scala语言),读取HDFS系统文件“/user/hadoop/test.txt”(如果该文件不存在,请先创建),然后,统计出文件的行数;通过sbt工具将整个应用程序编译打包成 JAR包,并将生成的JAR包通过 spark-submit 提交到 Spark 中运行命令。
import org.apache.spark.{SparkConf, SparkContext} object LineCounter { def main(args: Array[String]): Unit = { val conf = new SparkConf().setAppName("LineCounter").setMaster("local") val sc = new SparkContext(conf) // 读取HDFS文件 val hdfsFilePath = "/user/hadoop/test.txt" val lines = sc.textFile(hdfsFilePath) // 统计行数 val lineCount = lines.count() println(s"Total number of lines in the file: $lineCount") sc.stop() } }
(2)编写独立应用程序实现数据去重
对于两个输入文件A和B,编写Spark独立应用程序(推荐使用Scala语言),对两个文件进行合并,并剔除其中重复的内容,得到一个新文件C。下面是输入文件和输出文件的一个样例,供参考。
输入文件A的样例如下:
20170101 x
20170102 y
20170103 x
20170104 y
20170105 z
20170106 z
输入文件B的样例如下:
20170101 y
20170102 y
20170103 x
20170104 z
20170105 y
根据输入的文件A和B合并得到的输出文件C的样例如下:
20170101 x
20170101 y
20170102 y
20170103 x
20170104 y
20170104 z
20170105 y
20170105 z
20170106 z
import org.apache.spark.{SparkConf, SparkContext} object DataDeduplication { def main(args: Array[String]): Unit = { val conf = new SparkConf().setAppName("DataDeduplication").setMaster("local") val sc = new SparkContext(conf) // 读取两个输入文件 val fileA = sc.textFile("path/to/fileA.txt") val fileB = sc.textFile("path/to/fileB.txt") // 合并两个RDD,并去除重复行 val combined = fileA.union(fileB).distinct() // 将结果保存到新的文件 combined.saveAsTextFile("path/to/outputFileC.txt") sc.stop() } }
(3)编写独立应用程序实现求平均值问题
每个输入文件表示班级学生某个学科的成绩,每行内容由两个字段组成,第一个是学生名字,第二个是学生的成绩;编写Spark独立应用程序求出所有学生的平均成绩,并输出到一个新文件中。下面是输入文件和输出文件的一个样例,供参考。
Algorithm成绩:
小明 92
小红 87
小新 82
小丽 90
Database成绩:
小明 95
小红 81
小新 89
小丽 85
Python成绩:
小明 82
小红 83
小新 94
小丽 91
平均成绩如下:
(小红,83.67)
(小新,88.33)
(小明,89.67)
(小丽,88.67)
import org.apache.spark.{SparkConf, SparkContext} import org.apache.spark.rdd.RDD object AverageScores { def main(args: Array[String]): Unit = { val conf = new SparkConf().setAppName("AverageScores").setMaster("local") val sc = new SparkContext(conf) // 假设所有的成绩文件已经被合并成一个文件 val scores = sc.textFile("path/to/scores.txt") // 解析成绩文件 val parsedScores = scores.map { line => val fields = line.split("\\s+") (fields(0), fields(1).toDouble) } // 计算每个学生的总分和课程数量 val studentTotalsAndCounts = parsedScores.aggregateByKey((0.0, 0))( (acc, value) => (acc._1 + value, acc._2 + 1), (acc1, acc2) => (acc1._1 + acc2._1, acc1._2 + acc2._2) ) // 计算平均分 val averages = studentTotalsAndCounts.mapValues { case (total, count) => total / count } // 将结果保存到新文件 averages.saveAsTextFile("path/to/averageScores.txt") sc.stop() } }
4.实验报告
|
题目: |
实验7
Spark初级编程实践 |
姓名 |
胡铁丞 |
日期 2024-12-16日 |
|
实验环境:(1)操作系统:Linux;
(2)Hadoop版本:3.1.0。
(3)虚拟机:VMware。
(4)工具:xshell。
(5)JDK版本:1.8;
(6)Java IDE:IDEA。
(7)Spark:2.4.0
(8)Scala:2.12.18 |
||||
|
实验内容与完成情况: |
||||
|
出现的问题:(1) ./sbt sbtVersion无法正常运行,加载不出结果
(2)将生成的 JAR 包通过 spark-submit 提交到 Spark 中运行命令,无法实现 |
||||
|
解决方案(列出遇到的问题和解决办法,列出没有解决的问题): 网络问题:./sbt 首次运行时会下载所需的依赖项。如果你的网络连接不稳定或被防火墙阻止,可能会导致初始化失败。请确保你有稳定的互联网连接,并且没有防火墙或代理服务器阻止 Sbt 下载必要的资源。 如果你的应用程序依赖于外部库,确保这些库已经被打包进 JAR 文件中,或者通过 --jars 参数显式地提供它们。你可以使用 sbt-assembly 插件来创建一个包含所有依赖的“fat JAR”。 |
||||
浙公网安备 33010602011771号