Spark菜鸟记录
1、RDD[(k,v)] join()优化,join之前会对两个RDD的key做hash,通过网络把相同hash值的数据传到同一个节点,因此对多次join的RDD 做预分区与持久化可提高效率。
map()操作会失去父RDD的信息,因为key值有可能发生改变,但 mapValues()、flatMapValues()不会。多父RDD已分区,默认采取第一个父RDD的分区方式
cogroup() 、groupWith() 、 join() 、 leftOuterJoin() 、 rightOuterJoin() 、 groupByKey() 、 reduceByKey() 、combineByKey() 以及 lookup() 等发生跨节点数据混洗的操作都可以进行优化。
RDD.partitionBy( new HashPartitioner(3)).persist(StorageLevel.MEMORY_AND_DISK_SER)//构造3个分区
RDD.partitioner//获取分区信息
2.累加器,行动操作中每个任务只会对累加器修改一次,转换操作也许会由于缓存移出又重新使用等操作导致多次修改。(spark1.2)
只有驱动器可以读,对执行器是只写变量。
val accu = sc.accumulator(initialValue)
3.广播变量,只被发到各节点一次,类似BitTorrent通信机制,只读,修改不会影响其他节点的值,
val broad = sc.broadcast(T)
4.task、stage、job
一个RDD有多少partition 就会生成多少task;一个或多个RDD生成一个stage(一般以shuffle操作为分隔);一个action 生成一个job
spark读取文件的并行度与HDFS block有关,HBASE region数有关,hive文件不可分割则与文件数有关,可分割文件与分割数有关。未压缩文件和BZip2Codec压缩类型可分割。
/**
This input format overrides computeSplitSize() to make sure that each split only contains full records. Each InputSplit passed to FixedLengthBinaryRecordReader will start at the first byte of a record, and the last byte will the last byte of a record.
*/
override def computeSplitSize(blockSize: Long, minSize: Long, maxSize: Long): Long = {
val defaultSize = Math.max(minSize, Math.min(maxSize, blockSize))
// If the default size is less than the length of a record, make it equal to it Otherwise, make sure the split size is as close to possible as the default size,but still contains a complete set of records, with the first record starting at the first byte in the split and the last record ending with the last byte
if (defaultSize < recordLength) {
recordLength.toLong
} else {
(Math.floor(defaultSize / recordLength) * recordLength).toLong
}
}
5.性能调优
a.调整并行度
val rdd2 = rdd1.map((_,1)).reduceByKey(_+_,10)//shuffle时调整并行度 shuffle原理:https://www.cnblogs.com/diaozhaojian/p/9635829.html
//Mapreduce和spark shuffle区别(https://mp.weixin.qq.com/s/FT2V9IwNoMl_JU_UDulJ-w)
rdd2.repartition(10)//对RDD做重分区,会打乱数据做重分区
rdd2.coalesce(10)//减少分区,调用Repartition(numPartitions, shuffle = false, logicalPlan)
6.RDD.CheckPoint与RDD.persist(https://www.cnblogs.com/jcchoiling/p/6513569.html)(https://blog.csdn.net/rlnLo2pNEfx9c/article/details/81417061)
CheckPoint 把RDD持久化到HDFS上,增强容错性。job运行时若检测到RDD.CheckPoint会启动一个新job做checkpoint操作,同时删除父RDD,截断依赖链,改变lineage(谱系图)。
设置检查点目录sc.setCheckpointDir("hdfs://IP:9000/checkpoint/")。因为checkpoint要重新计算,因此checkpoint之前建议先persist。
persist 根据存储级别,把数据缓存到不同介质上,只是保存数据,不改变DAG。
Persist 由executor的blockManager管理,因此driver结束之后persist到 磁盘的数据也会清除,而checkpoint 持久化到HDFS,利用HDFS高可用,不调用remove不会清除。
7.Parquet与ORC(https://blog.csdn.net/yu616568/article/details/51868447)(ORC:https://www.cnblogs.com/ITtangtang/p/7677912.html)
parquet支持嵌套数据结构,通过repeated和group实现Map、Array等复杂数据结构。(每个字段有重复次数(required(出现一次)repeated(0或多次)optional(0或1次))、字段类型(group和primitive)和字段名三个属性)。
多行记录构成一个行组(row group),行组中每个列作为一个列块(column chunk),不同列块可采取不同压缩方式,列块划分为多个页。为了更好地存储嵌套格式,页的成员值由value、Repetition level和Definition level三部分组成,对于repeated类型列,repetition lever标记了所处哪条记录已经在该记录位置。
每个行组的统计信息包括schema、列块的最大最小值空值数等信息。每个页的元数据包括value数目,数据页、索引页的offset等信息。
ORC格式通过把struct类型生成一个schema树,struct类型作为根节点,中序遍历子节点,得到所有叶子节点的数据,交由父节点封装成嵌套数据结构。以此来支持LIST、STRUCT、MAP等复杂结构。
Spark菜鸟记录的更多相关文章
- Spark菜鸟学习营Day5 分布式程序开发
Spark菜鸟学习营Day5 分布式程序开发 这一章会和我们前面进行的需求分析进行呼应,完成程序的开发. 开发步骤 分布式系统开发是一个复杂的过程,对于复杂过程,我们需要分解为简单步骤的组合. 针对每 ...
- Spark菜鸟学习营Day3 RDD编程进阶
Spark菜鸟学习营Day3 RDD编程进阶 RDD代码简化 对于昨天练习的代码,我们可以从几个方面来简化: 使用fluent风格写法,可以减少对于中间变量的定义. 使用lambda表示式来替换对象写 ...
- Spark菜鸟学习营Day1 从Java到RDD编程
Spark菜鸟学习营Day1 从Java到RDD编程 菜鸟训练营主要的目标是帮助大家从零开始,初步掌握Spark程序的开发. Spark的编程模型是一步一步发展过来的,今天主要带大家走一下这段路,让我 ...
- Spark菜鸟学习营Day6 分布式代码运行调试
Spark菜鸟学习营Day6 分布式代码运行调试 作为代码调试,一般会分成两个部分 语法调试,也就是确定能够运行 结果调试,也就是确定程序逻辑的正确 其实这个都离不开运行,所以我们说一下如何让开发的S ...
- Spark菜鸟学习营Day4 单元测试程序的编写
Spark菜鸟学习营Day4 单元测试程序的编写 Spark相比于传统代码是比较难以调试的,单元测试的编写是非常必要的. Step0:需求分析 在测试案例编写前,需完成需求分析工作,明确程序所有的输入 ...
- Spark菜鸟学习营Day2 分布式系统需求分析
Spark菜鸟学习营Day2 分布式系统需求分析 本分析主要针对从原有代码向Spark的迁移.要注意的是Spark和传统开发有着截然不同的思考思路,所以我们需要首先对原有代码进行需求分析,形成改造思路 ...
- Spark问题记录
Spark 多线程时的序列化问题 临时记录 Exception in thread "Thread-28" org.apache.spark.SparkException: Ta ...
- Spark数据分析-记录关联问题
1. 问题描述 记录关联问题(Record Linkage):有大量从一个或多个源系统来的记录,其中有些记录可能代表了相同的基础实体. 每个实体有若干个属性,比如姓名.地址.生日.我们需要根据这些属性 ...
- hadoop和spark搭建记录
因玩票需要,使用三台搭建spark(192.168.1.10,192.168.1.11,192.168.1.12),又因spark构建在hadoop之上,那么就需要先搭建hadoop.历经一个两个下午 ...
随机推荐
- ssh整合报错严重: Context initialization failed org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'xxx'
错误描述:eclipse整合ssh的时候 报不能创建名字为xxx的对象 信息: Destroying singletons in org.springframework.beans.factory.s ...
- COPD——团队项目测试心得
写在前面: 测试结束了,也要和项目说拜拜了~这一学期时间飞快,痛并快乐着,想想人生如果是个软件,那我们用多长时间在做测试呢?恐怕是一辈子.很多人忙着追逐,却很少人能停下来审视自己,那些时常自省的,常能 ...
- 自己动手写CPU——寄存器堆、数据存储器(基于FPGA与Verilog)
上一篇写的是基本的设计方案,由于考研复习很忙,不知道下一次什么时候才能打开博客,今天就再写一篇.写一写CPU中涉及到RAM的部件,如寄存器堆.数据存储器等. 大家应该在大一刚接触到计算机的时候就知道R ...
- 快速比较 Kafka 与 Message Queue 的区别
https://hackernoon.com/a-super-quick-comparison-between-kafka-and-message-queues-e69742d855a8 A supe ...
- mongo的runCommand与集合操作函数的关系
除了特殊注释外,本文的测试结果均基于 spring-data-mongodb:1.10.6.RELEASE(spring-boot-starter:1.5.6.RELEASE),MongoDB 3.0 ...
- hive lock命令的使用
1.hive锁表命令 hive> lock table t1 exclusive;锁表后不能对表进行操作 2.hive表解锁: hive> unlock table t1; 3.查看被锁的 ...
- nginx申请并配置免费https
你还在让你的网站裸奔在网络上吗?在这里我们将搭建免费版HTTPS,免费的,免费的,免费的,重要的事情说三遍,申请来源为letsencrypt, 超文本传输协议HTTP协议被用于在Web浏览器和网站服务 ...
- FUJI 富士 富仕 串口 N500I N700I 连接
本人丰富的硬件连接经验, 1.出售富士生化设备N500I, N700I 接入,C#代码demo, 可连接机器验证,验证后付款2. 提供宠物行业富士生化设备N500I, N700I型号接入软件技术支持 ...
- 最新工控\建模仿真\组态\监控集成开发平台源码解决方案2019 ---所有VC++源码100%提供!
使用E-Form++可视化企业版本,构建属于自己的专业工控.建模仿真. 监控组态.培训仿真平台! -- 100%源码 (全部采用VC++/MFC编写,支持.NET, Java, Web, Delphi ...
- shell 统计字符串 字符个数
统计“abbc”中“b”的个数 1:awknum=`echo abbc | awk -F"b" '{print NF-1}'` 2:trnum=`echo abbc | tr -c ...