五、 Spark角色介绍

Spark是基于内存计算的大数据并行计算框架。因为其基于内存计算,比Hadoop中MapReduce计算框架具有更高的实时性,同时保证了高效容错性和可伸缩性。从2009年诞生于AMPLab到现在已经成为Apache顶级开源项目,并成功应用于商业集群中,学习Spark就需要了解其架构。

Spark架构图如下:

Spark架构使用了分布式计算中master-slave模型,master是集群中含有master进程的节点,slave是集群中含有worker进程的节点。

u  Driver Program :运⾏main函数并且新建SparkContext的程序。

u  Application:基于Spark的应用程序,包含了driver程序和集群上的executor。

u  Cluster Manager:指的是在集群上获取资源的外部服务。目前有三种类型

(1)Standalone: spark原生的资源管理,由Master负责资源的分配

(2)Apache Mesos:与hadoop MR兼容性良好的一种资源调度框架

(3)Hadoop Yarn: 主要是指Yarn中的ResourceManager

u  Worker Node: 集群中任何可以运行Application代码的节点,在Standalone模式中指的是通过slaves文件配置的Worker节点,在Spark on Yarn模式下就是NodeManager节点

u  Executor:是在一个worker node上为某应用启动的⼀个进程,该进程负责运行任务,并且负责将数据存在内存或者磁盘上。每个应用都有各自独立的executor。

u  Task :被送到某个executor上的工作单元。

六、 初识Spark程序

6.1 执行第一个spark程序

普通模式提交任务:

bin/spark-submit \

--class org.apache.spark.examples.SparkPi \

--master spark://node1:7077 \

--executor-memory 1G \

--total-executor-cores 2 \

examples/jars/spark-examples_2.11-2.1.3.jar \

10

--class :指定程序的主类
--master:指定master地址
--executor-memory :指定每一个executor需要的内存大小
--total-executor-cores :执行总的cpu核数

该算法是利用蒙特·卡罗算法求圆周率PI,通过计算机模拟大量的随机数,最终会计算出比较精确的π。

高可用模式提交任务:

在高可用模式下,因为涉及到多个Master,所以对于应用程序的提交就有了一点变化,因为应用程序需要知道当前的Master的IP地址和端口。这种HA方案处理这种情况很简单,只需要在SparkContext指向一个Master列表就可以了,

如spark://host1:port1,host2:port2,host3:port3,应用程序会轮询列表,找到活着的Master。

bin/spark-submit \

--class org.apache.spark.examples.SparkPi \

--master spark://node1:7077,node2:7077,node3:7077 \

--executor-memory 1G \

--total-executor-cores 2 \

examples/jars/spark-examples_2.11-2.1.3.jar \

10

在高可用模式下提交任务,需要把所有的master地址进行罗列
--master spark://node1:7077,node2:7077,node3:7077
后期程序后依次轮询整个master列表,最后找到活着的master,然后向这个活着的master去提交任务。

6.2 启动Spark-Shell

spark-shell是Spark自带的交互式Shell程序,方便用户进行交互式编程,用户可以在该命令行下用scala编写spark程序。

6.2.1 运行spark-shell --master local[N] 读取本地文件

单机模式:通过本地N个线程跑任务,只运行一个SparkSubmit进程。

  • -master local[N]

    • local表示本地运行,跟集群没有任何关系,方便做一些测试和学习

    • N 表示一个正整数

    • local[N] 表示本地采用N个线程去运行任务

  • spark-shell --master local[2]

    • 它会产生一个SparkSubmit进程

(1)需求

读取本地文件,实现文件内的单词计数。本地文件words.txt 内容如下:

hello me

hello you

hello her

(2)运行spark-shell --master local[2]

观察启动的进程:

(3)编写scala代码:

sc.textFile("file:///root/words.txt").flatMap(x=>x.split(" ")).map(x=>(x,1)).reduceByKey((x,y)=>x+y).collect

sc.textFile("file:///root///words.txt").flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_).collect

代码说明:

sc:Spark-Shell中已经默认将SparkContext类初始化为对象sc。用户代码如果需要用到,则直接应用sc即可。

textFile:读取数据文件

flatMap:对文件中的每一行数据进行压平切分,这里按照空格分隔。

