大数据学习day18----第三阶段spark01--------0.前言(分布式运算框架的核心思想,MR与Spark的比较,spark可以怎么运行,spark提交到spark集群的方式)1. spark(standalone模式)的安装 2. Spark各个角色的功能 3.SparkShell的使用,spark编程入门(wordcount案例)

时间:2022-10-22 22:06:47

0.前言

0.1  分布式运算框架的核心思想(此处以MR运行在yarn上为例)  

  提交job时,resourcemanager(图中写成了master)会根据数据的量以及工作的复杂度,解析工作量,从而产生任务(有多少个MapTask以及多少个ReduceTask),然后根据各个nodemanage节点资源情况进行任务划分。最后得到结果存入hdfs中或者是数据库中

大数据学习day18----第三阶段spark01--------0.前言(分布式运算框架的核心思想,MR与Spark的比较,spark可以怎么运行,spark提交到spark集群的方式)1. spark(standalone模式)的安装 2. Spark各个角色的功能 3.SparkShell的使用,spark编程入门(wordcount案例)

注意:由图可知,map任务和reduce任务在不同的节点上,那么reduce是如何获取经过map处理的数据呢?======>shuffle

0.2 MR与Spark的简单比较

  mapreduce:读--处理---写磁盘---读---处理---写磁盘。。。。。

  spark:读---处理---处理---处理---结果(需要的时候)写磁盘   基于内存计算

  Spark在借鉴了MapReduce之上发展而来的,继承了其分布式并行计算的优点并改进了MapReduce明显的缺陷(频繁的与磁盘进行IO交互)

0.3 spark可以怎么运行

  • 本地单机测试模拟分布式运行
  • yarn等分布式资源调度平台上运行
  • 自带的分布式资源调度平台(standalone)  

       启动standalone集群需要做两件事:(1)在master机器上./sbin/start-master.sh (2)启动一个或多个worker节点并把它注册到master节点上:./sbin/start-slave.sh

大数据学习day18----第三阶段spark01--------0.前言(分布式运算框架的核心思想,MR与Spark的比较,spark可以怎么运行,spark提交到spark集群的方式)1. spark(standalone模式)的安装 2. Spark各个角色的功能 3.SparkShell的使用,spark编程入门(wordcount案例)

其中,Standalone用的比较少,其一般适合几十台节点的集群,若是上千台机器的话就用yarn。

0.4 spark程序提交到spark集群的方式

  • 交互式连接窗口(spark shell)  

  spark-shell和spark-shell  --master spark://feng05:7070区别:前者是本地单节点运行,后者是在集群上多节点运行

  比如3.3中就是多借点的wc运算,若是在spark-shell,则为本地测试(单节点,其也有个监控web,端口为4040)

  • spark-submit(写好程序,打包)
spark-submit --master spark://feng05:7077 --class com.doit.spark01.SparkSubmitWC /root/wc.jar
  • 本地测试使用,idea软件写程序的main方法

1. spark(standalone模式)的安装

(1)下载spark安装包(spark官网)

(2)上传spark安装包到Linux服务器上

(3)解压spark安装包

tar -zxvf spark-2.3.3-bin-hadoop2.7.tgz -C /usr/apps/

(4)将conf目录下的spark-env.sh.template重命名为spark-env.sh,并修改内容如下(配置master节点)

export JAVA_HOME=/usr/apps/jdk1.8.0_192
export SPARK_MASTER_HOST=feng05
export SPARK_MASTER_PORT=7077

在编辑内容的过程中,想查看某个路径命令(此处在编辑时想知道JAVA_HOM对应的路径):

: r! echo $JAVA_HOME //  在命令行模式按出“:”

(5)将conf目录下的slaves.template重命名为slaves并修改,指定Worker的所在节点

feng02
feng03

(6)分发(将配置好的spark拷贝到其他节点)

for i in {2..3}; do scp -r spark-2.3.3  node-$i.51doit.cn:$PWD; done  // 第一种方式

scp -r spark-2.3.3-bin-hadoop2.7 feng02:$PWD  // 以前一直用的方式

