spark-一个任务调度,数据存储交互,并行计算的框架

-- windows环境下spark的安装配置
【官网】:#

应用场景

spark-为大规模数据处理而设计的快速通用的计算引擎 1.支持一个统一的软件栈,spark用于任务调度,内存维护,与数据存储交互,错误恢复,并行计算的一个框架. 2.spark兼容hadloop中的Hdfs(严格说是hdfs接口)以及yarn.

基础资源

windows 10,jdk,scala,spark,hadloop

使用须知

Spark 是使用 scala 实现的基于内存计算的大数据开源集群计算环境.提供了 java,scala, python,R 等语言的调用接口.

配置步骤

Spark.

1.支持一个统一的软件栈,spark用于任务调度,内存维护,与数据存储交互,错误恢复,并行计算的一个框架.

2.spark兼容hadloop中的Hdfs(严格说是hdfs接口)以及yarn.



[警告]以下所有安装的目录中都避免出现空格.!

[安装jdk].

http://download.oracle.com/otn-pub/java/jdk/8u181-b13/96a7b8442fe848ef90c96a2fad6ed6d1/jdk-8u181-windows-x64.exe

[]其它版本:

http://www.oracle.com/technetwork/java/javase/downloads/index.html


安装完,设置环境变量.

JAVA_HOME     D:\JavaInstall\Jdk

[安装scala].

https://www.scala-lang.org/download/all.html

进入后下载:scala-x.x.x.msi

[1]需要下载安装正确的scala版本,否则后期会出现:”java.lang.NoSuchMethodError: scala.Predef$.$conforms”的错误.

需要保证spark安装后的安装目录下jars/下的scala版本和本次安装的一致.



安装一个版本的spark会有相关的依赖scala版本提示

[安装spark].

https://archive.apache.org/dist/spark/spark-2.1.0/spark-2.1.0-bin-hadoop2.7.tgz

[]如果jdk,hadloop,spark中的安装目录有空格,则会出现:否则会报错‘Files\spark-2.3.1-bin-hadoop2.7\jars""\‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。像下面这样就存在空格了.

[安装hadloop].

https://archive.apache.org/dist/hadoop/common/hadoop-2.7.3/hadoop-2.7.3.tar.gz

HADOOP_HOME      D:\Install\hadloop\hadoop-2.7.3

系统变量的path:

<至此>已可以运行spark-shell命令了(任意目录皆可):


[1]

[2]可能会抛异常,提示winutils.exe,需要拷贝相应版本的winutils.exe放到hadloop/bin目录下面.

之后管理员权限运行cmd.exe,输入:D:\Install\hadloop\hadoop-2.7.3\bin\winutils.exe chmod 777 /tmp/hive

[安装配置eclipse].

<5.1步骤>

http://www.eclipse.org/downloads/packages/eclipse-ide-java-developers/mars2.

<5.2步骤>

打开eclipse软件,创建maven项目:

file ->new ->others ->maven project 点 击 next

选 择maven-archetype-quickstart ,点击 next

group id com.dt.sparkartifact id sparkApps

然后点击 finish


[5]

[关于spark开发过程]

在做Spark开发时,一般会在windows下进行Spark本地模式程序调试,在本地调试好了再打包运行在Spark集群上。因此需要在windows上进行Spark开发配置。本文将给出三种开发工具的配置:1、使用eclipse java api开发;2、使用scala IDE开发;3、使用IntelliJ IDEA 开发。

[关于spark所需要的linux版本]

注意:该配置完毕后没有必要安装虚拟机配置hadoop环境就可以直接在idea上开发运行,一开始我不知道吃了不少的亏,还有如果打算配置linux下的hadoop环境建议使用ubuntu桌面版,不要使用centos7,小编使用centos7配置成功的概率低的不敢想象,Ubuntu桌面版就没失手过. spark框架及基础.

spark4种编程模型.

目前Spark的运行模式主要有以下几种:

1.)local:主要用于开发调试Spark应用程序

2.)Standlone:利用Spark自带的资源管理与调度器运行Spark集群,采用Master/Slave结构,为解决单点故障,可以采用Xookeeper实现高可靠(High Availability, HA)

3.)Apache Mesos:运行在著名的Mesos资源管理框架基础之上,该集群运行模式将资源管理管理交给Mesos,Spark只负责运行任务调度和计算

4.)Hadoop YARN:集群运行在Yarn资源管理器上,资源管理交给YARNSpark只负责进行任务调度和计算
Spark运行模式中Hadoop YARN的集群方式最为常用,前面一章关于Spark集群搭建就是采用的YARN模式。

