- 任务1:求top值程序个性化(30分)
- 1. 创建工作项目mcf14gzxm
- 2. 创建eclipse应用程序
- 3. 导入mcf14gzxm项目
- 4. 创建数据样本文件mcf14TopN.txt
- 5. 创建程序代码文件mcf14TopN.scala
- 任务2:文件排序程序个性化(30分)
- 1. 创建数据样本目录mcf14file及文件mcf14file1.txt、mcf14file2.txt、mcf14file3.txt
- 2. 创建程序代码文件mcf14FileSort.scala
- 任务3:二次排序程序个性化(30分)
- 1. 创建数据样本文件mcf14SecondarySort.txt
- 2. 创建程序代码文件mcf14SecondarySortApp.scala和mcf14SecondarySortKey.scala
- 开发总结(10分)
- 1. 关于eclipse导入项目后出现红叉的问题
- 2. 关于A master URL must be set in your configuration的问题
- 3. 关于Input path does not exist的问题
- 4. 关于Output directory file的问题
- 5. 关于运行代码时弹出run configurations窗口的问题
- 6. 关于错误: 找不到或无法加载主类的问题
- 7. 总结
说明:本次大作业是基于ubuntukylin14.04(16)版本即hadoop集群(hadoop2.6.0版本)和hbase伪分布式(hbase1.1.2版本),并安装好Scala2.11.8、Spark2.1.0、sbt0.13.15和Scala IDE for eclipse4.7.0,并完成了sbt eclipse插件的全局安装,在实验报告1至3中均有详细步骤,在此不再描述。 任务1:求top值程序个性化(30分)
基于ubuntukylin14.04(16)版本,完成教材141页5.4.1节求top值程序个性化。相关代码和数据参考http://dblab.xmu.edu.cn/blog/1632-2/
1. 创建工作项目mcf14gzxm (1)在eclipse工作目录(本人/home/mcf14/gongzuomulu)中创建工作项目mcf14gzxm。
(2)在gongzuomulu目录中输入mkdir -p mcf14gzxm/src/main/scala命令创建scala目录存放spark应用程序。
(3)在gongzuomulu目录中输入vim mcf14gzxm/build.sbt命令创建包含sbt打包配置信息的build.sbt文件,并在其中添加以下信息后保存退出。
name := "Simple Project" version := "1.0" scalaVersion := "2.11.8" libraryDependencies += "org.apache.spark" %% "spark-core" % "2.1.0"
(4)在mcf14gzxm目录中输入mkdir project命令创建project目录并进入,然后输入vim build.properties命令创建包含程序配置信息的build.properties文件并打开,在其中添加sbt的版本信息后保存退出:
sbt.version=0.13.15
在程序主目录即/home/mcf14/gongzuomulu/mcf14gzxm中输入sbt eclipse命令创建eclipse应用程序,如下所示即为成功。
在终端输入eclipse命令打开eclipse,在eclipse界面右击左侧打开快捷菜单,然后点击import…,在Select an import wizard:中搜索Existing Projects into Workspace并选中,然后点击Next,点击Browse…找到刚才创建的工作项目mcf14gzxm(即/home/mcf14/gongzuomulu/mcf14gzxm)然后点击Finish就能导入mcf14gzxm项目了。
注:此时要注意eclipse中Scala的版本问题!如果mcf14gzxm项目有红叉,那就说明Scala版本出错,解决方法为:右击mcf14gzxm项目→Properties→Scala Compiler→选中Use Project Settings→在Scala Installation中选中与安装好的Scala一致的版本→Apply and Close,此时就不会出错了。
打开终端在用户主目录下创建数据样本文件TopN.txt(注意里边不能有空格)。
在mcf14gzxm项目中的src/main/scala目录上右击,选择New→Package→Name为mcf14TopN→Finish来创建mcf14TopN包,并右击此包选择New→Scala Object→Name为mcf14TopN.mcf14TopN→Finish来创建mcf14TopN.scala代码文件,并在其中输入代码(见文末),然后运行即可。
基于ubuntukylin14.04(16)版本,完成教材143页5.4.2节文件排序程序个性化。相关代码和数据参考http://dblab.xmu.edu.cn/blog/1632-2/
1. 创建数据样本目录mcf14file及文件mcf14file1.txt、mcf14file2.txt、mcf14file3.txt 在用户主目录下创建目录mcf14file并在其中创建三个输入文件mcf14file1.txt、mcf14file2.txt、mcf14file3.txt,在每个输入文件中分行输入四个数字。
在mcf14gzxm项目中创建mcf14file包和mcf14FileSort.scala代码文件(见文末)并运行,成功后就会在输出目录输出结果。
基于ubuntukylin14.04(16)版本,完成教材144页5.4.3节二次排序程序个性化。相关代码和数据参考http://dblab.xmu.edu.cn/blog/1632-2/
1. 创建数据样本文件mcf14SecondarySort.txt 在用户主目录下创建mcf14SecondarySort.txt文件,在其中的每行输入两个数字并用空格隔开,输入若干行。
在mcf14gzxm项目中创建SecondarySort包和mcf14SecondarySortApp.scala代码文件和mcf14SecondarySortKey.scala代码文件(见文末)并运行,成功后就会在控制台输出结果。
原因:eclipse中Scala的版本与安装的Scala版本不一致。
解决方法:右击项目→Properties→Scala Compiler→选中Use Project Settings→在Scala Installation中选中与安装好的Scala一致的版本→Apply and Close。
原因:未指定或设置Spark的运行模式。
解决办法1:在代码中的setAppName("(代码名)")后边加上.setMaster(“local”)
解决办法2:点击运行按钮边的三角形→Run Configurations…→Scala Application→与代码对应的应用程序→Arguments→在VM arguments中输入-Dspark.master=local
原因:输入目录不存在或路径设置错误。
解决方法:查看目录是否存在,查看代码中路径是否正确。
原因:代码中设置的输出目录已存在。
解决办法:将设置的输出目录删除或修改目录名。
原因:代码运行时未指定主类型。
解决办法:run configurations窗口左侧双击Scala Application→Name为“代码名字+$”→Main class为“包名.代码名”(若有多个包则都应加上)→Apply→Run
原因:主类设置错误或未设置。
解决办法:参考“5. 关于运行代码时弹出run configurations窗口的问题”。
本次大作业是三个程序个性化任务,大作业其实也是程序试验的内容,在做实验的过程中,程序的运行基本上采用了local本地模式,因为条件有限,只部署了一个X1主节点和一个X2副节点,但是同样能够满足基本的实验要求。做实验的难点就在于将所需要的全部软件安装好并配置好,形成一个完整的大数据计算平台,切不可因为一时的困难而放弃。
坚持是很有必要的,特别是在遇到运行程序时出错的问题,然而,坚持中的方向有时候更为重要。有可能为了解决这个问题,不知不觉已经过去了好几个小时,甚至有时候两三天都无法解决这个问题,那么此时就应该去请教老师了,或许在老师的指导下会“柳暗花明又一村”。
在动手实践的过程中,要充分的认识到自己实践的重要性。别人动手做实验是学不到自己身上的,自己动手做实验学会的东西,那是永远也丢不掉的。Spark作为大数据计算平台的后起之秀,相比于Hadoop在许多方面都有了很大的进步,Hadoop是数据向计算靠拢,而Spark是计算向数据靠拢,因此Spark仅在数据处理效率上就有了很大的提升,其他的像多种数据集操作、内存计算、基于DAG的任务调度执行机制、多种高层次又简洁的API等比Hadoop更为强大。相比于单个使用,将Hadoop和Spark相结合统一部署更能在实际的生产环境中发挥最大的价值。因此,深刻地把握Hadoop和Spark的运行机制、工作原理更能够解决问题,取得收获。
做实验,出现问题解决问题,有时候真的比顺顺利利的做完更能学会知识。因为在遇到程序出错的时候,就得上网上搜索查看很多相关的内容。在出现问题→搜索问题→探究问题→解决问题这个过程中,无疑让我学会了很多。相比于纯书本理论学习,没有实际动手进行实验操作是比较难学会真正的知识的,特别是在现在的这个互联网大数据时代,各个方面都离不开互联网和数据。个人认为,先整体把握课本的内容架构,然后再亲自动手实践,将理论与实际相结合,用理论指导实践,用实践去检验理论,这样,就能不断的提高自己的认知水平,进一步提高自己的专业本领。
mcf14TopN.scala代码:
import org.apache.spark.{SparkConf, SparkContext}
object mcf14TopN {
def main(args: Array[String]): Unit = {
val conf = new SparkConf().setAppName("mcf14TopN").setMaster("local")
val sc = new SparkContext(conf)
sc.setLogLevel("ERROR")
val lines = sc.textFile("file:///home/mcf14/mcf14TopN.txt",2)//本地测试数据文件路径
var num = 0;
val result = lines.filter(line => (line.trim().length > 0) && (line.split(",").length == 4))
.map(_.split(",")(2))
.map(x => (x.toInt,""))
.sortByKey(false)
.map(x => x._1).take(5)
.foreach(x => {
num = num + 1
println(num + "t" + x)
})
}
}
mcf14FileSort.scala代码:
import org.apache.spark.SparkContext
import org.apache.spark.SparkContext._
import org.apache.spark.SparkConf
import org.apache.spark.HashPartitioner
object mcf14FileSort {
def main(args: Array[String]) {
val conf = new SparkConf().setAppName("mcf14FileSort").setMaster("local")
val sc = new SparkContext(conf)
val dataFile = "file:///home/mcf14/mcf14file"//测试文件输入目录
val lines = sc.textFile(dataFile,3)
var index = 0
val result = lines.filter(_.trim().length>0).map(n=>(n.trim.toInt,"")).partitionBy(new HashPartitioner(1)).sortByKey().map(t => {
index += 1
(index,t._1)
})
result.saveAsTextFile("file:///home/mcf14/fileoutput")//本地结果输出目录
}
}
mcf14SecondarySortApp.scala代码:
package cn.edu.xmu.spark
import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
object mcf14SecondarySortApp {
def main(args:Array[String]){
val conf = new SparkConf().setAppName("mcf14SecondarySortApp").setMaster("local")
val sc = new SparkContext(conf)
val lines = sc.textFile("file:///home/mcf14/mcf14SecondarySort.txt", 1)//本地文件输入目录
val pairWithSortKey = lines.map(line=>(new mcf14SecondarySortKey(line.split(" ")(0).toInt, line.split(" ")(1).toInt),line))
val sorted = pairWithSortKey.sortByKey(false)
val sortedResult = sorted.map(sortedLine =>sortedLine._2)
sortedResult.collect().foreach (println)
}
}
mcf14SecondarySortKey.scala代码:
package cn.edu.xmu.spark
class mcf14SecondarySortKey(val first:Int,val second:Int) extends Ordered[mcf14SecondarySortKey] with Serializable {
def compare(other:mcf14SecondarySortKey):Int = {
if (this.first - other.first !=0) {
this.first - other.first
} else {
this.second - other.second
}
}
}