map:对出现的每一个单词记为1(word,1)

reduceByKey:对相同的单词出现的次数进行累加

collect:触发任务执行,收集结果数据。

(4)观察结果:

6.2.2 运行spark-shell --master local[N] 读取HDFS上数据

(1)、整合spark和HDFS,修改配置文件

在spark-env.sh ,添加HADOOP_CONF_DIR配置,指明了hadoop的配置文件后,默认它就是使用的hdfs上的文件

export HADOOP_CONF_DIR=/export/servers/hadoop/etc/hadoop

(2)、再启动启动hdfs,然后重启spark集群

(3)、向hdfs上传一个文件到hdfs://node1:9000/words.txt

(4)、在spark shell中用scala语言编写spark程序:

sc.textFile("/words.txt").flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_).collect

6.2.3 运行spark-shell 指定具体的master地址

(1)需求:

spark-shell运行时指定具体的master地址,读取HDFS上的数据,做单词计数,然后将结果保存在HDFS上。

(2)执行启动命令:

spark-shell \

--master spark://node1:7077 \

--executor-memory 1g \

--total-executor-cores 2

参数说明:

--master spark://node1:7077 指定Master的地址

--executor-memory 1g 指定每个worker可用内存为1g

--total-executor-cores 2 指定整个集群使用的cup核数为2个

注意:

如果启动spark shell时没有指定master地址,但是也可以正常启动spark shell和执行spark shell中的程序,其实是启动了spark的local模式,该模式仅在本机启动一个进程,没有与集群建立联系。

(2)编写scala代码:

saveAsTextFile:保存结果数据到文件中:

sc.textFile("/words.txt").flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_).saveAsTextFile("/wc")

(3)查看hdfs上结果:

6.3在IDEA中编写WordCount程序

spark-shell仅在测试和验证我们的程序时使用的较多,在生产环境中,通常会在IDEA中编写程序,然后打成jar包,最后提交到集群。最常用的是创建一个Maven项目,利用Maven来管理jar包的依赖。

(1).创建一个项目

(2).选择Maven项目,然后点击next

(3).填写maven的GAV,然后点击next

(4)填写项目名称,然后点击finish

(5).创建好maven项目后,点击Enable Auto-Import

(6)配置Maven的pom.xml

详见代码。
(7)添加src/main/scala和src/test/scala,与pom.xml中的配置保持一致

(8)新建一个scala class,类型为Object

(9).编写spark程序:

详见代码。

(10).使用Maven打包:

点击idea右侧的Maven Project选项

点击Lifecycle,选择package,然后点击Run Maven Build

(11).选择编译成功的jar包,并将该jar上传到Spark集群中的某个节点上

(12).首先启动hdfs和Spark集群

启动hdfs

/export/servers/hadoop/sbin/start-dfs.sh

启动spark

/export/servers/spark/sbin/start-all.sh

(13).使用spark-submit命令提交Spark应用(注意参数的顺序)

spark-submit \

--class cn.test.spark.WordCount \

--master spark://node1:7077 \

--executor-memory 1g \

--total-executor-cores 2 \

/root/spark-1.0-SNAPSHOT.jar \

/words.txt \

/spark_out

这里通过spark-submit提交任务到集群上。用的是spark的Standalone模式

Standalone模式是Spark内部默认实现的一种集群管理模式,这种模式是通过集群中的Master来统一管理资源。

1)        查看Spark的web管理界面

地址: 192.168.200.160:8080

2)        查看HDFS上的结果文件

hdfs dfs -cat /spark_out/part*

(hello,4)

(me,2)

(you,3)

(her,1)

6.4 使用java语言编写spark wordcount程序

  详见代码。

