一、spark
- 也是基于mr的计算,和Hadoop的MapReduce阶段底层一样
- spark是基于内存进行数据处理的,MapReduce是基于磁盘进行数据处理的
- spark比MapReduce快,不仅因为基于内存,还因为DAG(根本原因)
- DAG计算模型在迭代计算上还是比MapReduce的效率更高
- spark中具有DAG有向无环图,DAG有向无环图在此过程中减少了shuffle以及落地磁盘的次数
二、java中编写spark运行代码
1)导入依赖和插件
<dependencies>
<dependency>
<groupId>org.scala-lang</groupId>
<artifactId>scala-library</artifactId>
<version>2.11.12</version>
</dependency>
<dependency>
<groupId>org.scala-lang</groupId>
<artifactId>scala-compiler</artifactId>
<version>2.11.12</version>
</dependency>
<dependency>
<groupId>org.scala-lang</groupId>
<artifactId>scala-reflect</artifactId>
<version>2.11.12</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.spark/spark-core -->
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.11</artifactId>
<version>2.4.5</version>
</dependency>
</dependencies>
<build>
<plugins>
<!-- Java Compiler -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<!-- Scala Compiler -->
<plugin>
<groupId>org.scala-tools</groupId>
<artifactId>maven-scala-plugin</artifactId>
<version>2.15.2</version>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>testCompile</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
2)代码
spark的代码有两种测试方式,一种是本地运行,一种是打包上传运行
本地运行
- 通过setMasters设置运行方式,local为本地运行,默认为单线程,可以指定线程的个数,最多为8=》”local[8]”,打包到集群运行的时候需要将该设置注释掉
- RDD :相当于scala中的一个集合
- reduceByKey : 通过key对value进行聚合需要传入一个聚合函数
package com.spark
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}
object Demo1_WC {
def main(args: Array[String]): Unit = {
/**
* 1.创建spark环境,获取入口
*/
//创建spark环境
val conf: SparkConf = new SparkConf()
//设置spark程序名
conf.setAppName("wc")
//设置spark的执行方式
conf.setMaster("local")
//创建spark的上下文对象,即程序的入口
val sc: SparkContext = new SparkContext(conf)
/**
* 2.读取文件
*/
val file: RDD[String] = sc.textFile("E:\\IdeaProjects\\javaproject\\scalar\\word.txt")
/**
* 3.逻辑处理
*/
//map阶段
val word: RDD[String] = file.flatMap(_.split(","))
val kv: RDD[(String, Int)] = word.map((_,1))
//reduce阶段,通过key对value进行聚合,可以指定分区个数,也可以不指定
val count: RDD[(String, Int)] = kv.reduceByKey((x,y)=>x+y,3)
//整理数据格式
var result=count.map(kv=>s"${kv._1},${kv._2}")
//如果数据量大的话,不建议在控制台输出
//result.foreach(println)
//将结果保存到文件中
//调用该方法时可能会出现错误,需要进行配置
result.saveAsTextFile("spark/data/out1")
}
}
报错解决
配置winutils
链接:https://pan.baidu.com/s/1gYQ0NFt-fCekSI23A90Atg
提取码:hehe
将hadoop在本地解压,在其bin目录下放一个winutils文件
配置环境变量
将idea设置为以管理员身份运行=》重启
打包到集群中运行,结果输出在hdfs上
- 将本地运行的代码,设置注释掉
- 将输入路径输出路径更改,也可以通过传参的方式传入路径
package com.spark
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}
object Demo1_WC {
def main(args: Array[String]): Unit = {
/**
* 1.创建spark环境,获取入口
*/
//创建spark环境
val conf: SparkConf = new SparkConf()
//设置spark程序名
conf.setAppName("wc")
//设置spark的执行方式
// conf.setMaster("local")
//创建spark的上下文对象,即程序的入口
val sc: SparkContext = new SparkContext(conf)
/**
* 2.读取文件
*/
val file: RDD[String] = sc.textFile("spark/data/word.txt")
/**
* 3.逻辑处理
*/
//map阶段
val word: RDD[String] = file.flatMap(_.split(","))
val kv: RDD[(String, Int)] = word.map((_,1))
//reduce阶段,通过key对value进行聚合,可以指定分区个数,也可以不指定
val count: RDD[(String, Int)] = kv.reduceByKey((x,y)=>x+y,3)
//整理数据格式
var result=count.map(kv=>s"${kv._1},${kv._2}")
//如果数据量大的话,不建议在控制台输出
//result.foreach(println)
//将结果保存到文件中
//调用该方法时可能会出现错误,需要进行配置
result.saveAsTextFile("spark/data/out1")//输出到hdfs上
}
}
由于jar包中,指定的是在hdfs上的路径,还需将word文件上传至hdfs
spark-submit --class com.spark.Demo1_WC --master yarn-client spark-1.0.jar
查看hdfs上文件
Hadoop
hadoop学习一
hadoop学习二
hadoop学习三
hadoop学习四
hadoop学习五
hadoop学习六
hadoop学习七
hadoop学习八
hadoop异常处理
hadoop基础学习九
hadoop基础学习十
hadoop基础学习十一
hadoop基础学习十二
hadoop基础学习十三
hadoop基础学习十四
hadoop基础学习十五
hadoop基础学习十六
hadoop基础学习十七
hadoop基础学习十八
hadoop基础学习十九
Hadoop基础学习二十
hadoop基础学习二十一
hadoop基础学习二十二
hadoop基础学习二十三
hadoop基础学习二十四