大数据
文章平均质量分 63
大数据
大数据学习与分享
【微信公众号:大数据学习与分享】专注于大数据领域常用技术,如Spark、Hadoop、Hive、HBase、Kafka、Zookeeper等技术的使用、实战技巧、源码解读,语言主要以Java和Scala为主
展开
-
金三银四——大数据/Java面试集锦
金三银四,无论今年你有无跳槽计划,这篇文章集锦都值得你反复研读,建议收藏。下列文章链接请阅读:《金三银四——面试集锦》高级大数据研发工程师面试题总结海量大数据处理面试题和思路总结大数据之数据仓库面试题一文概览数据仓库知识和面试数仓相关面试题经典的SparkSQL/Hive-SQL/MySQL面试-练习题一文掌握HBase核心知识以及面试问题ETL和数据建模数仓建模 - 维度 vs 关系Hive高频面试题Hive经典面试题之连续登录、行转列和原创 2022-03-19 19:52:18 · 1857 阅读 · 0 评论 -
【大数据学习与分享】技术干货合集
【大数据学习与分享】主要是做什么的?【大数据学习与分享】主要专注于大数据领域常用的技术,如Spark、Hadoop、Hive、HBase、Kafka、Zookeeper等技术的使用、实战技巧、源码解读,语言主要以Java和Scala为主,保证文章质量,为大家提供一个优质的大数据学习与分享平台。同时也会涉及到目前市场上已经开源的并且在企业中已得到实际应用的基于这些技术进行“封装”的一些技术。但是专注于大数据却并不仅仅是大数据,毕竟技术是相通的,很多技术往往都有其共性,但也有各自的特色也就有了不同的适用场景原创 2021-02-19 16:51:59 · 311 阅读 · 0 评论 -
Spark推荐系统实践
推荐系统是根据用户的行为、兴趣等特征,将用户感兴趣的信息、产品等推荐给用户的系统,它的出现主要是为了解决信息过载和用户无明确需求的问题,根据划分标准的不同,又分很多种类别:根据目标用户的不同,可划分为基于大众行为的推荐引擎和个性化推荐引擎根据数据之间的相关性,可划分为基于人口统计学的推荐和基于内容的推荐…通常,我们在讨论推荐系统时主要是针对个性化推荐系统,因为它才是更加智能的信息发现过程。在个性化推荐系统中,协同过滤算法是目前应用最成功也是最普遍的算法,主要包括两大类,基于用户的协同过滤原创 2021-01-12 10:56:30 · 2764 阅读 · 1 评论 -
linux文件句柄、单个用户进程数、swap分区、软限制、硬限制等系统调优
无论对Spark集群,还是Hadoop集群等大数据相关的集群进行调优,对linux系统层面的调优都是必不可少的,这里主要介绍3种常用的调优:1. linux文件句柄linux在整个系统层面和单个进程两个层面对打开的文件句柄进行限制。配置文件/proc/sys/fs/file-max是对整个系统层面对打开的文件句柄最大数进行控制,单个用户或进程能够打开的文件句柄数受此限制。通过ulimit -a查看当前用户或进程能够打开的最大文件数:上述只是默认值,在实际生产环境肯定是不够用的,如果配置过小,有时原创 2020-11-24 10:43:41 · 509 阅读 · 0 评论 -
从HBase底层原理解析HBASE列族不能设计太多的原因?
在之前的文章《深入探讨HBASE》中,笔者详细介绍了:HBase基础知识(包括简介、表结构)、系统架构、数据存储WAL log和HBase中LSM树的应用HBase寻址机制minor合并和major合并region管理以及region server上下线HMaster工作机制和HBase容错性HBASE数据迁移和备份a. distcp命令拷贝hdfs文件的方式b. copytable的方式实现表的迁移和备份c. replication的方式实现表的复制d.原创 2020-11-19 16:55:07 · 569 阅读 · 1 评论 -
Hive建表时开启事务机制导致insert失败: This command is not allowed on an ACID table.. with a non-ACID transaction
建表语句:create table A ( table_code string, data_dt string, update_dt string) clustered by (table_code) into 1 buckets row format delimited fields terminated by '\033' stored as orc -- orc格式 tablproperties('transactional'='原创 2020-11-19 09:14:32 · 3866 阅读 · 1 评论 -
经典的SparkSQL/Hive-SQL/MySQL面试-练习题(二)
第十题存在如下表:table student(s_id string, s_name string, s_birth string, s_sex string) table course(c_id string, c_name string, t_id string) table teacher(t_id string, t_name string) table score(s_id string, c_id string, s_score int)示例数据:student:01 赵雷 1原创 2020-11-16 09:05:15 · 499 阅读 · 0 评论 -
必须要掌握的Scala技术点(二)数组、映射、元组、集合
2.1 数组import scala.collection.mutable.ArrayBuffer//scala导包比如导入scala.collection.mutable下所有的类:scala.collection.mutable._object ArrayDemo { def main(args: Array[String]): Unit = { println("======定长数组======") // 初始化一个长度为8的定长数组,所有元素初始化值为0 var a原创 2020-11-09 11:48:56 · 313 阅读 · 0 评论 -
Spark SQL处理decimal类型空指针异常(spark.sql.hive.convertMetastoreParquet)
系列三在此之前可以先阅读文章:SparkSQL与Hive metastore Parquet转换但如果同时设置spark.sql.hive.convertMetastoreParquet为false时,要注意一些数据类型以及精度的处理,比如对于decimal类型的处理。通过一个例子复原一下当时的场景:1.创建Hive外部表testdb.test_decimal,其中字段fee_rate为decimal(10,10)CREATE EXTERNAL TABLE `testdb`.`test_decima原创 2020-11-06 09:22:18 · 2061 阅读 · 0 评论 -
spark.sql.parquet.writeLegacyFormat:ParquetDecodingException: Can not read value at 0 in block -1 in
系列二在此之前可以先阅读文章:SparkSQL与Hive metastore Parquet转换在说问题之前首先了解一个参数spark.sql.parquet.writeLegacyFormat(默认false)的作用:设置为true时,数据会以Spark1.4和更早的版本的格式写入。比如decimal类型的值会被以Apache Parquet的fixed-length byte array格式写出,该格式是其他系统例如Hive、Impala等使用的。设置为false时,会使用parquet的新版格原创 2020-11-06 09:18:10 · 3067 阅读 · 1 评论 -
SparkSQL与Hive metastore Parquet
Spark SQL为了更好的性能,在读写Hive metastore parquet格式的表时,会默认使用自己的Parquet SerDe,而不是采用Hive的SerDe进行序列化和反序列化。该行为可以通过配置参数spark.sql.hive.convertMetastoreParquet进行控制,默认true。这里从表schema的处理角度而言,就必须注意Hive和Parquet兼容性,主要有两个区别:Hive是大小写敏感的,但Parquet相反Hive会将所有列视为nullable,但是原创 2020-11-03 18:16:50 · 1403 阅读 · 0 评论 -
SparkSQL: Cannot have map type columns in DataFrame which calls set operations(intersect, except,
通过SparkSQL,对两个存在map类型字段的Hive表进行union操作,报如下错误:org.apache.spark.sql.AnalysisException: Cannot have map type columns in DataFrame which calls set operations(intersect, except, etc.), but the type of column map is map<string,string>;1. 场景模拟1)通过函数str_原创 2020-11-01 11:22:48 · 3057 阅读 · 0 评论 -
SparkSQL存储数据到Parquet:AnalysisException: Parquet data source does not support null data type.
使用SparkSQL(2.4版本)往存储格式为parquet的Hive分区表中存储NullType类型的数据时报错:org.apache.spark.sql.AnalysisException: Parquet data source does not support null data type.虽然在Stack OverFlow上找到了类似的问题,但没有具体阐明到底是什么原因导致了这种问题以及如何解决?1.场景模拟1)创建temp view:test_viewsparkSession.sql原创 2020-10-30 20:06:14 · 3902 阅读 · 1 评论 -
经典的SparkSQL/Hive-SQL/MySQL面试-练习题(一)
第一题需求:已知一个表order,有如下字段:date_time,order_id,user_id,amount。数据样例:2020-10-10,1003003981,00000001,1000,请用sql进行统计:(1)2019年每个月的订单数、用户数、总成交金额。(2)2020年10月的新客数(指在2020年10月才有第一笔订单)实现:(1)SELECT t1.year_month,count(t1.order_id) AS order_cnt,count(DISTINCT t1.原创 2020-09-30 14:39:05 · 681 阅读 · 0 评论 -
学好Spark必须要掌握的Scala技术点(一)变量、表达式、循环、Option、方法和函数/偏函数
前言Scala是以JVM为运行环境的面向对象的函数式编程语言,它可以直接访问Java类库并且与Java框架进行交互操作。正如之前所介绍,Spark是用Scala语言编写的,Kafka server端也是,那么深入学习Scala对掌握Spark、Kafka是必备掌握技能。本篇文章主要介绍,在学习、编写Spark程序时,至少要掌握的Scala语法,多以示例说明。建议在用Scala编写相关功能实现时,边学习、边应用、边摸索以加深对Scala的理解和应用。1. 变量、表达式、循环、Option、方法和函数1原创 2020-09-22 20:39:25 · 291 阅读 · 0 评论 -
Spark在处理数据的时候,会将数据都加载到内存再做处理吗?
对于Spark的初学者,往往会有一个疑问:Spark(如SparkRDD、SparkSQL)在处理数据的时候,会将数据都加载到内存再做处理吗?很显然,答案是否定的!对该问题产生疑问的根源还是对Spark计算模型理解不透彻。对于Spark RDD,它是一个分布式的弹性数据集,不真正存储数据。如果你没有在代码中调用persist或者cache算子,Spark是不会真正将数据都放到内存里的。此外,还要考虑persist/cache的缓存级别,以及对什么进行缓存(比如是对整张表生成的DataSet缓存还是列原创 2020-09-17 17:24:43 · 1363 阅读 · 0 评论 -
Spark流式状态管理(mapWithState)
mapWithState支持输出全量的状态和更新的状态,还支持对状态超时管理,用户可以根据业务需求选择需要的输出,性能优于于updateStateByKey。def main(args: Array[String]): Unit = { //单词统计 val ssc = StreamingContext.getOrCreate(mapwithstateCKDir, () => createContext(brokers, topics, groupId, batchTim原创 2020-09-16 12:51:31 · 941 阅读 · 1 评论 -
Spark流式状态管理(updateStateByKey)
通常使用Spark的流式框架如Spark Streaming,做无状态的流式计算是非常方便的,仅需处理每个批次时间间隔内的数据即可,不需要关注之前的数据,这是建立在业务需求对批次之间的数据没有联系的基础之上的。但如果我们要跨批次做一些数据统计,比如batch是3秒,但要统计每1分钟的用户行为,那么就要在整个流式链条中维护一个状态来保存近1分钟的用户行为。那么如果维护这样一个状态呢?一般情况下,主要通过以下几种方式:spark内置算子:updateStateByKey、mapWithState原创 2020-09-16 12:49:47 · 708 阅读 · 0 评论 -
Spark广播变量HttpBroadcast和TorrentBroadcast对比
HttpBroadcast会在driver端的BlockManager里面存储广播变量对象,并且将该广播变量序列化写入文件中去。所有获取广播数据请求都在driver端,所以存在单点故障和网络IO性能问题。TorrentBroadcast会在driver端的BlockManager里面存储广播变量对象,并将广播对象分割成若干序列化block块(默认4M),存储于BlockManager。小的block存储位置信息,存储于Driver端的BlockManagerMaster。数据请求并非集中于driver端,原创 2020-09-15 13:50:09 · 173 阅读 · 0 评论 -
java.lang.NoSuchMethodError: net.jpountz.lz4.LZ4BlockInputStream.<init>(Ljava/io/InputStream;Z)V
1. 现象在利用Spark和Kafka处理数据时,有时会同时在maven pom中引入Spark和Kafka的相关依赖。但是当利用Spark SQL处理数据生成的DataSet/DataFrame进行collect或者show等操作时,抛出以下异常信息:in stage 3.0 (TID 403, localhost, executor driver): java.lang.NoSuchMethodError: net.jpountz.lz4.LZ4BlockInputStream.<init&g原创 2020-08-31 16:37:06 · 2260 阅读 · 0 评论 -
通过Spark生成HFile,并以BulkLoad方式将数据导入到HBase
在实际生产环境中,将计算和存储进行分离,是我们提高集群吞吐量、确保集群规模水平可扩展的主要方法之一,并且通过集群的扩容、性能的优化,确保在数据大幅增长时,存储不能称为系统的瓶颈。具体到我们实际的项目需求中,有一个典型的场景,通常会将Hive中的部分数据,比如热数据,存入到HBase中,进行冷热分离处理。我们采用Spark读取Hive表数据存入HBase中,这里主要有两种方式:通过HBase的put API进行数据的批量写入通过生成HFile文件,然后通过BulkLoad方式将数据存入HBas原创 2020-08-27 19:57:53 · 1516 阅读 · 0 评论 -
Databricks说的Lakehouse是什么?
在过去的几年里,Lakehouse作为一种新的数据管理范式,已独立出现在Databricks的许多用户和应用案例中。在这篇文章中,我们将阐述这种新范式以及它相对于之前方案的优势。数据仓库在决策支持和商业智能应用方面有着悠久的历史。自20世纪80年代末问世以来,数据仓库技术一直在持续不断的发展,并且MPP体系架构使系统能够处理更大的数据量。尽管数据仓库非常适合处理结构化数据,但是对于很多现代企业,对非结构化数据、半结构化数据以及具有高多样性、高速度、高容量特性的数据处理也往往是必须的,数据仓库并不适用于此.原创 2020-08-25 14:03:59 · 1214 阅读 · 1 评论 -
HBase高级特性(布隆过滤器和协处理器)、列族设计、rowkey设计以及热点问题处理
在阐述HBase高级特性和热点问题处理前,首先回顾一下HBase的特点:分布式、列存储、支持实时读写、存储的数据类型都是字节数组byte[],主要用来处理结构化和半结构化数据,底层数据存储基于hdfs。同时,HBase和传统数据库一样提供了事务的概念,但是HBase的事务是行级事务,可以保证行级数据的原子性、一致性、隔离性以及持久性。布隆过滤器在HBase中的应用布隆过滤器(Bloom Filter)是空间利用效率很高的数据结构,利用位数组表示一个集合,判断一个元素是否属于该集合。但存在一定的错误率,原创 2020-08-13 19:36:46 · 654 阅读 · 0 评论 -
Spark流式程序中广播变量和累加器为何使用单例模式
1.广播变量是只读的,使用单例模式可以减少Spark流式程序中每次job生成执行,频繁创建广播变量带来的开销2.广播变量单例模式也需要做同步处理。在FIFO调度模式下,基本不会发生并发问题。但是如果你改变了调度模式,如采用公平调度模式,同时设置Spark流式程序并行执行的job数大于1,如设置参数spark.streaming.concurrentJobs=4,则必须加上同步代码3.在多个输出流共享广播变量的情况下,同时配置了公平调度模式,也会产生并发问题。建议在foreachRDD或者transfor原创 2020-07-30 16:43:17 · 220 阅读 · 0 评论 -
Spark动态更新广播变量
通过之前文章的介绍,大家都知道广播变量是只读的,那么在Spark流式处理中如何进行动态更新广播变量?既然无法更新,那么只能动态生成,应用场景有实时风控中根据业务情况调整规则库、实时日志ETL服务中获取最新的日志格式以及字段变更等。/** @author : 公众号:大数据学习与分享 */@volatile private var instance: Broadcast[Array[Int]] = null//获取广播变量单例对象def getInstance(sc: SparkContext,原创 2020-07-21 17:49:56 · 907 阅读 · 0 评论 -
Hive如何实现自增序列
在利用数据仓库进行数据处理时,通常有这样一个业务场景,为一个Hive表新增一列自增字段(比如事实表和维度表之间的"代理主键")。虽然Hive不像RDBMS如mysql一样本身提供自增主键的功能,但它本身可以通过函数来实现自增序列功能:利用row_number()窗口函数或者使用UDFRowSequence。示例:table_src是我们经过业务需求处理的到的中间表数据,现在我们需要为table_src新增一列自增序列字段auto_increment_id,并将最终数据保存到table_dest中。1.原创 2020-07-17 12:25:10 · 3863 阅读 · 0 评论 -
面试与实战 | Spark调优策略
在利用Spark处理数据时,如果数据量不大,那么Spark的默认配置基本就能满足实际的业务场景。但是当数据量大的时候,就需要做一定的参数配置调整和优化,以保证业务的安全、稳定的运行。并且在实际优化中,要考虑不同的场景,采取不同的优化策略。1.合理设置微批处理时间在SparkSreaming流式处理中,合理的设置微批处理时间(batchDuration)是非常有必要的。如果batchDuration设置过短,会导致SparkStreaming频繁提交job。如果每个batchDuration所产生的jo原创 2020-07-13 21:07:38 · 313 阅读 · 0 评论 -
Spark中广播变量详解(TorrentBroadcast)
【前言:Spark目前提供了两种有限定类型的共享变量:广播变量和累加器,今天主要介绍一下基于Spark2.4版本的广播变量。先前的版本比如Spark2.1之前的广播变量有两种实现:HttpBroadcast和TorrentBroadcast,但是鉴于HttpBroadcast有各种弊端,目前已经舍弃这种实现,本篇文章也主要阐述TorrentBroadcast】广播变量概述广播变量是一个只读变量,通过它我们可以将一些共享数据集或者大变量缓存在Spark集群中的各个机器上而不用每个task都需要copy一个原创 2020-07-12 11:38:20 · 713 阅读 · 0 评论 -
Hive数据导入HBase引起数据膨胀引发的思考
最近朋友公司在做一些数据的迁移,主要是将一些Hive处理之后的热数据导入到HBase中,但是遇到了一个很奇怪的问题:同样的数据到了HBase中,所占空间竟增长了好几倍!详谈中,笔者建议朋友至少从几点原因入手分析:HBase中的数据相对于Hive中的数据会新增一些附加信息导致磁盘占用的增加,比如布隆过滤器Hive中的数据是否进行过压缩,比如snappy,压缩比还是很高的row key和列族都会占据一定的空间,当数据量较大时,仅二者就会占据很多不必要的空间建议将相同查询场景下的几个常用的原创 2020-07-09 20:10:35 · 622 阅读 · 0 评论 -
HBase寻址机制及HMaster、RegionServer容错
HBase寻址机制HBase提供了两张特殊的目录表-ROOT-和META表,-ROOT-表用来查询所有的META表中region位置。HBase设计中只有一个root region即root region从不进行切分,从而保证类似于B+树结构的三层查找结构:第1层:zookeeper中包含root region位置信息的节点,如-ROOT-表在哪台regionserver上第2层:从-ROOT-表中查找对应的meta region位置即.META.表所在位置第3层:从META表中查找用户表对应re原创 2020-07-07 17:32:22 · 490 阅读 · 0 评论 -
HBase中LSM树的应用
1. 输入数据首先存储在日志文件 [文件内数据完全有序,按键排序]2. 然后当日志文件修改时,对应更新会被先保存在内存中来加速查询3. 数据经过多次修改,且内存空间达到设定阈值,LSM树将有序的"键记录"flush到磁盘,同时创建一个新的数据存储文件。[内存中的数据由于已经被持久化了,就会被丢弃]4. 查询时先从内存中查找数据,然后再查找磁盘上的文件5. 删除只是“逻辑删除”即将要删除的数据或者过期数据等做删除标记,查找时会跳过这些做了删除标记的数据6. 多次数据刷写之后会创建许多数据存储文件,后原创 2020-07-04 22:31:04 · 328 阅读 · 1 评论 -
Spark存储Parquet数据到Hive,对map、array、struct字段类型的处理
利用Spark往Hive中存储parquet数据,针对一些复杂数据类型如map、array、struct的处理遇到的问题?为了更好的说明导致问题的原因、现象以及解决方案,首先看下述示例:创建存储格式为parquet的Hive非分区表:CREATE EXTERNAL TABLE `t1`(`id` STRING,`map_col` MAP<STRING, STRING>,`arr_col` ARRAY<STRING>,`struct_col` STRUCT<A:ST原创 2020-06-23 22:17:32 · 1284 阅读 · 0 评论 -
Apache Spark 3.0.0重磅发布 —— 重要特性全面解析
2020年6月18日,开发了近两年(自2018年10月份至今)的Apache SparkTM 3.0.0正式发布!Apache SparkTM 3.0.0版本包含3400多个补丁,是开源社区做出巨大贡献的结晶,在Python和SQL功能方面带来了重大进展并且将重点聚焦在了开发和生产的易用性上。同时,今年也是Spark开源10周年,这些举措反映了Spark自开源以来,是如何不断的满足更广泛的受众需求以及更多的应用场景。首先来看一下Apache SparkTM 3.0.0主要的新特性:在TPC-DS基原创 2020-06-21 22:08:04 · 786 阅读 · 0 评论 -
Spark RDD详解 —— RDD特性、lineage、缓存、checkpoint、依赖关系
RDD(Resilient Distributed Datasets)弹性的分布式数据集,又称Spark core,它代表一个只读的、不可变、可分区,里面的元素可分布式并行计算的数据集。 RDD是一个很抽象的概念,不易于理解,但是要想学好Spark,必须要掌握RDD,熟悉它的编程模型,这是学习Spark其他组件的基础。笔者在这里从名字和几个重要的概念给大家一一解读:Resili...原创 2019-11-24 11:30:09 · 491 阅读 · 0 评论 -
Scala中的IO操作及ArrayBuffer线程安全问题
通过Scala对文件进行读写操作在实际业务中应用也比较多,这里介绍几种常用的方式,直接上代码:1.从文件中读取内容object Main { def loadData(): Array[String] = { var bs: BufferedSource = null var in: InputStream = null try { in = Main.getClass.getClassLoader.getResourceAsStream("data.txt原创 2020-06-16 17:32:13 · 533 阅读 · 0 评论 -
详细解析SparkStreaming和Kafka集成的两种方式的区别和优劣
spark streaming是基于微批处理的流式计算引擎,通常是利用spark core或者spark core与spark sql一起来处理数据。在企业实时处理架构中,通常将spark streaming和kafka集成作为整个大数据处理架构的核心环节之一。针对不同的spark、kafka版本,集成处理数据的方式分为两种:Receiver based Approach和Direct Approach,不同集成版本处理方式的支持,可参考下图:Receiver based Approach基于rec原创 2020-06-10 20:13:49 · 618 阅读 · 0 评论 -
Spark SQL解析查询parquet格式Hive表获取分区字段和查询条件
首先说一下,这里解决的问题应用场景:sparksql处理Hive表数据时,判断加载的是否是分区表,以及分区表的字段有哪些?再进一步限制查询分区表必须指定分区?这里涉及到两种情况:select SQL查询和加载Hive表路径的方式。这里仅就"加载Hive表路径的方式"解析分区表字段,在处理时出现的一些问题及解决作出详细说明。如果大家有类似的需求,笔者建议通过解析Spark SQL logical plan和下面说的这种方式解决方案结合,封装成一个通用的工具。问题现象sparksql加载指定Hive分原创 2020-06-06 20:39:44 · 1259 阅读 · 0 评论 -
Spark SQL | 目前Spark社区最活跃的组件之一
Spark SQL是一个用来处理结构化数据的Spark组件,前身是shark,但是shark过多的依赖于hive如采用hive的语法解析器、查询优化器等,制约了Spark各个组件之间的相互集成,因此Spark SQL应运而生。Spark SQL在汲取了shark诸多优势如内存列存储、兼容hive等基础上,做了重新的构造,因此也摆脱了对hive的依赖,但同时兼容hive。除了采取内存列存储优化性能,还引入了字节码生成技术、CBO和RBO对查询等进行动态评估获取最优逻辑计划、物理计划执行等。基于这些优化,使得原创 2020-05-28 22:00:08 · 276 阅读 · 0 评论 -
编写的Spark程序代码,运行在driver端还是executor端呢?
在Spark中:driver是运行用户编写Application 的main()函数的地方,具体负责DAG的构建、任务的划分、task的生成与调度等。job,stage,task生成都离不开rdd自身,rdd的相关的操作不能缺少driver端的sparksession/sparkcontext。executor是真正执行task地方,而task执行离不开具体的数据,这些task运行的结果可以是shuffle中间结果,也可以持久化到外部存储系统。一般都是将结果、状态等汇集到driver。但是,目前exec原创 2020-05-25 21:22:08 · 2041 阅读 · 0 评论 -
Spark闭包函数从产生到在executor执行经历了什么?
首先,对RDD相关的操作需要传入闭包函数,如果这个函数需要访问外部定义的变量,就需要满足一定条件(比如必须可被序列化),否则会抛出运行时异常。闭包函数在最终传入到executor执行,需要经历以下步骤:1.driver通过反射,运行时找到闭包访问的变量,并封装成一个对象,然后序列化该对象2.将序列化后的对象通过网络传输到worker节点3.worker节点反序列化闭包对象4.worker节点的executor执行闭包函数简而言之,就是要通过网络传递函数、然后执行,期间会经历序列化和反序列化,所以要原创 2020-05-18 21:21:36 · 182 阅读 · 0 评论