这是我参与「第四届青训营 」笔记创作活动的第4天
本次学习主要是针对Spark计算引擎在大数据生态中的应用和处理的学习,收获满满!!!
Spark的一种基于内存的快速、通用、可扩展的大数据分析计算引擎。
在大数据生态中,最主要的两个部分是Hadoop软件框架和Spark内存级计算引擎。Hadoop包含四个项目:Hadoop common、HDFS、YARN和MapReduce。
Spark的作用相当于MapReduce,它是基于内存的计算引擎。Spark将迭代过程的中间数据缓存到内存中,根据需要多次重复使用。Spark和MapReduce的对比如下表所示:
| Spark | MapReduce | |
|---|---|---|
| 易用性 | Spark提供了易于编码和使用的良好API | 编码和使用都不简单 |
| 性能 | 内存级的性能 | 相较于Spark较差 |
| 迭代处理 | Spark会把数据缓存在内存中 | 每个MapReduce作业都要把数据写到磁盘里,下一轮迭代再从磁盘里读取数据 |
| 容错能力 | Spark通过弹性分布数据集(RDD)的谱系来实现容错 | 通过在HDFS里复制数据实现 |
| 运行时架构 | 任务都在一个预先分配的执行JVM中运行 | 每个映射器和化简器都在独立的一个JVM里运行 |
| 混排 | 在内存和磁盘上保存数据 | 在磁盘上保存数据 |
| 运算 | 映射、化简、连接、Cogroup等 | 映射和化简 |
| 执行模式 | 批处理、交叉式和流式 | 只有批处理 |
| 本地支持的编程语言 | 仅支持Java | 支持Java、Scale、Python和R |
Spark生态组件包括:
- Spark Core:Spark核心组件,它实现了Spark的基本功能,包含任务调度、内存管理、错误恢复、与存储系统交互等模块。
- Spark SQL:用来操作结构化数据的核心组件,通过Spark SQL可以直接查询Hive、HBase等多种外部数据源中的数据。
- Spark Structured Streaming:Spark提供的流式计算框架,支持高吞吐量、可容错处理的实时流式数据处理。
- MLlib:Spark提供的关于机器学习功能的算法程序库,包括分类、回归、聚类、协同过滤算法等,还提供了模型评估、数据导入等额外的功能。
- GraphX:Spark提供的分布式图处理框架,拥有对图计算和图挖掘算法的API接口以及丰富的功能和运算符。
- 独立调度器、Yarn、Mesos、Kubernetes:Spark框架可以高效地在一个到数千个节点之间伸缩计算,集群管理器则主要负责各个节点的资源管理工作,为了实现这样的要求,同时获得最大灵活性,Spark支持在各种集群管理器(Cluster Manager)上运行。
Spark程序
1、运用蒙特卡洛算法求PI
/bigData/spark-1.6.1-bin-hadoop2.6/bin/spark-submit --class org.apache.spark.examples.SparkPi --master spark://hadoop01:7077 --executor-memory 1g --total-executor-cores 1 /bigData/spark-1.6.1-bin-hadoop2.6/lib/spark-examples-1.6.1-hadoop2.6.0.jar 100
2、编写WordCount程序
- 创建一个maven项目。
/bigData/spark-1.6.1-bin-hadoop2.6/bin/spark-submit --class org.apache.spark.examples.SparkPi --master spark://hadoop01:7077 --executor-memory 1g --total-executor-cores 1 /bigData/spark-1.6.1-bin-hadoop2.6/lib/spark-examples-1.6.1-hadoop2.6.0.jar 100
- 配置maven的pom.xml文件。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>cn.itcast.spark</groupId>
<artifactId>spark-mvn</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
<encoding>UTF-8</encoding>
<scala.version>2.10.6</scala.version>
<scala.compat.version>2.10</scala.compat.version>
</properties>
<dependencies>
<dependency>
<groupId>org.scala-lang</groupId>
<artifactId>scala-library</artifactId>
<version>${scala.version}</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.10</artifactId>
<version>1.5.2</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-streaming_2.10</artifactId>
<version>1.5.2</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>2.6.2</version>
</dependency>
</dependencies>
<build>
<sourceDirectory>src/main/scala</sourceDirectory>
<testSourceDirectory>src/test/scala</testSourceDirectory>
<plugins>
<plugin>
<groupId>net.alchim31.maven</groupId>
<artifactId>scala-maven-plugin</artifactId>
<version>3.2.0</version>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>testCompile</goal>
</goals>
<configuration>
<args>
<arg>-make:transitive</arg>
<arg>-dependencyfile</arg>
<arg>${project.build.directory}/.scala_dependencies</arg>
</args>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.18.1</version>
<configuration>
<useFile>false</useFile>
<disableXmlReport>true</disableXmlReport>
<includes>
<include>**/*Test.*</include>
<include>**/*Suite.*</include>
</includes>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.3</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<filters>
<filter>
<artifact>*:*</artifact>
<excludes>
<exclude>META-INF/*.SF</exclude>
<exclude>META-INF/*.DSA</exclude>
<exclude>META-INF/*.RSA</exclude>
</excludes>
</filter>
</filters>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
- 将src/main/java和src/test/java分别修改成src/main/scala和src/test/scala,与pom.xml中的配置保持一致。
- 新建一个scala class。
- 编写Spark程序。
package cn.itcast.spark
import org.apache.spark.{SparkContext, SparkConf}
object WordCount {
def main(args: Array[String]) {
//创建SparkConf()并设置App名称
val conf = new SparkConf().setAppName("WC")
//创建SparkContext,该对象是提交spark App的入口
val sc = new SparkContext(conf)
//使用sc创建RDD并执行相应的transformation和action
sc.textFile(args(0)).flatMap(_.split(" ")).map((_, 1)).reduceByKey(_+_, 1).sortBy(_._2, false).saveAsTextFile(args(1))
//停止sc,结束该任务
sc.stop()
}
}
- 打包。
- 启动HDFS和Spark集群。
- 使用Spark-submit命令提交Spark应用。
/bigData/spark-1.6.1-bin-hadoop2.6/bin/spark-submit --class cn.itcast.spark.WordCount --master spark://hadoop01:7077 --executor-memory 1G --total-executor-cores 2 /root/spark-mvn-1.0-SNAPSHOT.jar hdfs://hadoop01:9000/input hdfs://hadoop019000/wordcount/out2
总结
1、了解了大数据处理常见的几个场景链路。 2、主要针对Spark计算引擎进行了详细的了解。
参考