12月12日总结

实验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”,然后统计出文件的行数;
(2)在spark-shell中读取HDFS系统文件“/user/hadoop/test.txt”(如果该文件不存在,请先创建),然后,统计出文件的行数;
(3)编写独立应用程序(推荐使用Scala语言),读取HDFS系统文件“/user/hadoop/test.txt”(如果该文件不存在,请先创建),然后,统计出文件的行数;通过sbt工具将整个应用程序编译打包成 JAR包,并将生成的JAR包通过 spark-submit 提交到 Spark 中运行命令。
(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
(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)

4.实验报告
题目: Spark初级编程实践 姓名 刘梦阳 日期2023.12.4
实验环境:
(1)操作系统:Linux(centos);
(2)Spark版本:2.4.0;
(3)Hadoop版本:3.1.3。
实验内容与完成情况:
(1)Spark读取文件系统的数据
(1)在spark-shell中读取Linux系统本地文件“/home/hadoop/test.txt”,然后统计出文件的行数;
打开spark-shell

Scala代码

(2)在spark-shell中读取HDFS系统文件“/user/hadoop/test.txt”(如果该文件不存在,请先创建),然后,统计出文件的行数;

(3)编写独立应用程序(推荐使用Scala语言),读取HDFS系统文件“/user/hadoop/test.txt”(如果该文件不存在,请先创建),然后,统计出文件的行数;通过sbt工具将整个应用程序编译打包成 JAR包,并将生成的JAR包通过 spark-submit 提交到 Spark 中运行命令。
创建scala目录并编写scala代码

Scala代码
/* HDFStest.scala */
import org.apache.spark.SparkContext
import org.apache.spark.SparkContext._
import org.apache.spark.SparkConf

object HDFStest {
def main(args: Array[String]) {
val logFile = "hdfs://node1:9000/user/root/test.txt"
val conf = new SparkConf().setAppName("Simple Application")
val sc = new SparkContext(conf)
val logData = sc.textFile(logFile, 2)
val num = logData.count()
printf("The num of this file is %d\n", num)
}
}
创建simple.sbt

Simple.sbt中的内容:
name := "A Simple HDFS Test"
version := "1.0"
scalaVersion := "2.11.12"
libraryDependencies += "org.apache.spark" %% "spark-core" % "2.4.0"
执行sbt package打jar包

将jar包提交到spark-submit

(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

创建代码文件夹

写入原始数据

编写scala代码

代码如下
import org.apache.spark.SparkContext
import org.apache.spark.SparkContext._
import org.apache.spark.SparkConf
import org.apache.spark.HashPartitioner

object RemDup {
def main(args: Array[String]) {
val conf = new SparkConf().setAppName("RemDup")
val sc = new SparkContext(conf)
val dataFile = "file:///export/server/spark/mycode/RemDup/datas"
val data = sc.textFile(dataFile,2)
val res = data.filter(_.trim().length>0).map(line=>(line.trim,"")).partitionBy(new HashPartitioner(1)).groupByKey().sortByKey().keys
res.saveAsTextFile("file:///export/server/spark/mycode/RemDup/result")
}
}
编写simple.sbt文件

打包

提交spark-submit运行

查看结果

(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)

创建代码目录和数据文件

编写scala代码

Scala代码
import org.apache.spark.SparkContext
import org.apache.spark.SparkContext._
import org.apache.spark.SparkConf
import org.apache.spark.HashPartitioner

object AvgScore {
def main(args: Array[String]) {
val conf = new SparkConf().setAppName("AvgScore")
val sc = new SparkContext(conf)
val dataFile = "file:///export/server/spark/mycode/AvgScore/datas"
val data = sc.textFile(dataFile,3)

   val res = data.filter(_.trim().length>0).map(line=>(line.split(" ")(0).trim(),line.split(" ")(1).trim().toInt)).partitionBy(new HashPartitioner(1)).groupByKey().map(x => {
   	   	var n = 0
       	var sum = 0.0
       	for(i <- x._2){
			sum = sum + i
       		n = n +1
	    }
        val avg = sum/n
	    val format = f"$avg%1.2f".toDouble
	    (x._1,format)
    })
   res.saveAsTextFile("file:///export/server/spark/mycode/AvgScore/result")
}

}
编写simple.sbt文件

使用sbt打包

将jar包提交到sparl-submit运行

查看输出结果

出现的问题:
问题1: 在搭建Spark环境时,可能会遇到依赖项、版本兼容性等问题。
问题2: 提交Spark作业时,可能会遇到运行时错误,如类找不到、资源不足等。
问题3: 在Spark中读取和处理数据时,可能会遇到文件格式、数据格式等问题。
解决方案(列出遇到的问题和解决办法,列出没有解决的问题):
问题1解决方法: 确保你按照官方文档的指导正确安装和配置了Spark及其相关组件。检查Java、Scala等的版本兼容性,并确保环境变量配置正确。
问题2解决方法:检查作业的依赖项、文件路径等设置。确保集群资源足够,并检查错误日志以获取详细信息。
问题3解决方法: 确保使用正确的数据读取器(如textFile、parquet等),并检查数据的格式。对于复杂数据结构,确保你理解数据的组织方式。

相关推荐

  1. 1213总结

    2023-12-13 10:08:18       53 阅读
  2. 1211总结

    2023-12-13 10:08:18       43 阅读
  3. 1212总结

    2023-12-13 10:08:18       42 阅读
  4. 128总结

    2023-12-13 10:08:18       32 阅读
  5. 1210总结

    2023-12-13 10:08:18       42 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-13 10:08:18       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-13 10:08:18       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-13 10:08:18       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-13 10:08:18       18 阅读

热门阅读

  1. 每日总结

    2023-12-13 10:08:18       46 阅读
  2. Linux部署mosquitto及其配置

    2023-12-13 10:08:18       41 阅读
  3. pandas 遍历

    2023-12-13 10:08:18       41 阅读
  4. Qt打包

    2023-12-13 10:08:18       50 阅读
  5. 12.12总结

    2023-12-13 10:08:18       45 阅读
  6. get请求数组参数,格式转换

    2023-12-13 10:08:18       59 阅读
  7. 【异步】CompletableFuture

    2023-12-13 10:08:18       44 阅读
  8. 深入了解RPM包管理与Nginx源码包管理

    2023-12-13 10:08:18       49 阅读
  9. clickhouse sql优化笔记

    2023-12-13 10:08:18       41 阅读
  10. 逃逸分析案例

    2023-12-13 10:08:18       54 阅读
  11. 每日总结

    2023-12-13 10:08:18       40 阅读
  12. ferry前端项目部署

    2023-12-13 10:08:18       49 阅读
  13. selenium

    2023-12-13 10:08:18       59 阅读
  14. openresty动态解析域名

    2023-12-13 10:08:18       44 阅读
  15. Linux的bash脚本

    2023-12-13 10:08:18       55 阅读
  16. AtCoder Grand Contest 001

    2023-12-13 10:08:18       55 阅读
  17. TCP和UDP的区别

    2023-12-13 10:08:18       36 阅读
  18. Git合并代码(rebase)

    2023-12-13 10:08:18       39 阅读
  19. android重启app

    2023-12-13 10:08:18       42 阅读
  20. Python——第五章:json模块

    2023-12-13 10:08:18       42 阅读