Spark入门:第4节 Spark程序:1 - 9的更多相关文章

  1. Spark入门(七)--Spark的intersection、subtract、union和distinc

    Spark的intersection intersection顾名思义,他是指交叉的.当两个RDD进行intersection后,将保留两者共有的.因此对于RDD1.intersection(RDD2 ...

  2. Spark入门(六)--Spark的combineByKey、sortBykey

    spark的combineByKey combineByKey的特点 combineByKey的强大之处,在于提供了三个函数操作来操作一个函数.第一个函数,是对元数据处理,从而获得一个键值对.第二个函 ...

  3. Spark入门实战系列--2.Spark编译与部署(上)--基础环境搭建

    [注] 1.该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取: 2.Spark编译与部署将以CentOS 64位操作系统为基础,主要是考虑到实际应用 ...

  4. Spark入门实战系列--3.Spark编程模型(上)--编程模型及SparkShell实战

    [注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 .Spark编程模型 1.1 术语定义 l应用程序(Application): 基于Spar ...

  5. Spark入门实战系列--3.Spark编程模型(下)--IDEA搭建及实战

    [注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 . 安装IntelliJ IDEA IDEA 全称 IntelliJ IDEA,是java语 ...

  6. Spark入门实战系列--1.Spark及其生态圈简介

    [注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 .简介 1.1 Spark简介 年6月进入Apache成为孵化项目,8个月后成为Apache ...

  7. Spark入门实战系列--2.Spark编译与部署(中)--Hadoop编译安装

    [注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 .编译Hadooop 1.1 搭建环境 1.1.1 安装并设置maven 1. 下载mave ...

  8. Spark入门实战系列--2.Spark编译与部署(下)--Spark编译安装

    [注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 .编译Spark .时间不一样,SBT是白天编译,Maven是深夜进行的,获取依赖包速度不同 ...

  9. Spark入门实战系列--4.Spark运行架构

    [注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 1. Spark运行架构 1.1 术语定义 lApplication:Spark Appli ...

  10. Spark入门实战系列--7.Spark Streaming(上)--实时流计算Spark Streaming原理介绍

    [注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 .Spark Streaming简介 1.1 概述 Spark Streaming 是Spa ...

随机推荐

  1. unittest 改装框架ascii 排序执行用例,按照自己书写先后顺序执行

    设计思路: 获取成员变量class.__dict__.keys() filter过滤符合要求成员,由于3.x成员dict属性是支持有序的 # coding=utf-8import unittestfr ...

  2. 获取表格数据转换为JSON字符串

    核心代码JavaScript代码: 方法一 function sc () { var myTable=document.getElementById("myTable"); //获 ...

  3. 使用node.js实现多人聊天室(socket.io、B/S)

    通过B/S架构实现多人聊天,客户端连接服务器,发送信息,服务器接收信息之后返回给客户端. 主要是通过socket.io实现浏览器和服务器之间进行实时,双向和基于事件的通信. socket.io官方文档 ...

  4. 使用Log4net记录日志(非常重要)

    使用Log4net记录日志   首先说说为什么要进行日志记录.在一个完整的程序系统里面,日志系统是一个非常重要的功能组成部分.它可以记录下系统所产生的所有行为,并按照某种规范表达出来.我们可以使用日志 ...

  5. 基于SILVACO ATLAS的a-IGZO薄膜晶体管二维器件仿真(05)

    关于特性曲线的输出调整: 初代版本 material material=igzo eg300=3.5 nc300=8.5e21 nv300=8.5e21 taun0=1e-9 taup0=1e-9 a ...

  6. Jenkins+Maven+Github+Springboot实现可持续自动部署(非常详细)

    目前公司开发的项目已经部署到服务器上,部署项目的测试环境和生产环境,加上每个项目n个服务,于是我就 , 骚就是骚,但是就是太累了,于是花点时间研究了一下Jenkins. Jenkins的作用和它的lo ...

  7. java中4种常用线程池

    一.线程池 线程池:说白了,就是一种线程使用模式.线程过多会带来调度开销,进而影响整体性能.而线程池维护着多个线程,等待着监督管理者分配可并发执行的任务,这避免了在处理短时间任务时创建与销毁线程的代价 ...

  8. Net Core解决ZipFile解压中文出现乱码

    一.在main方法中添加 Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); 二.解压添加 //sourceArchiveFi ...

  9. spark实验(二)--eclipse安装scala环境(2)

    此次在eclipse中的安装参考这篇博客https://blog.csdn.net/lzxlfly/article/details/80728772 Help->Eclipse Marketpl ...

  10. idea 创建maven子父工程

    1.创建maven工程: 2. 创建工程名称: 3.删除父工程下的src文件夹,指定打包方式为pom,添加maven依赖: 4.右键项目添加子工程: 5.添加子工程名称: 6.子工程创建成功: 7.依 ...