spark使用心得

spark入门

启停spark

sbin/start-all.shsbin/stop-all.sh

spark-shell

进入spark/bin目录,执行:
./spark-shell
输出中有这么一行:

Spark context Web UI available at http://xx.xx.xx.188:4040

意味着我们可以从web页面查看spark的运行情况,特别要注意的是,我们可从中看到节点的classpath,了解每个节点自带了哪些jar包。
如要查看集群各节点的信息,也可以查看http://xx.xx.xx.188:8080.

spark-shell默认运行于本地,要想运行于集群,需加上–master参数:

./spark-shell --master spark://xx.xx.xx.188:7077

helloworld

scala代码是:

object HelloWorld{def main(args: Array[String]): Unit = {//配置Spark应用名称val conf = new SparkConf().setAppName("CollectFemaleInfo")// 提交spark作业val sc = new SparkContext(conf)//读取数据。其是传入参数args(0)指定数据路径val text = sc.textFile(args(0))//筛选女性网民上网时间数据信息val data = text.filter(_.contains("female"))// 汇总每个女网民上网时间val femaleData:RDD[(String, Int)] = data.map { line =>val t = line.split(',')(t(0), t(2).toInt)}.reduceByKey(_+_)// 筛选出时间大于两小时的女网民val result = femaleData.filter(line => line._2 > 120)println("result count: " + result.count())result.collect().foreach(println)}
}

注意
1、sparkContext的textFile默认加载hdfs的文件,要处理本地文件,需加上file://前缀。用本地数据文件的话,要求spark集群里的每个节点上都有这个本地文件,否则会报文件找不到的错误。所以,方便起见,最好是将数据放到hdfs上。
2、RDD的转换(transformation,例如map、flatMap、filter等)操作都是lazy的(亦即,只是创建一个新的RDD实例,而未做任何实际计算),只有count、collect这样的行动(action)操作才会真正去求值。这跟java stream的表现是一样的。

提交jar包

将代码用maven打包为jar,接着提交给spark运行,提交本地执行的命令如下:

./spark-submit --class com.lee.ConsistencyCheck /export/home/data/com.lee.distrulechecker.service-1.0-SNAPSHOT.jar ExtArea

提交spark集群运行的命令如下:

./spark-submit --class com.lee.ConsistencyCheck --master spark://xx.xx.xx.188:7077  /export/home/data/com.lee.distrulechecker.service-1.0-SNAPSHOT.jar ExtArea./spark-submit --class com.lee.ConsistencyCheck --master spark://xx.xx.xx.188:7077 --conf spark.cores.max=5 /export/home/data/com.lee.distrulechecker.service-1.0-SNAPSHOT.jar ExtArea./spark-submit --class com.lee.ConsistencyCheck --master local /export/home/data/com.lee.distrulechecker.service-1.0-SNAPSHOT.jar ExtArea

注意:
1、–master 指定集群URL,支持的选项如下:

local 本地单线程local[K] 本地多线程(指定K个内核)local[*] 本地多线程(指定所有可用内核)spark://HOST:PORT  连接到指定的 Spark standalone cluster master,需要指定端口。mesos://HOST:PORT  连接到指定的  Mesos 集群,需要指定端口。yarn-client客户端模式 连接到 YARN 集群。需要配置 HADOOP_CONF_DIR。yarn-cluster集群模式 连接到 YARN 集群

如果不指定–master选项默认就在local跑。

2、内存不够可用

--driver-memory 512M --executor-memory 512M

强制限制内存。

修改日志打印级别

spark-submit提交时会打印很多INFO信息,影响结果查看,可通过修改日志级别解决。
spark/conf目录下复制log4j.properties.template为log4j.properties,修改:
log4j.rootCategory=INFO, console

log4j.rootCategory=WARN, console
则在用spark-submit提交后不会出现大量的INFO信息。

提交集群执行时报错:Initial job has not accepted any resources

网上搜了以下,几个原因:
1、主机名和ip是否配置正确,查看/etc/hosts,同时在spark-shell里键入:
sc.getConf.getAll.foreach(println)
查看conf信息
2、内存不足,SPARK_EXECUTOR_MEMORY参数默认会使用1G内存,如果不够,可以在spark-submit里指定小于1G的数值,例如:
–executor-memory 512M
3、端口号被占用,之前的程序已运行。我的情况就是这样,spark-shell使用的集群模式,会把7077端口占用掉,导致随后的spark-submit必然失败。

提交jar时的库依赖

Java 和Scala 用户可以通过spark-submit 的–jars 标记提交独立的JAR 包依赖。当只有一两个库的简单依赖,并且这些库本身不依赖于其他库时,这种方法比较合适。但是一般Java 和Scala 的工程会依赖很多库。当你向Spark 提交应用时,你必须把应用的整个依赖传递图中的所有依赖都传给集群。为此,常规的做法是使用构建工具,生成单个大JAR 包,包含应用的所有的传递依赖。这通常被称为超级(uber)JAR 或者组合(assembly) JAR。

SparkSQL

我们可以在sparkSQL里写出比较复杂的sql,比如case when:

select case when (a.NAME <> b.EXTNAME) then 1 else 0 end from OBJ1 a join OBJ2 b on a.RID=b.RID

spark的python接口

spark通过py4j来做到python和java的互操作。我个人的猜测,由于spark计算的效率瓶颈应该在分布式计算上,使用python的效率未必比java或scala相差很多,就好比我们产品的程序,性能瓶颈都在sql上,用啥语言组织业务更多的出于使用方便的考量。

Spark进阶

driver/executor和master/worker的概念详解

《spark快速大数据分析》里对driver/executor和master/worker的介绍:

在分布式环境下,Spark 集群采用的是主/ 从结构。在一个Spark 集群中,有一个节点负责中央协调,调度各个分布式工作节点。这个中央协调节点被称为驱动器(Driver)节点。与之对应的工作节点被称为执行器(executor)节点。driver节点可以和大量的executor节点进行通信,它们也都作为独立的Java 进程运行。驱动器节点和所有的执行器节点一起被称为一个Spark 应用(application)。Spark 文档中始终使用驱动器节点和执行器节点的概念来描述执行Spark应用的进程。而主节点(master)和工作节点(worker)的概念则被用来分别表述集群管理器中的中心化的部分和分布式的部分。这些概念很容易混淆,所以要格外小心。

上述说法比较抽象,具化后是这样:
1、一个节点就是一个JVM进程,所以driver/executor和master/worker是四种进程;
2、master/worker进程是静态的、常驻的,spark集群起来后它们就存在了,我们在主机上执行ps命令可以看到master进程;在从机上ps,可以看到worker进程
3、driver/executor进程是动态的、随application存在的,application可以简单的认为就是用spark-submit提交的jar包。我们用 spark-submit提交jar包时,就会启动driver进程,driver进程好比监工,master进程好比总包工头,监工向总包工头提要求:“该干活了”,于是master通知它管理的小包工头(worker进程):“来来分点活给你们干”。worker进程就会去叫醒手下的工人(同一台从机上的executor进程):“你干这个、你干那个,手脚麻利点”。所以真正干活的是executor进程,driver还干点数据汇总的活,master/worker可都是“管理者”。application运行的时候,我们可以在从机上用ps命令看,会有好几个executor进程。这些进程由application触发启动,通过线程池运行实际的任务,等application结束,它们就会自然消亡。

因此,一个application的运行会有若干管理开销,比如数据的跨节点传输、启停executor进程、启停executor进程里的线程池等,若数据量较小,这些管理开销占的比重反而较大,得不偿失。举个例子,要处理1000条记录,3台机器,每台机器上4个executor进程,结果每个进程就处理80条记录,才开始就要结束,实在太浪费了。

spark调优参数

每个executor占用的核数

spark.executor.coresThe number of cores to use on each executor. In standalone and Mesos coarse-grained modes, setting this parameter allows an application to run multiple executors on the same worker, provided that there are enough cores on that worker. Otherwise, only one executor per application will run on each worker.

注意,这是每个executor可以使用的core数。所以,如果一台机器上仅有8个core且spark.executor.cores=4,那么每台机器上最多能起2个executor进程。
yarn集群下,该参数默认值为1,即每个executor进程使用一个core;standalone集群下则是该节点可用的所有core,考虑到standalone集群对application的调度默认是独占的,这个默认值就不难理解了,所以我们在各个worker上仅看到一个executor进程。

application占用的最大核数

spark.cores.maxWhen running on a standalone deploy cluster or a Mesos cluster in "coarse-grained" sharing mode, the maximum amount of CPU cores to request for the application from across the cluster (not from each machine). If not set, the default will be spark.deploy.defaultCores on Spark's standalone cluster manager, or infinite (all available cores) on Mesos.

每个executor占用的内存

spark.executor.memoryAmount of memory to use per executor process (e.g. 2g, 8g).

默认1g。

spark的优缺点

优点:
1、扩展性好,只需增加cpu和内存,就能在增加数据量的情况下保证性能不受较大影响。
实测中,数据量10倍增长,但耗时增长远低于10倍(当然,超过10w条记录后我们启用了多核,之前都是单核运行)。

2、资源独占(或采用静态资源分配策略)的情况下,效率始终比较稳定,不像数据库要受主键、背景数据量及统计信息的影响;

缺点:
1、比较重量级,小数据量计算的额外开销反而较大。这时设置spark.cores.max为很小的值(例如1),减少并行度,反而能提升效率。尽管如此,小数据量下相比于DB依然没有优势,两张千条记录的表连接在DB上耗时不超过1s,但在spark上仍需4s,这还不包括数据提取到hdfs的时间。

2、可能由于硬件资源有限(主要是core数),应用的并发度无法做到很高,最多不能超过总的核数。从测试情况来看,10w条记录以内的应用只需1核就能保证效率,但超过10w条,就要考虑多核了,像100w条,在10核时才能保证执行时间最短。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/42556.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

优测云服务平台|【压力测试功能升级】轻松完成压测任务

一、本次升级主要功能如下&#xff1a; 1.多份报告对比查看测试结果 2.报告新增多种下载格式 Word格式Excel格式 3.新增多种编排复杂场景的控制器 漏斗控制器并行控制器事务控制器仅一次控制器分组控制器集合点 4.新增概览页面&#xff0c;包含多种统计维度 二、报告对比…

开源语音聊天软件Mumble

网友 大气 告诉我&#xff0c;Openblocks在国内还有个版本叫 码匠&#xff0c;更贴合国内软件开发的需求&#xff0c;如接入了国内常用的身份认证&#xff0c;接入了国内的数据库和云服务&#xff0c;也对小程序、企微 sdk 等场景做了适配。 在 https://majiang.co/docs/docke…

类与对象(上)

类与对象&#xff08;上&#xff09; 一、面向过程和面向对象的区别二、类1、类的引入2、类的定义&#xff08;1&#xff09;类的基本定义&#xff08;2&#xff09;类的成员函数的定义方法 3、类的访问限定符4、封装5、驼峰法命名规则6、类的作用域7、类的实例化&#xff08;1…

金蝶软件实现导入Excel数据分录行信息到单据体分录行中

>>>适合KIS云专业版V16.0|KIS云旗舰版V7.0|K/3 WISE 14.0等版本<<< 金蝶软件中实现[导入Excel数据业务分录行]信息到[金蝶单据体分录]中,在采购订单|采购入库单|销售订单|销售出库单等类型单据中,以少量的必要字段在excel表格中按模板填列好,很方便快捷地从…

IntelliJ IDEA(简称Idea) 基本常用设置及Maven部署---详细介绍

一&#xff0c;Idea是什么&#xff1f; 前言&#xff1a; 众所周知&#xff0c;现在有许多编译工具&#xff0c;如eclipse&#xff0c;pathon, 今天所要学的Idea编译工具 Idea是JetBrains公司开发的一款强大的集成开发环境&#xff08;IDE&#xff09;&#xff0c;主要用于Java…

Rancher管理K8S

1 介绍 Rancher是一个开源的企业级多集群Kubernetes管理平台&#xff0c;实现了Kubernetes集群在混合云本地数据中心的集中部署与管理&#xff0c;以确保集群的安全性&#xff0c;加速企业数字化转型。Rancher 1.0版本在2016年就已发布&#xff0c;时至今日&#xff0c;Ranche…

2023牛客第七场补题报告C F L M

2023牛客第七场补题报告C F L M C-Beautiful Sequence_2023牛客暑期多校训练营7 (nowcoder.com) 思路 观察到数组一定是递增的&#xff0c;所以从最高位往下考虑每位的1最多只有一个&#xff0c;然后按位枚举贪心即可。 代码 #include <bits/stdc.h> using namespac…

CS:GO升级 Linux不再是“法外之地”

在前天的VAC大规模封禁中&#xff0c;有不少Linux平台的作弊玩家也迎来了“迟到”的VAC封禁。   一直以来&#xff0c;Linux就是VAC封禁的法外之地。虽然大部分玩家都使用Windows平台进行游戏。但实际上&#xff0c;使用Linux畅玩CS:GO的玩家也不在少数。 以前V社主要打击W…

Linux上安装和使用git到gitoschina和github上_亲测

Linux上安装和使用git到gitoschina和github上_亲测 git介绍与在linux上安装创建SSHkey在git-oschina使用maven-oschina使用在github使用maven-github使用组织与仓库 【git介绍与在linux上安装】 Git是一款免费、开源的分布式版本控制系统&#xff0c;用于敏捷高效地处理任何…

uniapp隐藏底部导航栏(非自定义底部导航栏)

uniapp隐藏底部导航栏 看什么看&#xff0c;要多看uni官方文档&#xff0c;里面啥都有 看什么看&#xff0c;要多看uni官方文档&#xff0c;里面啥都有 uniapp官方网址&#xff1a;uni设置TabBar // 展示 uni.showTabBar({animation:true,success() {console.debug(隐藏成功)…

【LVS】1、LVS负载均衡群集

1.群集的含义&#xff1a; Cluster、群集、集群 由多台主机构成并作为一个整体&#xff0c;只提供一个访问入口&#xff08;域名与IP地址&#xff09;&#xff1b;可伸缩 2.集群使用的场景&#xff1a; 高并发 3.企业群集的分类&#xff1a; 根据群集所针对的目标差异&a…

06-微信小程序-注册程序-场景值

06-微信小程序-注册程序 文章目录 注册小程序参数 Object object案例代码 场景值场景值作用场景值列表案例代码 注册小程序 每个小程序都需要在 app.js 中调用 App 方法注册小程序实例&#xff0c;绑定生命周期回调函数、错误监听和页面不存在监听函数等。 详细的参数含义和使…

【LeetCode】543.二叉树的直径

题目 给你一棵二叉树的根节点&#xff0c;返回该树的 直径 。 二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。 两节点之间路径的 长度 由它们之间边数表示。 示例 1&#xff1a; 输入&#xff1a;root [1,2,3,4,5]…

每日一学——网络安全

网络安全设计、原则、审计等知识点的精讲如下&#xff1a; 网络安全设计与原则&#xff1a; 网络安全设计是指在系统或网络的设计过程中考虑到安全性&#xff0c;并采取相应的安全措施来保护系统或网络不受威胁。安全设计原则包括最小权限原则&#xff08;Least Privilege Prin…

高并发内存池(centralcache)[2]

Central cache threadcache是每个线程独享&#xff0c;而centralcache是多线程共享&#xff0c;需要加锁&#xff08;桶锁&#xff09;一个桶一个锁 解决外碎片问题&#xff1a;内碎片&#xff1a;申请大小超过实际大小&#xff1b;外碎片&#xff1a;空间碎片不连续&#x…

跨境电商ERP源码大揭秘,让你少走弯路

本文将深入介绍跨境电商ERP源码的重要性以及如何选择和应用它们&#xff0c;让你的电商业务更高效、顺畅。 跨境电商ERP源码的重要性 提升管理效率 跨境电商运营面临着众多挑战&#xff0c;如订单管理、库存追踪和财务报告等。跨境电商ERP源码能够集成这些功能&#xff0c;帮…

自动驾驶,一次道阻且长的远征|数据猿直播干货分享

‍数据智能产业创新服务媒体 ——聚焦数智 改变商业 在6月的世界人工智能大会上&#xff0c;马斯克在致辞中宣称&#xff0c;到2023年底&#xff0c;特斯拉便可实现L4级或L5级的完全自动驾驶&#xff08;FSD&#xff09;。两个月之后&#xff0c;马斯克又在X社交平台上发言&am…

java面试强基(16)

目录 clone方法的保护机制 Java中由SubString方法是否会引起内存泄漏&#xff1f; Java中提供了哪两种用于多态的机制? 程序计数器(线程私有) 如何判断对象是否是垃圾&#xff1f; clone方法的保护机制 clone0方法的保护机制在Object中是被声明为 protected的。以User…

1000元到3000元预算的阿里云服务器配置大全

1000元、2000元或3000元预算能够买的阿里云服务器配置有哪些&#xff1f;可以选择ECS通用算力型u1云服务器、ECS计算型c7或通用型g7实例规格&#xff0c;当然&#xff0c;如果选择轻量应用服务器的话&#xff0c;更省钱&#xff0c;阿里云百科分享1000-3000元预算能买的阿里云服…