[参考]https://www.cnblogs.com/miqi1992/p/5621268.html

Spark的处理流程.

每个Spark应用都由一个驱动器程序(drive program)来发起集群上的各种并行操作。驱动器程序包含应用的main函数,驱动器负责创建SparkContext,SparkContext可以与不同种类的集群资源管理器(Cluster Manager),例如Hadoop YARNMesos进行通信,获取到集群进行所需的资源后,SparkContext
得到集群中工作节点(Worker Node)上对应的Executor(不同的Spark程序有不同的Executor,他们之间是相互独立的进程,Executor为应用程序提供分布式计算以及数据存储功能),之后SparkContext将应用程序代码发送到各Executor,最后将任务(Task)分配给executors执行

ClusterManager:Standalone模式中即为Master节点(主节点),控制整个集群,监控Worker.YARN中为ResourceManager

Worker:从节点,负责控制计算节点,启动ExecutorDriver。在YARN模式中为NodeManager,负责计算节点的控制。

Driver:运行Applicationmain()函数并创建SparkContect

Executor:执行器,在worker node上执行任务的组件、用于启动线程池运行任务。每个Application拥有独立的一组Executor

SparkContext:整个应用的上下文,控制应用的生命周期。

RDDSpark的计算单元,一组RDD可形成执行的有向无环图RDD Graph

DAG Scheduler:根据作业(Job)构建基于StageDAG,并提交StageTaskScheduler

TaskScheduler:将任务(Task)分发给Executor

SparkEnv:线程级别的上下文,存储运行时的重要组件的引用。
SparkEnv内构建并包含如下一些重要组件的引用。
1MapOutPutTracker:负责Shuffle元信息的存储。
2BroadcastManager:负责广播变量的控制与元信息的存储。
3BlockManager:负责存储管理、创建和查找快。
4MetricsSystem:监控运行时性能指标信息。
5SparkConf:负责存储配置信息。

Spark的整体流程

1Client提交应用。

2Master找到一个Worker启动Driver

3DriverMaster或者资源管理器申请资源,之后将应用转化为RDD Graph

4、再由DAGScheduleRDD Graph转化为Stage的有向无环图提交给TaskSchedule

5、再由TaskSchedule提交任务给Executor执行。

6、其它组件协同工作,确保整个应用顺利执行。


Spark on Yarn流程

1、基于YARNSpark作业首先由客户端生成作业信息,提交给ResourceManager

2ResourceManager在某一NodeManager汇报时把AppMaster分配给NodeManager

3NodeManager启动SparkAppMaster

4SparkAppMastere启动后初始化然后向ResourceManager申请资源。

5、申请到资源后,SparkAppMaster通过RPCNodeManager启动相应的SparkExecutor

6SparkExecutorSparkAppMaster汇报并完成相应的任务。

7SparkClient会通过AppMaster获取作业运行状态。

SparkCore创建RDD的三种方式.

1.使用程序中的集合创建RDD(主要用于测试)

Listnumbers = Arrays.asList(1,2,3,4,5,6,7,8,9,10);

JavaRDDnumbersRDD = sc.parallelize(numbers);

2.使用本地文件创建RDD(主要用于临时性处理有大量数据的文件)

SparkSession spark = SparkSession.builder().master("local").appName("WordCountLocal").getOrCreate();

JavaRDDlines = spark.read().textFile("D:\\Users\\Administrator\\Desktop\\spark.txt").javaRDD();

3.使用HDFS文件创建RDD(生产环境的常用方式)

SparkSession spark = SparkSession.builder().appName("WordCountCluster").getOrCreate();

JavaRDDlines = spark.read().textFile("hdfs://h0:9000/spark.txt").javaRDD();

使用HDFS文件创建RDD对比使用本地文件创建RDD,需要修改的,只有两个地方:
第一,将SparkSession对象的master("local")方法去掉
第二,我们针对的不是本地文件了,修改为hadoop hdfs上的真正的存储大数据的文件.



常见问题

  • 莫名其妙的失败,错误
    【解决方案】所有安装的目录中都避免出现空格
  • 'Filesspark-2.3.1-bin-hadoop2.7jars""' 不是内部或外部命令,也不是可运行的程序 或批处理文件
    【解决方案】jdk,hadloop,spark中的安装目录有空格
  • java.lang.NoSuchMethodError: scala.Predef$.$conforms
    【解决方案】需要下载安装正确的scala版本,需要保证spark安装后的安装目录下jars/下的scala版本和本次安装的一致

快速入门

