Spark学习随笔
一步一步研读Spark源代码,加深对Spark的理解
Lestat.Z.
lestatzhang.com
展开
-
spark动态资源分配参数一览
属性 默认值 含义 自版本 spark.dynamicAllocation.enabled false 是否使用动态资源分配,该资源分配将根据工作负载上下扩展在此应用程序中注册的执行程序的数量。 这需要设置spark.shuffle.service.enabled或spark.dynamicAllocation.shuffleTracking.enabled。 以下配置也相关:spark.dynamicAllocation.minExecutors,spa.原创 2020-07-14 16:03:07 · 2288 阅读 · 0 评论 -
Spark Dynamic Resource Allocation动态资源分配
动态资源分配Spark提供了一种机制,可以根据工作负载动态调整应用程序占用的资源。 这意味着,如果不再使用资源,应用程序可以将资源返还给群集,并在以后有需求时再次请求它们。 如果多个应用程序共享您的Spark集群中的资源,则此功能特别有用。默认情况下,此功能是禁用的,并且在各种类型的集群管理器中都可使用用。资源分配政策从较高的层次上讲,Spark应该在不再使用executor时将其放弃,并在需要它们时获取他们。由于没有确定的方法可以预测即将被删除的执行程序是否将在不久的将来运行任务,或者即将被添加的原创 2020-07-14 15:46:09 · 849 阅读 · 0 评论 -
Spark中对dataframe内重复列求和
前言在处理dataframe中的字段名是,发现有些字段名在处理后是重复,于是新定义了策略,对这些相同列名的字段进行求和合并summing the duplicated columns代码实现#Hanle Duplicatesfrom operator import addfrom functools import reduceimport collectionsoriginal_columns = [...]columns_after_cleanup=[...]counter=colle原创 2020-06-08 11:19:55 · 2245 阅读 · 0 评论 -
spark中递归join一系列dataframe
代码如下:def join_dfs(df_list,key=['id']): if len(df_list) == 1: retirm df_list[0] def join_df(df1,df2,key=['id']): return df1.join(df2, key) return reduce(join_df, df_list)def join_df_recursive(df_list, key=['id']): len_df = len(df_list) if len_df原创 2020-05-21 13:14:12 · 1029 阅读 · 0 评论 -
注意pyspark中替换nan值的问题
在PySpark中,NaN与Null不同。 两者都与空字符串“”不同,因此,可能需要在所有数据集特定填充值的基础上检查每个字符。本来想使用df.replace(float('nan'),None)将dataframe中的 nan 值全部转化为空,但是测试下来发现,这个函数在spark中除了会将 nan替换掉,还会将 0 也替换成空(此处是int(0),0.0不受影响),因此,要注意。最后,还是建议用isnan来判断然后替换:import pyspark.sql.functions as Fdf .原创 2020-05-21 09:42:18 · 2525 阅读 · 0 评论 -
pyspark中获取dataframe的大小
代码如下:from pyspark.serializers import PickleSerializer, AutoBatchedSerializerdef _to_java_obj_rdd(df): rdd=df.rdd._reserialise(AutoBatchedSerializer(PickleSerializer())) return rdd.ctx._jvm.org.apache.spark.mllib.api.python.Serde.pythonToJava(rdd._jrdd原创 2020-05-19 19:40:42 · 5776 阅读 · 0 评论 -
如何打印Spark作业的GC详情
问题描述有时候在Spark故障排除的时,我们需要查看gc回收的的各项统计指标。那么如何打印Spark作业的GC详情呢?常见GC详情收集方法收集executor端的GC详情在提交作业,可以加入如下参数 --conf "spark.executor.extraJavaOptions=-verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStam...原创 2019-07-18 09:26:24 · 785 阅读 · 0 评论 -
关于Spark Steaming中的Processing Time/Total Delay/Processing Delay
名词解释Processing Time端到端计算所有作业的给定批次所需的时间。Scheduling Delay从该批次被提交到流式调度程序的时间开始到处理该批次的第一个作业所花费的时间。。Total Delay该批次的所有作业从提交时起完成处理所需的时间,等于 Scheduling Delay + Processing Time 。 如果我们落后5秒,意味着我...原创 2019-07-15 21:35:26 · 1987 阅读 · 0 评论 -
关于org.apache.spark.sql.Row
关于org.apache.spark.sql.Row前言构造Row解析Row的值按索引进行字段访问 —— apply和get方法指定类型来获取字段 —— getAs方法Row与SchemaRow与匹配模式参考资料前言Row表示关系运算符的一行输出。 它是一个通用行对象,具有有序的字段集合,可以通过序数/索引(通过序数进行通用访问,generic access by ordinal),字段名(也...原创 2019-05-23 10:23:05 · 6161 阅读 · 1 评论 -
unable to find encoder for type stored in a dataset的解决方法
前言一般来说,在我们将数据读到DataFrame之后,会继续使用其他一些算子进行处理,如map,flatMap等,但是如果你直接对其调用这些算子时,可能会出现类似unable to find encoder for type stored in a dataset的错误,这种错误的产生一般是因为该DataFrame中的某些返回值的类型不能通过spark自身的的反射完成自动编码,如Map类型,它不...原创 2019-05-22 18:00:45 · 2975 阅读 · 0 评论 -
关于FPGrowth.FreqItemset中的WrappedArray的处理方法
一般我们可以用如下代码使用FPGrowthimport org.apache.spark.ml.fpm.FPGrowthval dataset = spark.createDataset(Seq( "1 2 5", "1 2 3 5", "1 2")).map(t => t.split(" ")).toDF("items")val fpgrowth = new FPG...原创 2019-05-22 17:40:50 · 938 阅读 · 0 评论 -
关于Spark UI中的Event Timeline
关于Event Timeline下面举个简单的例子,例如下图:现在这很有趣。 我们看到基本都是红色和蓝色,也就是大部分时间花在了Scheduler Delay和Task Deserialization Time上 而我们真正想要看到的是很多绿色 —— Executor Computing Time的比例,就是executor真正执行工作所花的时间。Scheduler Delay(蓝色部分)...原创 2019-05-19 10:15:22 · 2327 阅读 · 0 评论 -
SparkUI Details of Stage中与task相关的摘要指标含义
Summary Metrics for Completed Tasks in Stage指标含义DurationexecutorRunTime,执行程序的时间的运行时间Scheduler Delay包括将任务从调度程序发送到执行程序的时间,以及将任务结果从执行程序发送到调度程序的时间。Task Deserialization TimeexecutorDese...原创 2019-05-18 19:37:08 · 2142 阅读 · 0 评论 -
Spark中将RDD转换成DataFrame的两种方法
总结下Spark中将RDD转换成DataFrame的两种方法, 代码如下:方法一: 使用createDataFrame方法//StructType and convert RDD to DataFrame val schema = StructType( Seq( StructField("name",StringType,true) ...原创 2019-05-17 21:37:53 · 9103 阅读 · 0 评论 -
关于Spark中RDD对象无法调用toDF的解决方法
前言今天在调试一个Scala程序时,IDEA报了can not resolve symbol toDF的错误, 查看了一下代码, 该行的逻辑是将RDD转成DataFrame,看起来似乎很正常, 但就是没有办法调用toDF方法,查看了一下上下文,原来是在代码重构的时候,不小心的将import sqlContext.implicits._给移除了。解决方法如果使用的是spark 2.0之前的版本...原创 2019-05-17 21:35:37 · 10694 阅读 · 0 评论 -
java.lang.AssertionError: assertion failed: No plan for HiveTableRelation的解决方法
前言在使用pyspark跑sparksql的时候出现了类似如下的错误:java.lang.AssertionError: assertion failed: No plan for HiveTableRelation ....一般来说这种错误的产生是因为在创建SparkSession对象的时候HiveContext没有被启用。查了一下代码, 果不其然:#In pythonspark ...原创 2019-05-13 16:18:13 · 5506 阅读 · 3 评论 -
Spark yarn模式下的资源分配配置
Spark on YARN模式下的资源分配配置前言Spark on Yarn中的两种部署模式关于Application Master (AM)的配置yarn-clientyarn-cluster关于Spark执行程序的容器关键要点参考资料前言Spark on YARN模式下的主要资源为CPU和内存。Spark资源分配配置在spark-defaults.conf中设置,其属性配置一般以 ***...原创 2019-05-11 21:14:37 · 1281 阅读 · 0 评论 -
关于spark yarn模式下的常用属性
前言整理了spark官网提供的一些常用的spark属性。Spark属性属性名默认值描述spark.yarn.am.memory512m在Client模式下用于YARN Application Master的内存量,格式与JVM内存字符串相同(例如512m,2g)。在Cluster模式下,请改用spark.driver.memory。使用小写后缀,例如 k,m,g,t和...原创 2019-05-11 13:18:17 · 3424 阅读 · 0 评论 -
如何限制Spark作业失败的重试次数?
前言最近有个spark程序因为资源不足以及其他原因会在第一次提交时候失败,然后又会不断提交,导致过多的系统资源被无效占用。因此想限制Spark作业失败的重试次数,如果第一次失败,就让作业直接失败,那么该具体该如何实现呢?解决方法首先查看了spark的属性配置,发现我们使用spark.yarn.maxAppAttempts属性在提交程序时限制其重试次数,如:spark-submit --co...原创 2019-05-11 12:41:03 · 14427 阅读 · 0 评论 -
记一个FPGrowth的简单例子
前言Frequent Pattern Mining挖掘频繁项目,项目集,子序列或其他子结构通常是分析大规模数据集的第一步,这是数据挖掘多年来一直活跃的研究课题。这也是关联规则挖掘的常用算法之一。关联规则中的一些基本概念关联规则:用于表示数据内隐含的关联性,一般用X表示先决条件,Y表示关联结果。支持度(Support):所有项集中{X,Y}出现的可能性。置信度(Confide...原创 2019-05-09 21:15:53 · 3472 阅读 · 0 评论 -
如何在提交spark程序之后退出spark-submit
前言有时候需要在将spark程序提交到集群之后,退出spark-submit进程,那么该如果实现呢?解决方法方法很简单,可以通过在使用spark-submit时设置--conf spark.yarn.submit.waitAppCompletion = false来实现。 这样,客户端将在成功提交spark程序申请后将会自动退出。在集群模式下,Spark驱动程序在Application ...原创 2019-05-08 22:06:46 · 6112 阅读 · 0 评论 -
关于Spark中的Partitioner
关于Spark中的Partitioner前言分区器PartitionerHashPartitionerRangePartitionerCustomPartitioner参考资料:前言分区只不过是将原来大的数据分成几部分。 比如分布式系统中的分区,我们可以将其定义为大型数据集的分区,并将它们存储为整个群集中的多个部分。通过分区可以减少网络I/O,从而可以更快地处理数据。在Spark中,co-g...原创 2019-05-05 21:41:56 · 2771 阅读 · 0 评论 -
关于org.apache.spark.deploy.SparkSubmitArguments
关于org.apache.spark.deploy.SparkSubmitArguments前言主要逻辑主要方法mergeDefaultSparkPropertiesignoreNonSparkPropertiesloadEnvironmentArgumentsvalidateArgumentsvalidateSubmitArgumentsvalidateKillArgumentsvalidate...原创 2019-05-05 18:34:06 · 881 阅读 · 0 评论 -
关于org.apache.spark.deploy.yarn.Client类
关于org.apache.spark.deploy.yarn.Client类前言主要方法submitApplicationcreateApplicationSubmissionContextsetupSecurityTokengetApplicationReportgetClientTokenverifyClusterResourcescopyFileToRemoteprepareLocalRes...原创 2019-05-05 12:46:30 · 2668 阅读 · 0 评论 -
PySpark与Java/Scala交互中的一些常用的Spark对象
一些常用的Spark对象前言一些常用的Spark对象SparkContextSQLContextRDDSDataFrames参考资料前言在PySpark中调用Scala/Java代码时,我们会遇到一些负载的对象需要传递,例如一些spark对象。在环境之间(Python / Java)传递时,我们必须将Spark对象显式地包装/提取到java对象中。下面是一些常用的Spark对象。一些常用的...原创 2019-05-04 11:02:18 · 774 阅读 · 0 评论 -
如何在PySpark中调用Scala/Java代码
前言虽然有充分的理由使用Python API开发Spark应用程序,但不可否认的是Scala是Spark的原生语言,有一些功能或第三方库并没有直接提供python版本。那么当我们想要使用一些PySpark不支持的功能,或者只是想在Python应用程序中使用Scala库该怎么办呢?下面的示例展示了如何在PySpark应用程序中调用Scala代码。示例Pyspark在解释器和JVM之间建立了...原创 2019-05-04 10:57:41 · 2396 阅读 · 1 评论 -
如何在python(pyspark)中调用Scala或Java编写的UDF
前言启动Python进程的开销不小[1],但是真正的开销在于将数据序列化到Python中。推荐在Spark中定义UDF时首选Scala或Java,即使UDFs是用Scala/Java编写的,不用担心,我们依然可以在python(pyspark)中使用它们,简单示例如下://My_Upper UDFpackage com.test.spark.udfimport org.apache.sp...原创 2019-05-04 10:23:58 · 4196 阅读 · 0 评论 -
如何在pyspark中与HDFS交互
如何pyspark与HDFS交互前言使用Java Gateway使用第三方库使用subprocesses子进程参考资料前言我们经常需要从Spark应用程序执行HDFS操作,无论是在HDFS中列出文件还是删除数据。如果使用scala写spark程序的话,我们可以调用hadoop相关的jar包对hdfs进行操作,但在Python Spark API(PySpark)并不能立即实现这一点,那么在p...原创 2019-05-04 10:04:50 · 2812 阅读 · 0 评论 -
org.apache.spark.sql.RuntimeConfig vs org.apache.spark.SparkConf
org.apache.spark.SparkConfSpark应用程序的配置。 用于将各种Spark参数设置为键值对。大多数情况下,你可以使用new SparkConf()创建一个SparkConf对象,该对象将会从Java系统属性中载入所有spark.*的配置。在这种情况下,你直接在SparkConf对象上所设置的参数优先于系统属性。我们可以通过以下代码来访问它的配置:scala>...原创 2019-05-02 22:46:50 · 1176 阅读 · 0 评论 -
如何在pyspark中处理多余空格 —— regex_replace/trim
我们在做数据清洗时经常用和一些多余无用的空格打交道,例如移除开头和末尾的空格,或将多个连续空格替换成一个等。以下提供几个在pypark中处理字段中多余空格的例子。import pyspark.sql.functions as Ffrom pyspark.sql.functions import coldef single_space(col): return F.trim(F.reg...原创 2019-04-29 09:50:47 · 4313 阅读 · 0 评论 -
如何解决Sparksession/HiveContext访问不到Hive表中新插入的记录, 或者元数据不一致的问题
问题描述在做某个POC项目的测试时候,先pyspark2界面count表A一共有3条,在另一个界面用beeline往这种表插入一条数据,然后继续在beeline中count,此时显示总数为4,插入正常。但是回到pyspark2的界面执行sql语句时候,发现还是3条。原因首先看下以下几个知识点:Hive Metastore当使用enableHiveSupport创建SparkSession...原创 2019-04-14 22:15:31 · 2818 阅读 · 0 评论 -
如何使Spark Dataframe区分具有重复名称的列,避免References ambiguous问题
前言有时候我们在使用Spark中执行Join时候,结果集出现重复的列名,从而导致References ambiguous问题。我们可以用以下方式来解决。实例首先模拟一些数据#In pythonfrom pyspark.mllib.linalg import SparseVectorfrom pyspark.sql import Rowdf1 = sqlContext.createD...原创 2019-04-11 10:51:45 · 4570 阅读 · 0 评论 -
关于sparksql中的hint
前言在Spark中,结构化查询可以通过指定查询提示(hint)来进行优化。查询提示,即向查询加入注释,告诉查询优化器提供如何优化逻辑计划, 这在查询优化器无法做出最佳决策时十分有用。Spark SQL支持COALESCE,REPARTITION以及BROADCAST提示。 在分析查询语句时,所有剩余的未解析的提示将从查询计划中被移除。Spark SQL 2.2增加了对提示框架(Hint ...原创 2019-04-08 11:31:21 · 1901 阅读 · 0 评论 -
如何在Spark-shell中停止打印INFO日志
文章目录前言解决方法- 使用自定义的Log4j.properties- 在代码中控制前言在使用Spark-shell做一些测试时候会产生大量无用的INFO级别的日志,因此想把它们给禁用掉。具体方法如下。解决方法- 使用自定义的Log4j.propertieslog4j.rootLogger=ERROR, console# set the log level for these com...原创 2019-04-02 10:09:36 · 2924 阅读 · 1 评论 -
关于Spark中的常见问题及解决方法(6) —— Executor OutOfMemoryError或Executor Unresponsive
前言有时候即使Executor出现 OutOfMemoryError或 Unresponsive的问题,Spark应用程序也能自动从中恢复,但这取决于问题背后的具体原因。主要症状Executor日志中出现OutOfMemoryErrors或者GC相关的错误.。 可以在Spark UI中找到类似信息。Executor崩溃或无响应。某些节点上的任务执行缓慢,看起似乎永远无法恢复。可能的...原创 2019-03-31 12:21:57 · 1230 阅读 · 0 评论 -
关于Spark中的常见问题及解决方法(5) ——Driver OutOfMemoryError或Driver Unresponsive
前言Driver OutOfMemoryError或Driver Unresponsive是一个非常严重的问题,因为它会使我们的Spark应用程序崩溃。 但这类问题也经常发生,因为Driver 收集了太多的数据回到驱动程序,使其内存不足。主要症状Spark应用程序无应答或者崩溃Driver日志中出现OutOfMemoryErrors或者GC相关的错误.互动性非常低或根本不存在。驱动程...原创 2019-03-30 11:11:47 · 1419 阅读 · 0 评论 -
关于Spark中的常见问题及解决方法(4) —— Join操作
前言Join和Aggregation操作都可能引起Shuffle,所以这类问题一般具有相似的症状和解决办法。主要症状Join stage可能一直在运行,它可能包含一个或者多个task。该Join stage前后的stage看起来一切正常。可能的解决方法许多Join可以被手动或自动)优化到其他类型的连接。尝试不同的连接顺序也许可以发现较快连接组合,特别是当其中一些连接过滤掉...原创 2019-03-30 10:30:16 · 1619 阅读 · 0 评论 -
关于Spark中的常见问题及解决方法(3) —— Aggregations操作
前言如果你程序中的聚合速度较慢,请先查看 Spark Stragglers/任务执行缓慢部分。主要症状在执行 groupby 操作时,任务执行缓慢聚合操作的后序操作也很缓慢可能的原因这类问题并没有固定的解决方法。 有时候,由于作业中的数据有一些偏斜的键(即数据倾斜),导致作业执行缓慢。可能的解决方法在聚合之前增加分区数量可能有助于减少每个任务中处理的不同键的数量。增加Exe...原创 2019-03-30 10:14:04 · 416 阅读 · 0 评论 -
关于Spark中的常见问题及解决方法(2) ——Stragglers/任务执行缓慢
文章目录前言主要症状可能的原因可能的解决方法总结参考资料前言在优化应用程序时,这类问题非常常见,大多数时候可能是由于Tasks在集群上不均匀分,数据倾斜,或者某台计算节点的性能比其的差(例如,硬件上的性能劣势)。主要症状某一个task卡主导致后续的stage无法启动Spark UI在观察到对于同一个数据集的作业,某些tasks总是执行缓慢。增加更多的executor并不能解决问题,某...原创 2019-03-27 10:20:38 · 3373 阅读 · 0 评论 -
关于Spark中的常见问题及解决方法(1)
对于Spark的故障排除,很多因素都可能会影响Spark作业,我们无法涵盖所有内容。 但我们可以讨论一些更常见的Spark问题。Spark作业无法启动这个问题经常出现,特别是当我们刚开始使用新的部署或环境时。主要症状Spark作业无法启动除了驱动程序之外,Spark UI不会显示群集上的任何节点。Spark UI显示的信息好像不正确。可能的原因分析这种情况通常发生在群集或应用程...原创 2019-03-26 14:20:15 · 2146 阅读 · 0 评论