Scala特殊语法指南
柯里化在Scala中,定义了两组空括号()()的方法称为“柯里化方法”。这意味着该方法采用多个参数列表,每个参数列表都由一组空括号表示。
例如,考虑以下方法定义:
1def add(a: Int)(b: Int): Int = a + b
在这种情况下,add是一个柯里化方法,它以单独的参数列表接受两个整数参数a和b。要调用此方法,您首先需要提供a的值,然后是b。这看起来像:
1val result = add(1)(2) // result是3
柯里化方法在函数式编程中非常有用,可以允许部分函数应用,函数组合和其他高阶编程技术。
123456789101112131415161718192021222324252627282930313233/** * Execute a block of code that evaluates to Unit, stop SparkContext if there is any uncaught * exception * * NOTE: This method is to be called by the driver-side compon ...
Spark事件总线源码分析
前言Spark中很多组件之间是靠事件消息实现通信的,之前分析了一下Spark中RPC机制,RPC和事件消息机制目的都是实现组件之间的通信,前者解决远程通信问题,而后者则是在本地较为高效的方式。Spark中大量采用事件监听这种方式,实现driver端的组件之间的通信。
ListenerBus1234567891011/** * An event bus which posts events to its listeners. */private[spark] trait ListenerBus[L <: AnyRef, E] extends Logging { private[this] val listenersPlusTimers = new CopyOnWriteArrayList[(L, Option[Timer])] // Marked `private[spark]` for access in tests. private[spark] def listeners = listenersPlusTimers.asScala.map(_._1).asJ ...
理解Spark ESS
spark shuffle大概过程
spark shuffle分为两部分shuffle write和shuffle read。
在map write端,对每个task的数据,不管是按key hash还是在数据结构里先聚合再排序,最终都会将数据写到一个partitionFile里面,在partitionFile里面的数据是partitionId有序的,外加会生成一个索引文件,索引包含每个partition对应偏移量和长度。
而reduce read 端就是从这些partitionFile里面拉取相应partitionId的数据, 然后再进行聚合排序。
现在我们在来看下external shuffle service(ESS),其乍从其名字上看,ESS是spark分布式集群为存储shuffle data而设计的分布式组件。但其实它只是Spark通过Executor获取Shuffle data块的代理。
我们可以理解为ESS负责管理shuffle write端生成的shuffle数据,ESS是和yarn一起使用的, 在yarn集群上的每一个nodemanager上面都运行一个ESS,是一个常 ...
修复Kylin4.0.x不正常的push-down query查询耗时
问题描述
发现kylin4.0.x中的push-down query对于简单的明细查询select * from table limit 10非常慢,本来应该秒级响应,却往往耗时几分钟,并且查询的数据集越大,耗时越长,这非常不正常。BI工具往往会执行明细查询,进行数据展示,不正常的查询时长,往往造成BI工具超时,返回错误信息,这对用户体验非常不友好
通过排查发现,在这类非常简单的明细查询的查询计划中,竟然有shuffle过程,简直离谱。
线上定位问题代码当然离不开Arthas了,然后仔细阅读Kylin源码,找到问题代码所在!!!
修改源码
Kylin执行push-down query的主要逻辑集中在org.apache.kylin.query.pushdown.SparkSqlClient中,代码质量简直不忍直视,出现这个问题的主要原因就是代码质量太低。
在org.apache.kylin.query.pushdown.SparkSqlClient#DFToList中,不必要的Spark DataFrame类型转换transform是这个问题的主要原因。
修改后的代码如下org. ...
Apache Superset添加EXCLUDE函数
前言
因为业务需求,需要一个类似于Tableau中的exclude函数的功能。
例如:
若要查看一段时间内每个国家/地区的平均血压,但不按男性和女性进行划分,请使用 EXCLUDE 详细级别表达式 {EXCLUDE [Sex] : AVG[Average blood pressure]}。
这个函数的功能对于业务来说非常重要,但是Apache Superset中没有此类功能,因此需要修改Apache Superset源码,为其添加上这个功能!这是一个不小的挑战!
新功能实现计划
1、获取由用户拖拽生成的BI图表的SQL语句。
2、拦截SQL语句进行改写,例如{EXCLUDE [Sex] : AVG[blood-pressure]}:
1、去除原SQL语句中的Sex维度信息和针对Sex的过滤条件,得到新的SQL
2、基于新的SQL发出对于blood-pressure度量来说是正确的聚合SQL,得到正确结果集
3、获取正确结果集中排除Sex维度后正确的blood-pressure度量聚合值。
4、利用正确的结果集中正确的部分,对原SQ ...
修复hudi metadata table与HDFS3.x不兼容的问题
From 0.11.0 release, we have upgraded the HBase version to 2.4.9, which is released based on Hadoop 2.x. Hudi’s metadata table uses HFile as the base file format, relying on the HBase library. When enabling metadata table in a Hudi table on HDFS using Hadoop 3.x, NoSuchMethodError can be thrown due to compatibility issues between Hadoop 2.x and 3.x.
简述hudi的metadata table使用HFile作为基础文件格式,HFile依赖于HBase库。在Hudi0.12.1中使用HBase2.4.9版本,HBase2.4.9默认构建在Hadoop2.X,因此在HDFS3.x上使用Hudi metadata table会出现兼容性问题。抛 ...
Flink-Hudi日志超频繁打印问题
问题描述将从Kafka读取CDC日志写入Hudi的Flink SQL作业部署到集群后,发现Flink Job Manager频繁打印以下日志,差不多1000次每秒,非常恐怖。Job Manager日志文件快速膨胀,占用大量磁盘空间,已经影响到集群稳定性。
12342022-12-04 09:24:40,897 INFO org.apache.hadoop.hdfs.protocol.datatransfer.sasl.SaslDataTransferClient [] - SASL encryption trust check: localHostTrusted = false, remoteHostTrusted = false2022-12-04 09:24:40,899 INFO org.apache.hadoop.hdfs.protocol.datatransfer.sasl.SaslDataTransferClient [] - SASL encryption trust check: localHostTrusted = false, remoteHostTrusted ...
开源项目BugFix合集
修复dolphinscheduler2.0.5中http-alert plugin丢失告警信息的Bug
http-alert告警插件仅仅发送用户预定义好的post body信息,丢失最重要Task运行告警信息。这是一个非常简单的Bug:https://github.com/apache/dolphinscheduler/commit/6021c228a1261a45ba8d02606f7132cd0a9b4c25
git clone dolphinscheduler项目,然后切到2.0.5-release分支,执行mvn -U clean package -Prelease -Dmaven.test.skip=true进行编译打包。打包成功后,将生成的dolphinscheduler\dolphinscheduler-alert\dolphinscheduler-alert-plugins\dolphinscheduler-alert-http\target\dolphinscheduler-alert-http-2.0.6-SNAPSHOT.jar替换掉原来的jar包。
启停 A ...
Netty与Reactor模型
Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients.
基本概念:
1、Netty是对JDK NIO进行的一系列封装,使得更容易更快速的编写出高性能的安全的网络应用程序。
2、Java NIO与BIO一个重要的不同点是非阻塞,在Linux中,Java NIO依赖于Linux的epoll实现.
3、epoll是Linux中的专有名词或实现:epoll是一种I/O事件通知机制,是linux 内核实现IO多路复用的一个实现。
Linu主要通过暴漏三个系统调用供上层应用使用epoll:int epoll_create(int size)、 int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event)、int epoll_wait(int epfd, st ...
配置hadoop-snappy那些事
前言在Apache Hadoop3.x社区二进制发行版中已经包含hadoop-snappy,同时Centos7已经自带snappy本地库。因此Hadoop3.x+Centos7无需配置snappy本地库。可运行hadoop checknative -a检查snappy本地库是否可用。
看了网上繁琐的Hadoop Snappy配置过程,配置了半天,才发现是白费功夫。原来是Hive的一个Bug。
Hive3.1.2中orc文件snappy压缩的BugBug描述
创建一个Hive表,存储为orc文件,同时启用snappy压缩。
12345678CREATE TABLE `default`.`user_orc` ( `tid` INT, `userid` STRING)STORED AS orcTBLPROPERTIES ( "orc.compress"="SNAPPY");
Insert overwrite进一些数据
1insert overwrite table user_orc select * from user_1;
会在HDFS ...