1.)调试第一个spark程序.

 1.1)eclipse中运行一个java.

 eclipse中创建一个class文件,在该文件中包涵一个main方法,写入你需要测试的东西,然后右键单击该java文件在弹出的菜单中选择Run As–>java application 然后该方法就会被编译执行,并且能够在concole控制台中看到执行结果。

public class HelloConfigLab {

  public static void main(String[] args)throws Exception

  {

System.err.println("Hello,ConfigLab(pcw)");

  }

}

  1.2)本地运行sparkdemo.

https://www.cnblogs.com/key1309/p/5303557.html

https://www.cnblogs.com/K-artorias/p/7234260.html

[spark的坑]https://blog.csdn.net/xwc35047/article/details/53933265

 

Description Resource Path Location Type

The type scala.reflect.api.TypeTags$TypeTag cannot be resolved. It is indirectly referenced from required .class files WordCount.java /sparkApps/src/main/java/com/dt/spark/SparkApps/cores line 1 Java Problem

  1.)关于A master URL must be set in your configuration的解决.

   [1]创建sparkcontext,sparksession等需要放在main函数内,因为每个spark应用都对应一个main函数.

   [2]如果是本地运行,则需要增加”local”的指定.

      <写法1>

SparkConf conf = new SparkConf().setMaster("local").setAppName("wc");

JavaSparkContext sc = new JavaSparkContext(conf);

JavaRDD<String> text = text = sc.textFile(args[0]);

// text=sc.textFile("hdfs://master:9000/user/hadoop/input/test");

      <写法2>

       SparkSession spark = SparkSession.builder().appName("JavaWordCount").master("local").getOrCreate();

JavaRDD<String> lines = spark.read().textFile(args[0]).javaRDD();

 

    

  1.3)调整spark的常用配置与关键对象.

spark的配置在:/spark安装目录/conf/spark-defaults.conf  //没有的话从template中复制一份改名.

[1]spark各项配置的解释:

https://www.cnblogs.com/riordon/p/5732208.html

[2]基于虚拟机处理spark的节点.

https://blog.csdn.net/guoning_scdn/article/details/45226787

 1. )SetMaster设置节点.

根据上面的解释,setMaster主要是连接主节点,如果参数是"local",则在本地用单线程运行spark,如果是 local[4],则在本地用4核运行,如果设置为spark://master:7077,就是作为单节点运行,而setAppName就是在web端显示应用名而已.

  2. )SparkContextSparkSession.

 [SparContext]

任何Spark程序都是SparkContext开始的,SparkContext的初始化需要一个SparkConf对象,SparkConf包含了Spark集群配置的各种参数。

初始化后,就可以使用SparkContext对象所包含的各种方法来创建和操作RDD和共享变量

[SparkSession]

Apache Spark2.0 引入了SparkSession,其为用户提供了一个统一的切入点来使用Spark的各项功能,并且允许用户通过它调用DataFrameDataset相关API来编写Spark程序。最重要的是,它减少了用户需要了解的一些概念,使得我们可以很容易地与Spark交互,SparkSession中封装了SparkContext,SparkConf,为了解决用户可能对SparkContext的混乱(不知道当时使用的哪一个Context),使用的时候就和SparkContext差不多 .

 

3. )mapflatmap.

   map:对集合中每个元素进行操作.

flatMap:对集合中每个元素进行操作然后再扁平化。 

4. )reduceByKeygroupByKey.

 

  返回值类型不同:reduceByKey返回的是RDD[(K, V)],而groupByKey返回的是RDD[(K, Iterable[V])],举例来说这两者的区别。比如含有一下数据的rdd应用上面两个方法做求和:(a,1,(a,2),(a,3),(b,1),(b,2),(c,1);reduceByKey产生的中间结果(a,6),(b,3),(c,1);groupByKey产生的中间结果结果为((a,1)(a,2)(a,3),((b,1)(b,2)),(c,1),(以上结果为一个分区中的中间结果)可见groupByKey的结果更加消耗资源 .

5)将jar程序发到指定节点上去执行.

[参考]https://www.cnblogs.com/zdfjf/p/5175566.html

[1]Spark应用程序第三方jar文件依赖解决方案.

最终解决方案:将第三方的jar文件copy${HADOOP_HOME}/share/hadoop/common/lib文件夹中(Hadoop集群中所有机器均要求copy)

    [参考]https://www.cnblogs.com/dinghong-jo/p/7873646.html

 

[方案1.命令]

 当然也可以把这个工程打包成jar包,放在spark集群上运行,比如我打成jar包的名称是WordCount.jar

运行命令:/usr/local/spark/bin/spark-submit --master local --class cn.spark.test.WordCount /home/hadoop/Desktop/WordCount.jar

参考资料