大数据处理引擎Spark | 青训营笔记

229 阅读4分钟

这是我参与「第四届青训营 」笔记创作活动的第4天

本次学习主要是针对Spark计算引擎在大数据生态中的应用和处理的学习,收获满满!!!

Spark的一种基于内存的快速、通用、可扩展的大数据分析计算引擎。

在大数据生态中,最主要的两个部分是Hadoop软件框架和Spark内存级计算引擎。Hadoop包含四个项目:Hadoop common、HDFS、YARN和MapReduce。

Spark的作用相当于MapReduce,它是基于内存的计算引擎。Spark将迭代过程的中间数据缓存到内存中,根据需要多次重复使用。Spark和MapReduce的对比如下表所示:

SparkMapReduce
易用性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程序

  1. 创建一个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
  1. 配置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>
  1. 将src/main/java和src/test/java分别修改成src/main/scala和src/test/scala,与pom.xml中的配置保持一致。
  2. 新建一个scala class。
  3. 编写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()
	  }
}
  1. 打包。
  2. 启动HDFS和Spark集群。
  3. 使用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计算引擎进行了详细的了解。

参考

blog.csdn.net/mys_35088/a…

sulinyn.blog.csdn.net/article/det…

juejin.cn/post/712390…