第8课:彻底实战详解使用IDE开发Spark程序
1.下载安装windows下的scala-2.10.4.
2.打开eclipse,新建scala project: WordCount
3.修改依赖的scala版本为2.10.x。
在Package Explorer中WordCount上点击右键,选择properities->scala Compilier,选择下图所示use peoject settings,选择Scala installation为latest 2.10 bundle(dynamic)后点击OK。
可以看到WordCount project中的scala library container中的版本变成了2.10.5,如下图:
4. 加入spark-1.6.0的jar文件依赖。
下载spark-1.6.0-bin-hadoop2.6.tgz,解压到D:\ProgramFiles目录中,将spark-1.6.0-bin-hadoop2.6\lib\spark-assembly-1.6.0-hadoop2.6.0.jar 导入到eclipse中。
在eclipse中的WordCount上点击右键,选择build path->Configure Build Path,在Libraries栏选择Add External JARs...,选择spark-1.6.0-bin-hadoop2.6\lib\spark-assembly-1.6.0-hadoop2.6.0.jar ,点击OK。
此时可以在WordCount Project中的Referenced Libraries中看到spark-assembly-1.6.0-hadoop2.6.0.jar,如下图所示:
5. 在src下建立spark工程包:
WrodCount project上的src上点击右键,选择new -> Package,包名为com.dt.spark。点击finish。
6. 创建scala入口类。
在com.dt.spark包上点击右键,选择new->scala class。类名为com.dt.spark.WordCount,点击finish。
此时就可以编写代码了。
7. 把class变成object并编写main入口方法。代码如下:
package com.dt.spark
import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
/**
* 使用scala开发本地测试的spark WordCount程序
* DT大数据梦工厂
* 新浪微博:p://weibo.com/ilovepains/
*/
object WordCount {
def main(args: Array[String]){
/*
* 第一步:创建spark的配置对象SparkConf,设置Spark程序运行时的配置信息
* 例如通过setMaster来设置程序要链接的Spark集群的Master的URL,如果设置
* 为local,则代表Spark程序在本地运行,特别适合于机器配置条件非常差(例如
* 只有1内存)的初学者
*/
val conf = new SparkConf() //创建SparkConf对象。因为是全局唯一的,所以使用new,不用工厂方法模式。
conf.setAppName("Wow, My First Spark App!") //设置应用程序的名称,在程序运行的监控界面可以看到名称
conf.setMaster("local") //此时程序在本地运行,不需要安装spark集群。
/**
* 第二步:创建SparkContext对象,
* SparkContext是Spark程序所有功能的唯一入口,无论是采用scala/java/Python/R等都必须有一个SParkContext,而且默认都只有一个。
* SparkContext核心作用:初始化应用程序运行时所需要的核心组件,包括DAGScheduler,TaskScheduler,Scheduler Backend,
* 同时还会负责Spark程序往Master注册程序等。SparkContext是整个Spark应用程序中最为重要的一个对象,
*
*/
val sc = new SparkContext(conf) //通过创建SparkContext对象,通过传入SparkConf实例来定制SPark地的具体参数和配置信息。
/*
* 第三步:根据具体的数据来源(/HBase/Local FS/DB/S3等)通过SparkContext创建RDD,
* RDD创建有三种基本方式:1.根据外部数据来源(如HDFS),2.根据Scala集合,3.由其他RDD操作产生
* 数据会被RDD划分成为一系列的Partitions,分配到每个Partition的数据属于一个Task的处理范畴,
*/
val lines = sc.textFile("D://programFiles//spark-1.6.0-bin-hadoop2.6//README.md", 1) //假设电脑只有1G内存,一个core。读取本地文件,设置partition
//也可以写成:l lines:RDD[String] = sc.textFile 类型推断
/**
* 第4步:对初始RDD进行Transformation级别的处理。例如map/filter等高阶函数等的编程
* 来进行具体的数据计算。第4.1步:将每一行的字符串拆分成单个的单词。
*/
val words = lines.flatMap { line => line.split(" ") } //对每一行的字符串进行单词拆分,map每次循环一行,将每一行的小集合通过flat合并成一个大集合
/**
* 第4.2步,在单词拆分的基础上对每个单词实例 进行计数为1,也就是word => (word,1)
*/
val pairs = words.map { word => (word,1) }
/**
* 第4.3步,在每个单词实例计数为1的基础上,统计每个单词在文件中出现的总次数。
*/
val wordCounts = pairs.reduceByKey(_+_) //对相同的Key,进行Value的累计(包括Local和Reduce级别同时 Reduce)
wordCounts.foreach(wordNumberPair => println(wordNumberPair._1 + " : " + wordNumberPair._2)