Spark1——运行环境配置
Maven配置安装scala和Spark(Mac 环境)
参考:https://blog.csdn.net/end_taotao/article/details/98450984
- 安装scala插件,2.12.11版本
(1)这里将/usr/local/scala-2.12.11下的scala解压包直接导入Project Structure。
(2)在项目下Add Frameworks Support导入使用scala 2.12版本(在Module下)
- 安装Spark,3.0.1版本,导入jar包
在 project structure -> Libraries -> java 下导入spark解压包下的所有jar包(/usr/local/spark-3.0.0-bin-hadoop3.2/jars/usr/local/spark-3.0.0-bin-hadoop3.2)
- 配置依赖
在项目下的pom.xml文件下加入以下依赖,更新完成即可。
- 源码
下载源码,添加到IDEA。
https://www.cnblogs.com/lz3018/p/5420196.html
WordCount实现
- 第一种方式
package com.yu.bigdata.spark.core.wordCount
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}
object Spark01_WordCount {
def main(args: Array[String]): Unit = {
//1. 建立和Spark框架的连接
val sparkConf = new SparkConf().setMaster("local").setAppName("WordCount") //基础配置
val sc = new SparkContext(sparkConf) //创建对象
//2. 执行业务操作
//(1)读取文件,获取一行一行的数据 "hello world"
val lines: RDD[String] = sc.textFile("datas")
//(2)将一行数据拆分,形成单个的单词 (分词) "hello world" => hello world hello world
val words: RDD[String] = lines.flatMap(_.split(" ")) //扁平化
//(3)将数据根据单词进行分组,便于统计 (hello hello hello) (world world)
val wordGroup: RDD[(String, Iterable[String])] = words.groupBy(word => word)
//(4)对分组后的数据进行转换 (hello 3)(world 2)
val wordToCount = wordGroup.map {
case (word, list) =>
(word, list.size)
}
//(5)将转换结果采集到控制台打印
val array: Array[(String, Int)] = wordToCount.collect()
array.foreach(println)
//3. 关闭连接
sc.stop()
}
}
- 第二种方式
package com.yu.bigdata.spark.core.wordCount
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}
object Spark02_WordCount {
def main(args: Array[String]): Unit = {
//1. 建立和Spark框架的连接
val sparkConf = new SparkConf().setMaster("local").setAppName("WordCount") //基础配置
val sc = new SparkContext(sparkConf) //创建对象
//2. 执行业务操作
//(1)读取文件,获取一行一行的数据 "hello world"
val lines: RDD[String] = sc.textFile("datas")
//(2)将一行数据拆分,形成单个的单词 (分词) "hello world" => hello world hello world
val words: RDD[String] = lines.flatMap(_.split(" ")) //扁平化
//(3)将每个单词形成元组,第二个元素置为1
val wordToOne: RDD[(String, Int)] = words.map(
word => (word, 1)
)
//(4)根据元组的第一个单词分组 ((hello,1) (hello, 1) ) ( (world, 1) (world, 1) )
val wordGroup: RDD[(String, Iterable[(String, Int)])] = wordToOne.groupBy {
t => t._1
}
//(5)使用reduce函数将组内的个数相加,统计出wordCount
val wordToCount: RDD[(String, Int)] = wordGroup.map {
case (word, list) =>
list.reduce {
(t1, t2) => {
(t1._1, t1._2 + t2._2)
}
}
}
//(6)将转换结果采集到控制台打印
val array: Array[(String, Int)] = wordToCount.collect()
array.foreach(println)
//(Hello,4)
//(World,2)
//(Spark,2)
//3. 关闭连接
sc.stop()
}
}
- 第三种方式
Spark框架提供了更多的功能,可以将分组和聚合使用一个方法实现,reduceByKey函数,直接统计相同的key的总个数。
直接将上面的(4)(5)步替换为:
val wordToCount: RDD[(String, Int)] = wordToOne.reduceByKey(_ + _)
Spark运行环境
Spark 作为一个数据处理框架和计算引擎,被设计在所有常见的集群环境中运行, 在国内工作中主流的环境为 Yarn,不过逐渐容器式环境也慢慢流行起来。