Spark
开头别的不多说了,就说Spark为啥存在。他来到这就是为了代替MapReduce的!
MR的缺点
为啥要被代替呢?学过Hadoop知道,Hadoop早期,MR是基于数据集的计算,面向的是数据。基本运算规则是从存储介质中采集数据,然后进行计算,所以它的计算往往是一次性的,这就存在一定的局限性,不适用于数据挖掘和机器学习这样的迭代计算和图形挖掘计算。而且因为文件存储,性能不好!MR和Hadoop耦合,没法换。
后来Hadoop 2.x 就引入了Yarn,这个东西好啊,资源管理器RM(ResourceManager)。这里面有AM(ApplicationMaster)就是应用管理器,AM中的Driver管理NodeManager中的Task。
也就是说:
RM现在管理NodeManager,其中的Driver管理Task,这样实现了解耦。所以这个Task不一定非要是MR任务,此时变成Spark任务或者Flink任务或者Strom任务,都可以!
引入了container,虽然增加了内存的消耗,但是大大提高了扩展性,于是Spark、Flink、Strom才可以搭配使用。
Spark为啥适合?
基于内存计算,由Scala语言开发。
Spark重要角色
1.Driver 驱动器
是执行程序main方法的进程。负责执行SparkContext、创建RDD、以及RDD转化操作和行动操作代码的执行。如果启动Spark Shell,系统会后台启动一个Spark Driver程序就是在Spark Shell中预加载一个SparkContext叫sc。如果驱动器程序终止,那么Spark应用也结束。工作:
- 把用户程序转为JOB
- 跟踪Executor的运行状况
- 为执行器节点调度任务
- UI展示运行情况
2.Executor 执行器
是一个工作进程,负责在Spark作业中运行任务,任务间相互独立。Spark应用启动时,Executor节点被同时启动,伴随Spark应用整个生命周期。如果有Executor节点故障或崩溃,Spark应用也可以继续执行,会将出错节点上的任务调度到其他Executor节点。工作:
- 负责运行组成Spark应用的任务,并将结果返回给驱动器进程
- 通过自身的块管理器(Block Manager)为用户程序中要求缓存的RDD提供内存式存储。RDD是直接缓存在Executor进程内的,所以任务可以再运行时充分利用缓存数据,加速运算。
Spark Yarn-cluster搭建
前提是HDFS和YARN集群正常启动了!
1.先去配置hadoop的yarn-site.xml
是否启动一个线程检查每个任务使用虚拟内存量,如果超出分配值,则直接kill掉,默认true:
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
是否启动一个线程检查每个任务使用物理内存量,如果超出分配值,则直接kill掉,默认true:
<property>
<name>yarn.nodemanager.pmem-check-enabled</name>
<value>false</value>
</property>
2.修改spark-env.sh 添加如下配置
YARN_CONF_DIR=/opt/soft/hadoop-2.7.1/etc/hadoop
去找自己的路径,别乱复制!
3.分发配置文件
把这个配置文件给Slave1和Slave2(其实不发也行,Yarn模式的话一个机器能发Spark就足够了)
4.试一下例子
bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master yarn \
--deploy-mode client \
./examples/jars/spark-examples_2.11-2.4.1.jar \
100
日志查看
1.修改配置文件spark-defaults.conf
添加内容:
spark.yarn.historyServer.address=Master:10020
spark.history.ui.port=19888
端口别乱填!根据自己hadoop的mapred-site.xml的配置去对应填写!!!
2.重启Spark历史服务
./sbin/stop-history-server.sh
./sbin/start-history-server.sh
3.提交个任务到YARN看效果
bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master yarn \
--deploy-mode client \
./examples/jars/spark-examples_2.11-2.4.1.jar \
100
这回看日志。
YARN部署运行流程:
1.Client 提交任务
2.RM创建ApplicationMaster
3.AM向RM申请资源
4.RM向AM提供资源列表
5.AM选择NM节点并创建Spark执行器对象
6.被选中的NM节点Executor反向注册,通知AM已经准备好执行了。
7.AM分解并调度任务
Spark提交
1.基本语法
bin/spark-submit \
--class <main-class> \
--master <master-url> \
--deploy-mode <deploy-mode> \
--conf<key>=<value> \
... # other options <application-jar> \
[application-arguments]
2.参数说明
--master:指定的Master地址,默认为Local
--class:你的应用启动类 (例如:org.apache.spark.examples.SparkPi)
--deploy-mode:是否发布你的驱动到worker节点(cluster)或者作为本地客户端client。默认是client
--conf:任意的Spark配置属性,格式key=value,如果值包含空格,可以加引号"key=value"。
application-jar:打包好的应用jar包含依赖,这个URL在集群全局可见。
application-argument:传给main方法的参数
--executor-memory 1G 指定每个Executor可用内存1G
写程序
IDEA创建maven项目,然后POM:
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>com.george.sparktest</groupId>
<artifactId>sparktest</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.12</artifactId>
<version>2.4.1</version>
</dependency>
</dependencies>
<build>
<finalName>WordCount</finalName>
<plugins>
<plugin>
<groupId>net.alchim31.maven</groupId>
<artifactId>scala-maven-plugin</artifactId>
<version>3.2.2</version>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>testCompile</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.0.0</version>
<configuration>
<archive>
<manifest>
<mainClass>WordCount</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
纯属手敲。。。
然后可以使用Scala开发了。后面可以把程序打成jar包。
idea能看target文件夹里面,有个with-dependencies.jar这个很大,因为依赖都打进去了。
Windows在运行hadoop相关的时候可能会有报错!是个winutils.exe啥啥的,其实不影响我们使用,那个问题主要是源码里有一段这个:
String home = System.getProperty("hadoop.home.dir");
一看就是环境变量的事,HADOOP_HOME为空的话,就会null\bin\winutils.exe。找不到。
所以下载一个common的jar包。配置好环境变量。path添加上%HADOOP_HOME%\bin
听说需要重启???
或者还有一个办法:
我们写程序的时候前面加上
System.setProperty("hadoop.home.dir", "D:\\hadoop")
等打包的时候把这个干掉就完事了。。。但是这个要记得删!!!!!!千万别忘!!!!