(7)启动(注意,此处就别配置环境变量了,否则当使用start-all.sh时,就会与hadoop中的该命令起冲突

  • 在spark的安装目录执行启动脚本
sbin/start-all.sh
  • 执行jps命令查看Java进程

  在feng05上用可看见Master进程,在其他节点上用可看见Worker

  • 访问Master的web管理界面,端口8080

 2. Spark各个角色的功能

  •  Master:是一个Java进程,接收Worder的注册信息和心跳、移除异常超时的Worker、接收客户端提交的任务、负责资源调度、命令Worker启动Executor。
  • Worker:是一个java进程,负责管理当前节点的资源关联,向Master注册并定期发送心跳,负责启动Executor、并监控Executor的状态
  • SparkSubmit:是一个java进程,负责向Master提交任务
  • Driver:是很多类的统称,可以认为SparkContext就是Driver,client模式Driver运行在SparkSubmit进程中,cluster模式单独运行在一个进程中,负责将用户编写的代码转成Tasks,然后调度到Executor中执行,并监控Task的状态和执行进度
  • Exeutor: 是一个java进程,负责执行Driver端生成的Task,将Task放入线程中运行

大数据学习day18----第三阶段spark01--------0.前言(分布式运算框架的核心思想,MR与Spark的比较,spark可以怎么运行,spark提交到spark集群的方式)1. spark(standalone模式)的安装 2. Spark各个角色的功能 3.SparkShell的使用,spark编程入门(wordcount案例)

 3.SparkShell的使用

3.1 什么是Spark Shell

  spark shell是spark中的交互式命令行客户端,可以在spark shell中使用scala编写spark程序,启动后默认已经创建了SparkContext,别名为sc

3.2 启动Spark Shell

/usr/apps/spark-2.3.3-bin-hadoop2.7/bin/spark-shell --master spark://feng01:7077 --executor-memory 800m --total-executor-cores 3

此处自己犯的小错误:将"--" 少写了一个"-"

参数说明:

--master:指定master的地址和端口,协议为spark://,端口是RPC的通信端口

--executor-memory: 指定每一个executor的使用的内存大小

--total-executor-cores:指定整个application总共使用了多少cores

大数据学习day18----第三阶段spark01--------0.前言(分布式运算框架的核心思想,MR与Spark的比较,spark可以怎么运行,spark提交到spark集群的方式)1. spark(standalone模式)的安装 2. Spark各个角色的功能 3.SparkShell的使用,spark编程入门(wordcount案例)

 注意:

(1)在spark中,提交一个job之后会造每一个worker上生成一个executor(若不配置核数,默认是占用该节点所有的core以及1G的内存)

(2)standalone模式只能指明整个集群executor的core数(on yarn模式可以指定单个executor的core数),若指定的core数超过机器的core数,集群中的executor会以最大的core来运行,若是内存指定的超过节点本身的内存大小,则任务会被阻塞,知道节点有足够大的内存才会被执行。

 3.3 在shell中编写第一个spark程序(WordCount,单词统计)

sc.textFile("hdfs://feng05:9000/words.txt").flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_).sortBy(_._2,false).saveAsTextFile("hdfs://feng05:9000/out1")

 4. Spark编程入门

 4.1 在IDEA中使用scala编写wordcount案例(本地运行模式)

map和flatmap(切分压平)的区别:

大数据学习day18----第三阶段spark01--------0.前言(分布式运算框架的核心思想,MR与Spark的比较,spark可以怎么运行,spark提交到spark集群的方式)1. spark(standalone模式)的安装 2. Spark各个角色的功能 3.SparkShell的使用,spark编程入门(wordcount案例)

大数据学习day18----第三阶段spark01--------0.前言(分布式运算框架的核心思想,MR与Spark的比较,spark可以怎么运行,spark提交到spark集群的方式)1. spark(standalone模式)的安装 2. Spark各个角色的功能 3.SparkShell的使用,spark编程入门(wordcount案例)

