-- 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://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.spark,artifact 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框架及基础.
spark的4种编程模型.
目前Spark的运行模式主要有以下几种:
1.)local:主要用于开发调试Spark应用程序
2.)Standlone:利用Spark自带的资源管理与调度器运行Spark集群,采用Master/Slave结构,为解决单点故障,可以采用Xookeeper实现高可靠(High Availability, HA)
3.)Apache Mesos:运行在著名的Mesos资源管理框架基础之上,该集群运行模式将资源管理管理交给Mesos,Spark只负责运行任务调度和计算
4.)Hadoop YARN:集群运行在Yarn资源管理器上,资源管理交给YARN,Spark只负责进行任务调度和计算
Spark运行模式中Hadoop YARN的集群方式最为常用,前面一章关于Spark集群搭建就是采用的YARN模式。
[参考]https://www.cnblogs.com/miqi1992/p/5621268.html
Spark的处理流程.
每个Spark应用都由一个驱动器程序(drive program)来发起集群上的各种并行操作。驱动器程序包含应用的main函数,驱动器负责创建SparkContext,SparkContext可以与不同种类的集群资源管理器(Cluster Manager),例如Hadoop YARN,Mesos进行通信,获取到集群进行所需的资源后,SparkContext将
得到集群中工作节点(Worker Node)上对应的Executor(不同的Spark程序有不同的Executor,他们之间是相互独立的进程,Executor为应用程序提供分布式计算以及数据存储功能),之后SparkContext将应用程序代码发送到各Executor,最后将任务(Task)分配给executors执行
ClusterManager:在Standalone模式中即为Master节点(主节点),控制整个集群,监控Worker.在YARN中为ResourceManager
Worker:从节点,负责控制计算节点,启动Executor或Driver。在YARN模式中为NodeManager,负责计算节点的控制。
Driver:运行Application的main()函数并创建SparkContect。
Executor:执行器,在worker node上执行任务的组件、用于启动线程池运行任务。每个Application拥有独立的一组Executor。
SparkContext:整个应用的上下文,控制应用的生命周期。
RDD:Spark的计算单元,一组RDD可形成执行的有向无环图RDD Graph。
DAG Scheduler:根据作业(Job)构建基于Stage的DAG,并提交Stage给TaskScheduler。
TaskScheduler:将任务(Task)分发给Executor。
SparkEnv:线程级别的上下文,存储运行时的重要组件的引用。
SparkEnv内构建并包含如下一些重要组件的引用。
1、MapOutPutTracker:负责Shuffle元信息的存储。
2、BroadcastManager:负责广播变量的控制与元信息的存储。
3、BlockManager:负责存储管理、创建和查找快。
4、MetricsSystem:监控运行时性能指标信息。
5、SparkConf:负责存储配置信息。
Spark的整体流程
1、Client提交应用。
2、Master找到一个Worker启动Driver
3、Driver向Master或者资源管理器申请资源,之后将应用转化为RDD Graph
4、再由DAGSchedule将RDD Graph转化为Stage的有向无环图提交给TaskSchedule。
5、再由TaskSchedule提交任务给Executor执行。
6、其它组件协同工作,确保整个应用顺利执行。
Spark on Yarn流程:
1、基于YARN的Spark作业首先由客户端生成作业信息,提交给ResourceManager。
2、ResourceManager在某一NodeManager汇报时把AppMaster分配给NodeManager。
3、NodeManager启动SparkAppMaster。
4、SparkAppMastere启动后初始化然后向ResourceManager申请资源。
5、申请到资源后,SparkAppMaster通过RPC让NodeManager启动相应的SparkExecutor。
6、SparkExecutor向SparkAppMaster汇报并完成相应的任务。
7、SparkClient会通过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)本地运行spark的demo.
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. )SparkContext与SparkSession.
[SparContext]
任何Spark程序都是SparkContext开始的,SparkContext的初始化需要一个SparkConf对象,SparkConf包含了Spark集群配置的各种参数。
初始化后,就可以使用SparkContext对象所包含的各种方法来创建和操作RDD和共享变量
[SparkSession]
Apache Spark2.0 引入了SparkSession,其为用户提供了一个统一的切入点来使用Spark的各项功能,并且允许用户通过它调用DataFrame和Dataset相关API来编写Spark程序。最重要的是,它减少了用户需要了解的一些概念,使得我们可以很容易地与Spark交互,在SparkSession中封装了SparkContext,SparkConf等,为了解决用户可能对SparkContext的混乱(不知道当时使用的哪一个Context),使用的时候就和SparkContext差不多 .
3. )map与flatmap.
map:对集合中每个元素进行操作.
flatMap:对集合中每个元素进行操作然后再扁平化。
4. )reduceByKey与groupByKey.
返回值类型不同: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
最终解决方案:将第三方的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