12.30

实验7

Spark初级编程实践

 

1.实验目的

1)掌握使用Spark访问本地文件和HDFS文件的方法

2掌握Spark应用程序的编写、编译和运行方法

2.实验平台

1操作系统:Ubuntu18.04(或Ubuntu16.04

2Spark版本:2.4.0

3Hadoop版本:3.1.3

3.实验步骤

1Spark读取文件系统的数据

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编写独立应用程序实现数据去重

对于两个输入文件AB,编写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

根据输入的文件AB合并得到的输出文件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”。

posted @ 2024-12-30 23:06  混沌武士丞  阅读(26)  评论(0)    收藏  举报