words.txt内容如下:

大数据学习day18----第三阶段spark01--------0.前言(分布式运算框架的核心思想,MR与Spark的比较,spark可以怎么运行,spark提交到spark集群的方式)1. spark(standalone模式)的安装 2. Spark各个角色的功能 3.SparkShell的使用,spark编程入门(wordcount案例)

统计代码如下

object WordCount {
def main(args: Array[String]): Unit = {
// val conf: SparkConf = new SparkConf().setAppName("WordCount")
//Spark程序local模型运行,local[*]是本地运行,并开启多个线程
val conf: SparkConf = new SparkConf()
.setAppName("WordCount")
.setMaster("local[*]") //设置为local模式执行
// 1 创建SparkContext,使用SparkContext来创建RDD
val sc: SparkContext = new SparkContext(conf)
// spark写Spark程序,就是对神奇的大集合【RDD】编程,调用它高度封装的API
// 2 使用SparkContext创建RDD
val lines: RDD[String] = sc.textFile("E:/javafile/words.txt")
// 3 切分压平
val words: RDD[String] = lines.flatMap(line => line.split(" "))
// 4 将单词和1组合放在元组中
val wordAndOne: RDD[(String, Int)] = words.map((_, 1))
// 5 分组聚合,reduceByKey可以先局部聚合再全局聚合
val reduced: RDD[(String, Int)] = wordAndOne.reduceByKey(_ + _)
// 6 排序
val sorted: RDD[(String, Int)] = reduced.sortBy(_._2, false) // 调用Action将计算结果保存
sorted.saveAsTextFile("E:/javafile/wc/out1")
// 释放资源
sc.stop()
}
}

4.2 在IDEA中使用JAVA编写wordcount案例

(1)不使用lambda

将该程序打包上传集群中测试

代码

public class WordCount1 {
public static void main(String[] args) {
// 创建JavaSparkContext
SparkConf sparkConf = new SparkConf().setAppName("JavaWordCount");
JavaSparkContext jsc = new JavaSparkContext(sparkConf);
// 使用javaSparkContent创建RDD
JavaRDD<String> lines = jsc.textFile(args[0]);
//调用Tranformation(s)
// 切分压平(这块不太懂)
JavaRDD<String> words = lines.flatMap(new FlatMapFunction<String, String>() {
@Override
public Iterator<String> call(String line) throws Exception {
return Arrays.asList(line.split(" ")).iterator();
}
});
// 将单词与1组合放到元组中去
JavaPairRDD<String, Integer> wordAndOne = words.mapToPair(new PairFunction<String, String, Integer>() {
@Override
public Tuple2<String, Integer> call(String word) throws Exception {
return Tuple2.apply(word, 1);
}
});
// 分组聚合
JavaPairRDD<String, Integer> reduced = wordAndOne.reduceByKey(new Function2<Integer, Integer, Integer>() {
@Override
public Integer call(Integer v1, Integer v2) throws Exception {
return v1 + v2;
}
});
// 排序,按key的值倒叙排列
// 由于java中的JavaPairRDD无按值排序的方法,所以先调换kv的顺序
JavaPairRDD<Integer, String> swapped = reduced.mapToPair(new PairFunction<Tuple2<String, Integer>, Integer, String>() {
@Override
public Tuple2<Integer, String> call(Tuple2<String, Integer> tp) throws Exception {
return tp.swap();
}
});
// 排序
JavaPairRDD<Integer, String> sorted = swapped.sortByKey(false);
// 将kv的顺序调换回来
JavaPairRDD<String, Integer> res = sorted.mapToPair(new PairFunction<Tuple2<Integer, String>, String, Integer>() {
@Override
public Tuple2<String, Integer> call(Tuple2<Integer, String> tp) throws Exception {
return tp.swap();
}
});
// 触发Action,将数据保存到HDFS
res.saveAsTextFile(args[1]);
}
}

运行命令

