Spark
攻城狮Kevin
爱学习,爱工作,爱生活
展开
-
Key-Value类型RDD转换算子1——partitionBy、groupByKey & reduceByKey、aggregateByKey & foldByKey & combineByKey
key-Value类型RDD,也叫pairRDD,RDD中元素不再为单一的value类型,每一行是(key, value)的格式。eg:Value类型RDD:sc.makeRDD(Array(1 to 10)) key-Value类型RDD:sc.makeRDD(Array((1,"a"),(2,"b"),(3,"c")))1. partitionBy2. group...原创 2019-02-16 08:52:02 · 1127 阅读 · 0 评论 -
Key-Value类型RDD转换算子2——sortByKey、mapValues、join & cogroup
接上一篇7. sortByKey(true/false,[numTasks])8. mapValues9. join(内联结)10. cogroup(外联结)7. sortByKey(true/false,[numTasks])创建一个pairRDD,按照key的大小,正序(true)和倒序(false)进行排序,默认正序scala> val rdd7 = sc...原创 2019-02-16 08:53:57 · 309 阅读 · 0 评论 -
Value类型RDD转换算子(一)——map、mapPartitions、mapPartitionsWithIndex、flatMap、glom、groupBy
RDD整体上分为Value类型和KeyValue类型,其中Value类型又包含双Value类型,接下来的内容就是Value类型RDD的各种转换算子整理:1. map(func)2. mapPartitions(func)3. mapPartitionsWithIndex(func)4. flatMap(func)eg1:区分Int类型的RDD和Range类型的RDDeg2:...原创 2019-02-13 20:39:39 · 735 阅读 · 0 评论 -
Value类型RDD转换算子(二)——filter、sample、distinct、coalesce、repartition、sortBy、pipe
RDD整体上分为Value类型和KeyValue类型,其中Value类型又包含双Value类型,接下来的内容就是Value类型RDD的各种转换算子整理:7. filter(func)8. sample(withReplacement,fraction,seed)9. distinct(num)10. coalesce(numPartitions)(可选shuffle)11. r...原创 2019-02-13 20:42:05 · 609 阅读 · 0 评论 -
双Value类型RDD转换算子——union、subtract、intersection、cartesian、zip
双Value类型RDD的转换算子,也就是两个Value类型RDD的各种交互算子1. union2. subtract3. intersection4. cartesian5. zip(需要两个RDD的分区数和元素个数一致)1. union两个RDD求并集(不会去重),返回一个新的RDDscala> val rdd1 = sc.makeRDD(1 to 5)...原创 2019-02-14 10:19:58 · 577 阅读 · 0 评论 -
Spark相关配置参数
spark重要参数配置原创 2023-06-27 15:59:10 · 4785 阅读 · 0 评论 -
pySpark,执行算子show(1)导致并行度不对的问题
也就是说,因为有action算子show(1)的存在,df的repartition和withColumn这两个数据转换算子会得以生效,但是show(1)比较特殊,因为其只需要返回1条数据,所以内部做了优化,只会计算一个分区的数据,然后返回一条到driver端,这也就是为什么在spark的ui中看到这一步骤只有一个task在执行;那剩下7个分区的数据什么时候执行呢?2. spark代码的预加载机制,会在生成dag图时,把代码里的print执行出来,所以并不是print1,udf执行,再print2;原创 2022-10-26 16:12:31 · 939 阅读 · 0 评论 -
pySpark中udf的使用
传入的col_collect_list是一个数组,由dataframe的sql函数collect_list(col)得到,传入的num是分位数的档,比如95分位就传入95;pyspark中dataframe可以使用很多sql型的函数,比如group by、agg等,函数中经常需要调用自定义的udf函数。定义好函数后,需要注册成udf函数,F.udf()前面是函数名,后面是返回的数据类型。以下面的udf为例,首先定义函数,函数的功能是计算分位数,95不能直接传值,因为udf里的参数必须是一列,所以这里。原创 2022-10-14 20:52:24 · 2477 阅读 · 0 评论 -
pyspark里mapPartitions的用法
111原创 2022-07-19 19:58:48 · 2855 阅读 · 0 评论 -
pyspark中schema设定为integerType时不接受空值
pyspark里首先构建schematable_schema = StructType([ StructField("card_sequence", StringType(), True), StructField("card_id", IntegerType(), True)])StringType类型可以接受null,后面的True表示传入值是否允许为空但是IntegerType类型不能接受null和非int类型值,例如传入空值、"汉字"这种,会判断为异常值,这样通过构建原创 2022-04-20 20:15:24 · 788 阅读 · 0 评论 -
pyspark给hive表增加自增列
一般增加自增列可以考虑row_number() over(partition by XX order by XX) as rank但是需要给hive表全局加上自增列,并且没有字段可供排序时,partition by和order by后无表字段可用。这种情况只能考虑用row_number() over(order by 1),即每一行记录多出个1,然后对1进行排序,取排序号作为自增id列,但是这样结果会出现一个问题:记录结果会被打乱,因为无论spark还是mr本质是分布式进行的,运行多个task,原创 2022-02-24 22:31:58 · 1153 阅读 · 0 评论 -
HDFS数据存储,文件块与spark的分区概念
HDFS中数据以文件块的形式存储在DataNode上,比如一个1GB的数据文件,会切分成多个128M的文件块,数据写入存储的时候,每个128M文件块会存放在一个DataNode上,同时通过机架感知,在最近的两个DataNode节点上分别存放2个副本文件。ps:极限情况,如果128M文件块的个数超过DataNode的个数,会随机选出DataNode存放多余的文件块,但是一个128M文件块只存储在一个DataNode中,机架感知出最近的两个DataNode存放其副本。这样spark在读取HD原创 2022-01-05 12:21:06 · 1364 阅读 · 0 评论 -
Spark优化——推测执行机制
Spark job中,一个stage什么时候完成,取决于stage下最后一个task的完成时间。task的完成时间也被很多因素影响,比如partition的分配,executor的资源使用情况,host的运行状态,集群网络等等。很多情况下因为运行环境导致的task跑的过慢,或者直接卡死,让task可以重新跑起来是可以缓解这个问题的,也就是Spark中的推测执行机制(speculation)。--conf spark.speculation=true--conf spark.speculation原创 2020-06-03 17:14:16 · 1120 阅读 · 0 评论 -
Spark常用提交脚本
#!/usr/bin/env bashinput="XXXX" output="XXXX"sday="XXXX"id_type="XXXX"tag_origin_short_name="XXXX"name=dataToES_testif [ ! -d "/opt/log/wangxuan/norman/${sday}/${id_type}/${tag_origin_short_name}/sparkESLog" ]; then mkdir -p /opt/log/wangxuan/.原创 2020-06-03 15:08:51 · 610 阅读 · 0 评论 -
SparkSubmit提交参数(日常版)
--master yarn--deploy-mode cluster--queue XXXX--name ${spark_job_name}--executor-memory 8G--num-executors 32--executor-cores 4--conf spark.yarn.executor.memoryOverhead=4G--conf "spark.driver.extraJavaOptions=-Dlog4jspark.root.logger=WARN,console".原创 2020-06-03 15:09:10 · 468 阅读 · 0 评论 -
Spark flatMap算子扁平化数据
/*4. hive表数据扁平化(画像id,faid)*/val id2ffaid = rawData.flatMap(x => {val arr = x.split(splitType, -1)val mergeId = arr(0)val faid = arr(2)val strs = mergeId.split("\\|", -1)val ids = strsval listBuffer = new ListBuffer[(String, String)]for (i &l.原创 2020-05-14 16:25:29 · 676 阅读 · 0 评论 -
Spark调优sc通过textFile读取文件后repartition
在spark中,读取hdfs文件sc.textFile("hdfs路径"),其底层调用的是hadoopFile来获取hdfs路径的数据,1. 对于textFile文件,会做切分,128M一个block,作为一个分区读取过来,形成一个task,2. 对于常见的lzo文件,lzo文件是不支持切分的,所以当一个lzo文件交给一个task去处理时,可能某个lzo文件过大,会导致所有tasks的整体进度被某个task拖慢亲测读取lzo文件,在spark代码中,就算加上切分参数,也不生效(后面是字节数原创 2020-05-09 20:31:45 · 2213 阅读 · 0 评论 -
Spark程序将Json数据写入ES索引的配置参数详解
1."es.http.timeout" -> "5m""es.http.retries" -> "50"这两个参数是控制http接口层面的超时及重试,覆盖读请求和写请求,默认值比较小,默认超时时间为1分钟,重试次数为3,建议调整为超时时间5分钟,重试次数50次。2."es.nodes.wan.only" -> "true""es.nodes.dis...原创 2020-04-23 20:00:09 · 2894 阅读 · 2 评论 -
Spark程序将Json数据写入ES索引
采用import org.elasticsearch.spark.rdd.EsSpark的相关API,将Json格式的数据写入Es索引中需要引入的依赖在最后面<dependency> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch-hadoop<...原创 2020-04-23 17:46:49 · 1569 阅读 · 1 评论 -
Spark将Json数据写入ES报权限错误:action [cluster:monitor/nodes/info] is unauthorized for user
使用org.elasticsearch.spark.rdd.EsSpark的APIEsSpark.saveJsonToEs(mergeData, esIndexName, esConf)将Json数据写入ES集群,报错信息如下:org.elasticsearch.hadoop.rest.EsHadoopInvalidRequest: org.elasticsearch.hadoo...原创 2020-04-23 17:35:39 · 3720 阅读 · 0 评论 -
Set集合在for循环中调用只生效1次的问题
如果Set集合声明在for循环代码之外,则Set集合的元素在for循环里,只会被调用一遍,调用完毕后,Set集合就释放掉了,测试代码如下:object test { def main(args: Array[String]): Unit = { val jsonstr = "{\"tag_value\":\"9.0\",\"pay_type\":\"a\"}" val j...原创 2020-04-20 22:30:39 · 1186 阅读 · 0 评论 -
Spark和Hive处理数据倾斜的两种解决方案
比如处理80TB的数据,partition数量为15000,理论上平均每个节点是5-6G的数据,但是实际上根据key-value在存储时,很有可能因为某个key的数量特别多,导致数据倾斜。这样就会出现超过物理内存限制的报错。偶尔重试可能会通过,但是会比较不稳定;目前我们这边的两种解决办法是:1. 如果倾斜的key数量比较少,那么过滤出来,对其进行单独处理;2. 如果倾斜的key数量比较多...原创 2020-04-20 15:02:34 · 683 阅读 · 0 评论 -
限制Spark往HDFS写出数据时,生成_SUCCESS文件
用hive生成数据的时候,是没有_SUCCESS文件的。但是MR和Spark程序落盘后都会有这么个文件,代表程序运行成功。举个例子,比如我们有两个spark任务:A任务和B任务。B任务依赖于A任务,也就是说B任务要根据A任务的结果再判断是否运行。这时我们就可以根据A任务的输出目录下是否有_SUCCESS文件来判断A任务是否运行成功。但是在HDFS数据往Druid里摄入的时候,有_SUC...原创 2020-03-10 17:55:21 · 5564 阅读 · 0 评论 -
spark做两张大表的join操作,mapPartition和重分区算子的使用策略
Spark中做两个大hive表的join操作,先读取过来处理成两个数据量很大的RDD,如果两个RDD直接进行join操作,势必会造成shuffle等导致运行非常缓慢,那么怎么优化呢?方法如下:首先,对每个大hive表生成RDD进行优化1. 对RDD进行repartition重分区先依据Executor数和内存情况估算出对RDD分为多少个partition比较合适,因为一个par...原创 2020-01-11 18:25:16 · 6014 阅读 · 0 评论 -
Spark处理RDD,分区数和executor的关系
在代码中将RDD进行了hash重分区成56个partition,RDD中包含从HDFS上读取的4亿条记录,每一行记录存为RDD中的一个元素。所以最终RDD有4亿个元素,56个分区,对应spark程序中56个task,查看任务时显示如下:再结合spark的原理图:共申请了201个executor(Driver端占1个,申请200个executor),总tasks数为56,...原创 2019-10-31 15:24:52 · 4040 阅读 · 1 评论 -
Spark常用的4种读取和存储数据的格式 & 4种存储文件系统
Spark的数据读取与存储,常规来看可有分为两个维度,文件格式和文件系统:文件格式:Text文件、Json文件、Sequence文件和Object文件文件系统:linux本地文件系统、HDFS、HBase、MySQL数据库目录一、文件格式类1. Text文件(1)读取Text文件 sc.textFile("path")(2)创建RDD保存为Text文件2. Js...原创 2019-02-19 10:20:41 · 8289 阅读 · 0 评论 -
RDD、DataFrame、DataSet的相互转换及异同点
目录一、RDD、DataFrame、DataSet三者概念二、RDD、DataFrame、DataSet的创建和相互转换1. RDD和DataFrame互转2. RDD与DataSet互转3. DataFrame和DataSet的互转三、RDD、DataFrame、DataSet互转示意图四、RDD、DataFrame、DataSet异同点1. 相同点2. 区别...原创 2019-03-12 09:15:37 · 3163 阅读 · 0 评论 -
Spark三大核心数据结构(一)——RDD的概念、血缘和持久化
Spark中三大核心数据结构:RDD、广播变量(分布式只读变量)、累加器(分布式只写变量)、1. RDD的概念和特点:RDD,全称Resilient Distributed Dataset,弹性分布式数据集,作为Spark中最基础的数据抽象,类似Java中对象的概念;它代表一个不可变(只读)、可分区、里面的元素可并行计算的集合,List、Set、Map都是RDD的常见...原创 2019-02-13 14:18:12 · 3499 阅读 · 0 评论 -
Spark三大核心数据结构(二)——累加器 & 自定义累加器的使用原理
Spark的三大核心数据结构:RDD、累加器(只写不读)、广播变量(只读不写)在spark应用程序中,我们经常会有这样的需求,如异常监控,调试,记录符合某特性的数据的数目,这种需求都需要用到计数器,如果一个变量不被声明为一个累加器,那么它将在被改变时不会再driver端进行全局汇总,即在分布式运行时每个task运行的只是原始变量的一个副本,并不能改变原始变量的值,但是当这个变量被声明为累加器后...原创 2019-02-20 20:43:37 · 4369 阅读 · 3 评论 -
Spark三大核心数据结构(三)——广播变量
Spark的三大核心数据结构:RDD、累加器(只写不读)、广播变量(只读不写)广播变量用来高效分发较大的对象。向所有工作节点发送一个较大的只读值,以供一个或多个Spark操作使用。不用广播变量的话,转换算子和执行算子之间会有shuffle的过程;使用广播变量的好处是避免了RDD转换和行动中的shuffle的落盘和磁盘IO,提高性能,是Spark的一种优化手段。 广播变量原理是将...原创 2019-02-20 21:35:05 · 481 阅读 · 0 评论 -
Spark中RDD的宽窄依赖 & 图解RDD执行中Application、Job、Stage、Task的关系
目录1. RDD之间的依赖(以分区为说明)2. RDD任务划分原理3. Spark中RDD执行阶段划分示意图1. RDD之间的依赖(以分区为说明)窄依赖:每一个父RDD的Partition中的数据,最多被子RDD的一个Partition使用(单分区 -> 单分区); 窄依赖在源码里是OneToOneDependency宽依赖:同一个父RD...原创 2019-02-18 18:29:45 · 1764 阅读 · 2 评论 -
Spark中Partition、Stage、Task、Executor、并行度的各种数量关系 & RDD弹性、分布式、数据集的理解
Spark中各种组件、概念之间具备一定的数量关系,本篇博文主要整理一下这些内容,并且从弹性、分布式、数据集这三个方面来解释RDD的概念。目录一、Spark数量关系1. 分区数 Partition2. 阶段数量 Stage3. 任务数量 Task4. Executor数量5. 并行度数量二、RDD的概念剖析1. 弹性2. 分布式3. 数据集一、Spar...原创 2019-02-21 10:36:56 · 3175 阅读 · 1 评论 -
hadoop、hbase、hive、spark分布式系统架构原理
机器学习、数据挖掘等各种大数据处理都离不开各种开源分布式系统,hadoop用户分布式存储和map-reduce计算,spark用于分布式机器学习,hive是分布式数据库,hbase是分布式kv系统,看似互不相关的他们却都是基于相同的hdfs存储和yarn资源管理,hadoop、spark、Hbase、Hive、hdfs简介Hbase:是一个nosql数据库,和mongodb类似hdfs:h...转载 2019-02-19 08:50:36 · 1933 阅读 · 0 评论 -
SparkSQL三种数据源的load与save——本地&HDFS、JDBC、Hive数据库
SparkSQL,通俗来讲就是将DataFrame构建一张临时表,然后去用sql语言查询这张临时表DF.createOrReplaceTempView("XX表名")spark.sql("select * from XX表名").show与Hive将HQL转化成MapReduce然后提交到集群中执行类似,SparkSQL是转化成了RDD,提交到集群中用Spark来执行。Spark的运算...原创 2019-03-19 03:14:47 · 2450 阅读 · 0 评论 -
关于Spark2.0X版本后为什么弃用hashShuffle采用sortShuffle的理解
Spark2.0X版本前,使用的是hashShuffle和优化过后的hashShuffle两种模式,Spark2.0X版本后,开始使用sortShuffle和bypass模式下的sortShuffle两种模式,那么为什么从Spark2.0X版本开始要弃用hashShuffle模式呢?个人理解如下:在Spark中Executor的一个core一次性只能处理一个task的数据,在S...原创 2019-04-11 13:53:24 · 1186 阅读 · 6 评论 -
SparkStreaming消费上游kafka再生产给下游kafka场景下的executor nums设置问题
公司生产环境下原本kafka topic是0.8版本,4分区由于数据量过大,所以需要逐渐往kafka topic 1.0版本(24分区)迁移,出现的场景如下:kafka topic 0.8(4分区) —> Spark Streaming(Spark Submit脚本)—> kafka topic 1.0(24分区)在SparkSubmit脚本中可以申请资源量,例如execu...原创 2019-08-14 18:50:44 · 694 阅读 · 0 评论 -
spark任务报错:org.apache.spark.shuffle.FetchFailedException: Failed to connect to tjtx148-6-173.58os.org
org.apache.spark.shuffle.FetchFailedException: Failed to connect to tjtx148-6-173.58os.org:7337org.apache.spark.shuffle.FetchFailedException: Failed to connect to tjtx148-6-173.58os.org:7337 at or...原创 2019-09-19 11:07:14 · 1399 阅读 · 0 评论 -
RDD血缘关系的追溯和持久化、checkPoint语法
1. RDD血缘关系语法RDD血缘关系的追溯:toDebugString查看RDD间依赖类型:.dependencies 2. RDD数据持久化RDD数据持久化缓存:.cache(也可以用persist,实际上cache就是用的persist方法) 3. RDD设置检查点及使用RDD设置检查点scala> sc.setCheckpointDir("hdf...原创 2019-02-18 21:26:19 · 768 阅读 · 0 评论 -
装饰者模式——IO流和RDD的设计
目录1. IO流体现装饰者模式字节流的读取——装饰者模式:字符流的读取——装饰者模式:2. RDD的设计体现装饰者模式1. IO流体现装饰者模式Java中的四种流数据:输出流Output,输入流Input,字节流Stream,字符流Reader、Writer读取文件,FileInputStream in = new FileInputstream("c:/xx...原创 2019-01-26 16:51:47 · 563 阅读 · 0 评论 -
Spark中基于内存和文件的RDD分区方式 & 分区数与任务数的关系(追源码深度解析)
目录<1>、当RDD数据来源于内存一、看local~模式下访问Spark,默认内存分区数二、那么totalCores是一个什么值呢?<2>、当RDD数据来源于内存,并指定分区<3>、当RDD数据来源于文件而非内存<4>、总结<1>、当RDD数据来源于内存首先上IDEA代码,这时makeRDD数据来自于内存...原创 2019-01-21 21:43:20 · 1359 阅读 · 0 评论