Spark开发规范--持续更新中...

1.对于确定长度的数组,用模式匹配来获取每一位的数据
正例:val Array(name,age) = x.split(",")
反例: val array = x.split(","); val name = array(0); val age = array(1)
 
2.DataFrame获取数据,使用用getAs[T](fieldName : scala.Predef.String)方法
正例:val name = row.getAs[String]("name")
反例:val name = row.getString(0)  //当数据源的列发生错位时,此用法会导致获取到错误的数据
 
3.尽可能的使用DataSet,而不是DataFrame。DataFrame的校验是运行校验,而DataSet可以做到编译校验
 
4.SparkSql的编写,尽可能的遵循SQL规范
 
5.字符串拼接,请使用可插入字符串
正例:"my name is ${name}"
反例:"my name is " + name
 
6.case class 与DataSet结合使用时,不需要自定义序列化类,DataSet的数据类型是一种很轻量且高效的编码器Encoder。
 
7.尽可能的使用SparkSql,DataFrame,DataSet,而不是RDD,由于Catalyst和Tungsten的存在,绝大多数情况下结构化编程都要比RDD运行效率高
 
8.对于分区后内部排序的场景,可以尝试rdd.partitionBy()转dataframe,再sortWithinPartitions()。在排序很耗时的情况下,由于Tungsten的存在,该方法比rdd.repartitionAndSortWithinPartitions要高效(UnsafeExternalSorter
比ExternalSorter更高效)。
 
9.SQL是一种很高效的业务开发模式,不要抗拒,但是一定要写出高效的SQL,以及明白SQL背后的执行原理
 
10.是写SQL,还是DataSet,取决于开发团队的技术栈。复杂SQL容易写错,DEBUG较繁琐,需不断提交任务方能试错,而DataSet可以在编译时发现问题
 
11.生产环境的离线报表不要使用动态资源分配,报表查询,SQL交互计算可考虑使用,须限制好最大申请资源
 
12.列式存储,如(parquet),尽可能的对数据排序,可减少存储空间占用
 
13.多条件分支的判断,尽可能用模式匹配代替if else
 
14.尽可能的不要在Spark直接入关系型数据库,若一定要这么做,请控制好task数量,以免对数据库产生较大的压力
 
15.在Spark算子内调用公共方法(如mappartition里写库,调用公用的数据库相关方法),需要将函数写为线程安全的
 
16.having不要和开窗函数配合使用时,采用子查询的方式。(在Spark2.4以后非子查询的使用会报错)
正例:select * from (select * ,row_number() over (partitin by class order by age) as rank from table) as t  where rank = 1
反例:select * ,row_number() over (partitin by class order by age) as rank from table having rank = 1
 
17.关于缓存的使用,确定数据足够小的话可以使用MEMORY_ONLY。另外,DISK_ONLY也很不错,虽然数据存于磁盘,但是再次读取免去了RDD序列化的开销,通常比再次从hdfs读取数据要高效很多。
 
18.SparkSQL的cbo功能建议在SQL交互查询时开启,对于每日的离线任务则不建议开启,CBO的本质是基于统计学来进行优化,生成环境的离线任务在部署前理应抽样统计好自己的数据规范和分布。
 
19.Spark调优前先明白自己的任务是什么类型(IO密集型,内存型,CPU密集型)的,不要盲目调优,
 
20.Spark离线任务是否允许成功,尽可能的使用类似_SUCCESS的标识来判断,而不是信号量,spark的有时候无法正常退出,比如shutdown hook超时,此时信号量为异常,但实际任务已经允许成功
 
21.非必要不开启堆外内存,堆外内存会导致作业不稳定,隐患较大,Spark sql经过钨丝计划优化后的一般来讲使用堆内也不比堆外内存效率差
 
22.spark单个executor执行过慢不一定是数据倾斜的原因,可能是map内的逻辑针对特性key不友好,亦或者executor所在的节点性能欠佳
 
23.对于工具类,设计函数时要合理使用枚举
正例:def process(deviceType:Enumeration,deviceValue:String)
反例:def process(deviceType:String,deviceValue:String)
 
24.对于dataframe,lamda表达式不要和dsl混用,因为lamda表达式会多一次jvm序列化,且有可能不被catalyst优化感知
正例:df.filter("age > 30")
反例:df.filter(_.getAs[String]("age")>30)

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
2023年,Java开发1-2年的程序员应该掌握的技术程度可能会有一些变化。以下是一些可能的技术点及其详细说明: 1. Java语言基础:除了熟悉Java的基本语法和面向对象编程外,还需要了解Java 8及以后版本的新特性,如Lambda表达式、函数式接口、流式编程等。 2. 数据库操作:除了熟悉关系型数据库的基本操作外,还需要了解NoSQL数据库(如MongoDB、Redis)的使用,以及对大数据处理和分布式系统(如Hadoop、Spark)的基本了解。 3. Web开发:除了掌握Servlet和JSP的使用外,还需要熟悉主流的Java Web框架,如Spring MVC、Spring Boot等,以及前端技术栈(HTML5、CSS3、JavaScript、React、Angular等)的使用。 4. 微服务架构:了解微服务架构的基本概念和设计原则,熟悉Spring Cloud等微服务框架的使用,并能够进行服务的注册与发现、负载均衡等操作。 5. 容器化和云原生:了解Docker容器化技术和Kubernetes容器编排工具的基本概念和使用方法,能够进行应用的容器化部署和管理。 6. 消息队列和事件驱动:了解消息队列(如Kafka、RabbitMQ)和事件驱动架构的基本原理和使用方法,能够进行异步消息处理和事件驱动开发。 7. 安全和性能优化:了解常见的Web安全漏洞和攻击手法,能够进行安全漏洞的预防和修复。同时,具备基本的性能优化能力,能够分析和优化代码性能、系统吞吐量等。 8. DevOps和持续集成/交付:了解DevOps文化和持续集成/交付(CI/CD)的基本概念和工具链(如Jenkins、GitLab、Travis CI),能够进行自动化构建、测试和部署。 9. 大数据和人工智能:了解大数据处理技术(如Hadoop、Spark)和人工智能相关技术(如机器学习、深度学习),能够进行数据处理和分析,并应用于实际场景。 10. 软件工程实践:熟悉敏捷开发方法(如Scrum、Kanban)和软件工程的基本原则,具备良好的代码规范、文档编写和团队协作能力。 需要注意的是,技术的发展是不断变化的,以上只是一种可能的预测,具体的技术要求还需要根据行业、企业和项目的需求来确定。因此,持续学习和跟进技术的最新动态是非常重要的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值