大数据学习day18----第三阶段spark01--------0.前言(分布式运算框架的核心思想,MR与Spark的比较,spark可以怎么运行,spark提交到spark集群的方式)1. spark(standalone模式)的安装 2. Spark各个角色的功能 3.SparkShell的使用,spark编程入门(wordcount案例)

(2)使用lambda

大数据学习day18----第三阶段spark01--------0.前言(分布式运算框架的核心思想,MR与Spark的比较,spark可以怎么运行,spark提交到spark集群的方式)1. spark(standalone模式)的安装 2. Spark各个角色的功能 3.SparkShell的使用,spark编程入门(wordcount案例)

代码

public class WordCount2 {
public static void main(String[] args) {
// 创建SparkContext
SparkConf conf = new SparkConf().setAppName("LambdaWordCount");
JavaSparkContext jsc = new JavaSparkContext(conf);
// 创建RDD
JavaRDD<String> lines = jsc.textFile(args[0]);
// 切分压平
JavaRDD<String> words = lines.flatMap(line -> Arrays.asList(line.split(" ")).iterator());
// 将得到的单词与1组合
JavaPairRDD<String, Integer> wordAndOne = words.mapToPair(word -> Tuple2.apply(word, 1));
// 分组聚合
JavaPairRDD<String, Integer> reduced = wordAndOne.reduceByKey((a, b) -> a + b);
// 按key的值进行排序
// 调换顺序
JavaPairRDD<Integer, String> swapped = reduced.mapToPair(tp -> tp.swap());
// 排序
JavaPairRDD<Integer, String> sorted = swapped.sortByKey(false);
// 再次调换顺序
JavaPairRDD<String, Integer> res = sorted.mapToPair(Tuple2::swap);
// 触发Action,将数据保存到HDFS
res.saveAsTextFile(args[1]);
}
}

tar -zxvf spark-2.3.3-bin-hadoop2.7.tgz -C /bigdata/

大数据学习day18----第三阶段spark01--------0.前言(分布式运算框架的核心思想,MR与Spark的比较,spark可以怎么运行,spark提交到spark集群的方式)1. spark(standalone模式)的安装 2. Spark各个角色的功能 3.SparkShell的使用,spark编程入门(wordcount案例)的更多相关文章

  1. 大数据理论篇 - 通俗易懂,揭秘谷歌《The Dataflow Model》的核心思想&lpar;一&rpar;

    目录 前言 目标 核心的设计原则 通用的数据处理流程 切合实际的解决方案 总结 延伸阅读 最后 作者:justmine 头条号:大数据达摩院 创作不易,未经授权,禁止转载,否则保留追究法律责任的权利. ...

  2. 大数据学习之旅2——从零开始搭hadoop完全分布式集群

    前言 本文从零开始搭hadoop完全分布式集群,大概花费了一天的时间边搭边写博客,一步一步完成完成集群配置,所以相信大家按照本文一步一步来完全可以搭建成功.需要注意的是本文限于篇幅和时间的限制,也是为 ...

  3. 大数据学习day26----hive01----1hive的简介 2 hive的安装(hive的两种连接方式,后台启动,标准输出,错误输出)3&period; 数据库的基本操作 4&period; 建表(内部表和外部表的创建以及应用场景,数据导入,学生、分数sql练习)5&period;分区表 6加载数据的方式

    1. hive的简介(具体见文档) Hive是分析处理结构化数据的工具   本质:将hive sql转化成MapReduce程序或者spark程序 Hive处理的数据一般存储在HDFS上,其分析数据底 ...

  4. Spark standalone模式的安装(spark-1&period;6&period;1-bin-hadoop2&period;6&period;tgz)(master、slave1和slave2)

     前期博客  Spark运行模式概述 Spark standalone简介与运行wordcount(master.slave1和slave2) 开篇要明白 (1)spark-env.sh 是环境变量配 ...

  5. 大数据学习day31------spark11-------1&period; Redis的安装和启动,2 redis客户端 3&period;Redis的数据类型 4&period; kafka(安装和常用命令)5&period;kafka java客户端

    1. Redis Redis是目前一个非常优秀的key-value存储系统(内存的NoSQL数据库).和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list ...

  6. 大数据学习系列之四 ----- Hadoop&plus;Hive环境搭建图文详解&lpar;单机&rpar;

    引言 在大数据学习系列之一 ----- Hadoop环境搭建(单机) 成功的搭建了Hadoop的环境,在大数据学习系列之二 ----- HBase环境搭建(单机)成功搭建了HBase的环境以及相关使用 ...

  7. 大数据学习系列之七 ----- Hadoop&plus;Spark&plus;Zookeeper&plus;HBase&plus;Hive集群搭建 图文详解

    引言 在之前的大数据学习系列中,搭建了Hadoop+Spark+HBase+Hive 环境以及一些测试.其实要说的话,我开始学习大数据的时候,搭建的就是集群,并不是单机模式和伪分布式.至于为什么先写单 ...

  8. 大数据学习(一)-------- HDFS

    需要精通java开发,有一定linux基础. 1.简介 大数据就是对海量数据进行数据挖掘. 已经有了很多框架方便使用,常用的有hadoop,storm,spark,flink等,辅助框架hive,ka ...

  9. 大数据学习之Hadoop快速入门

    1.Hadoop生态概况 Hadoop是一个由Apache基金会所开发的分布式系统集成架构,用户可以在不了解分布式底层细节情况下,开发分布式程序,充分利用集群的威力来进行高速运算与存储,具有可靠.高效 ...

随机推荐

  1. C&num;深入浅出 继承(六)

    这个标题写出来好长时间了,都没写内容,今天无论如何都得写完它,昨天写了一段,尼玛,电脑突然死机,重启之后啥都没了. 继承嘛,有人觉得很简单,但是里面还是有内容可以讲的,因为面向对象也就这么点内容,封装 ...

  2. Linux&lowbar;rsylogd日志

    Linux_日志管理介绍(一)http://www.cnblogs.com/gossip/p/5972663.html Linux_rsyslogd日志服务(二)http://www.cnblogs. ...

  3. SIFT定位算法关键步骤的说明

    1. SIFT算法中一些符号的说明 $I(x,y)$表示原图像. $G(x,y,\sigma)$表示高斯滤波器,其中$G(x,y,\sigma) = \frac{1}{2\pi\sigma^2}exp ...

  4. JS 鼠标事件大全

    一般事件 事件 浏览器支持 描述 onClick HTML: 2 | 3 | 3.2 | 4 Browser: IE3 | N2 | O3 鼠标点击事件,多用在某个对象控制的范围内的鼠标点击 onDb ...

  5. 【转】MySQL datetime数据类型设置当前时间为默认值

    转自http://blog.csdn.net/u014694759/article/details/30295285 方法一: MySQL目前不支持列的Default 为函数的形式,如达到你某列的默认 ...

  6. Python 学习笔记03篇

    看着直播,想着未赶完的工作 真的很想学好一门编程语言

  7. PS调出甜美艺术外景女生照片

    前期思路:拍摄时间大概在下午三四点左右,IOS100 f/1.8 .其实夏天最好的拍摄时间在傍晚五点这样,曝光太强片子会泛白,这张原片首先构图不是很好看,所以我要给它二次构图裁剪一下.下面是裁剪好后的 ...

  8. Ubuntu安装Gogs服务

    花了半天的时间把阿里云的centos 换成了ubuntu 14.04 lts ,原因是因为我想安装个gogs git服务,但是centos的glibc版本太低,折腾了半天没有成功. 迁移Ghost数据 ...

  9. react-native 完整实现登录功能

    react native实现登录功能,包括ui的封装.网络请求的封装.导航器的实现.点击事件. demo下载:react-native 完整实现登录功能 后台如果是springmvc实现的需要配置上如 ...

  10. 深入理解MyBatis的原理(三):配置文件(上)

    前言:前文提到一个入门的demo,从这里开始,会了解深入 MyBatis 的配置,本文讲解 MyBatis 的配置文件的用法. 目录 1.properties 元素 2.设置(settings) 3. ...