
ARTS
文章平均质量分 70
ARTS
shengjk1
零基础转码,头部大厂程序员,努力构建 通俗易懂的、好玩的编程语言教程。关注我,习得转码经验!翱翔在编程的海洋里!只学习最值得学的内容!
展开
-
抽象类和接口之间的选择
何时选择抽象类1.你希望在几个密切相关类之间共享代码2.你希望子类具有许多公共的方法或者属性非 public 修饰3.你想要声明非静态或非 final 的属性何时选择接口1.你希望实现接口的类之间没有很强的相关性2.你希望指定特定的行为,但不关心谁实现3.你想要实现多重继承参考When to Use Abstract Class and Interface...原创 2021-04-26 19:34:14 · 311 阅读 · 8 评论 -
一文搞定 Flink Job 的运行过程
背景我们经常通过 Flink Shell 提交代码,如 flink run -p 2 -m yarn-cluster -ynm test -c test ./test-1.0-SNAPSHOT.jar "file" "./test.properties"&正文总结原创 2021-04-22 15:25:30 · 854 阅读 · 1 评论 -
大数据架构如何做到流批一体?
阿里妹导读:大数据与现有的科技手段结合,对大多数产业而言都能产生巨大的经济及社会价值。这也是当下许多企业,在大数据上深耕的原因。大数据分析场景需要解决哪些技术挑战?目前,有哪些主流大数据架构模式及其发展?今天,我们都会一一解读,并介绍如何结合云上存储、计算组件,实现更优的通用大数据架构模式,以及该模式可以涵盖的典型数据处理场景。 大数据处理的挑战 现在已经有越来越多的行业和技术领域需求大数据分析系统,例如金融行业需要使用大数据系统结合 VaR(value at risk) 或者机器学习方案...转载 2021-03-26 17:09:55 · 504 阅读 · 4 评论 -
如何生成一个可信的Cookie
如何生成一个可信的Cookie因为Cookie都是服务器端创建的,所以,生成一个可信Cookie的关键在于,客户端无法伪造出Cookie。用什么方法可以防止伪造?数学理论告诉我们,单向函数就可以防伪造。例如,计算md5就是一个单向函数。假设写好了函数md5(String s),根据输入可以很容易地计算结果:md5("hello") => "b1946ac92492d2347c6235b4d2611184"但是,根据结果"b1946...11184"反推输入却非常困难。利用单向函数,我们.转载 2021-03-19 15:54:59 · 2692 阅读 · 1 评论 -
一文搞懂Flink SQL执行过程
背景学习了 apache calcite,基本上把 apache calcite 的官网看了一遍,也写了几个小例子,现在该分析一下 Flink SQL 的执行过程了,其中关于 apache calcite 的部分不深究,因为 apache calcite 有些复杂,真的要了解清楚需要大量时间,本次还是聚焦 Flink.正文以 SQL Query 为例 select a.* from a join b on a.id=b.idsql query 入口方法// sql query 入口方法 ove原创 2021-03-15 17:49:17 · 1395 阅读 · 1 评论 -
java deep vs shallow copies
1. 背景2. 根本区别3. 实现 deep copy1.背景讨论 deep copy and shallow copy时,需要明白一点,肯定不是基本数据类型也不是 String,因为它们都是不可变的,都是值传递。换句话说,当讨论 deep copy or shallow copy时,都针对的引用类型,在讨论的是引用如何传递2.根本区别看引用是否指向同一个对象shallow copydeep copy区别引用指向同一个对象引用执行不同的对象特征修改其中一个.原创 2021-03-10 15:32:40 · 238 阅读 · 1 评论 -
calcite 入门
前言calcite 基本概念性的东西就不说了,本片不说技术相关的东西,仅仅闲谈最近越来越明白了一件事:框架之所以叫框架,必然用到了模板方法,我们只需要实现哪些我们自己需要实现的东西即可。框架的魔力不在于可以用来做什么东西,对于我而言,它的吸引力在于是如何实现的。为什么都是简简单单的 java 语言,可以发展出来无穷无尽的各式各样的框架。特别有意思,如果能开发出一些有意思的东西就更有意思了正文calcite 是一个特别有意思的东东,介于查询与存储之间的解析层,类似于之前提到的 ANTL4 , 但远远原创 2021-03-09 17:11:51 · 413 阅读 · 0 评论 -
一文搞懂 FlinkSQL函数 LAST_VALUE 的原理
背景刚开始接触 FlinkSQL 时,对 LAST_VALUE 特别好奇,虽然工作当中有在用到,但还是特别的想知道它是怎么实现的,今天终于可以总结一下原理当我们写入如下类似的 sql 时,就会用到 LAST_VALUE 函数select LAST_VALUE(status) from temp;LAST_VALUE 函数对应的具体类为 LastValueWithRetractAggFunction。LAST_VALUE函数之所以能够起作用最关键的是 /** Accumulator for L原创 2021-01-27 18:01:51 · 4671 阅读 · 12 评论 -
一文搞懂 FlinkSQL 的 KafkaSource
背景前面我们了解了 写给大忙人看的Flink 消费 Kafka,今天我们一起来看一下 FlinkSQL Kafka 是如何与 Flink Streaming Kafka 结合起来的正文创建 kafka sourceCREATE TABLE orders( status int, courier_id bigint, id bigint, finish_time BIGINT, place_time BIGINT, PR原创 2021-01-26 18:03:33 · 1102 阅读 · 0 评论 -
Flink 提交作业运行的各种模式总结
0. 背景1. Session Mode2. Per-Job Mode3. Application Mode4. 总结5. 参考0.背景关于 Flink 的 Application Mode 自己还比较陌生,像 -d 等参数自己也不熟悉,决定好好总结一下1.Session Mode这个不用多说,也就是起一个 session,然后会有多个程序提交到这一个 session 中。好处:集群资源仅分配一次,充分利用资源,程序App 启动较快坏处:可能会连锁式的重启,jobManager 负.原创 2021-01-26 17:33:07 · 1248 阅读 · 0 评论 -
FlinkSQL 平台
背景由于公司内部需求较多,并不想每次都写一个 streaming 程序,故而开始搭建 flinksql 平台效果传一个 sql 文件给 jar 包,然后 sql 文件内的 sql 将自动执行为什么选用 jar 而不是 web调研了基于 web 的 zeppline,有一下几个担心的点zeppline 设计的初衷其实是为了交互式分析基于 zeppline rest api 与现有的监控不兼容,需要修改现有监控的代码虽然带有 web 界面的对用户很是友好,对于分析人员来说,是一个不错的选择,但原创 2021-01-20 08:23:46 · 1444 阅读 · 2 评论 -
结合 Flink 学习装饰者模式
什么是装饰者模式动态的将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。简单的理解就是通过包装来扩展功能,相比于继承,更有弹性Flink 是如何实现观察者模式的@Internalpublic class KafkaDeserializationSchemaWrapper<T> implements KafkaDeserializationSchema<T> { private static final long serialVersionUID =原创 2020-11-10 19:26:02 · 464 阅读 · 0 评论 -
结合 Flink 学习观察者模式
什么是观察者模式定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新观察者模式实现1.可观察者,也可以称之为主题2.观察者其实类似于订阅邮件,订阅者就是观察者,而发送邮件的就是可观察者( 主题 )/** * @author shengjk1 * @date 2020/11/9 *///主题,注册观察者、remove观察者、// nofity observer 通知完之后,具体 Observer 要做什么完全在于 Observer//原创 2020-11-09 19:40:27 · 432 阅读 · 0 评论 -
实现 ArrayBlockQueue 阻塞队列
之前看到 ArrayBlockQueue 的实现,感觉挺有意思的,自己也实现一个阻塞队列,通过等待通知的方式,直接上代码package thread;import java.util.LinkedList;import java.util.concurrent.TimeUnit;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurren原创 2020-11-07 22:03:24 · 428 阅读 · 0 评论 -
Flink SQL 自定义 Source format
1. 背景2. 步骤3.自定义 Format 4. 使用自定义 Format1.背景由于 kafka 中的 json 属于嵌套,又不想二次序列化再把它展开,故自定义 format。2.步骤1.自定义 Factory 实现 DeserializationFormatFactory2.自定义 DeserializationSchema 实现 DeserializationSchema3. 自定义 Factory 中 createDecodingFormat 方法返回 createDeco.原创 2020-10-20 19:05:52 · 1790 阅读 · 0 评论 -
Flink 解决 No ExecutorFactory found to execute the application
缺少 flink-client jar引入即可<dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-clients_2.11</artifactId> <version>${flink.version}</version> </dependency&原创 2020-10-14 12:06:36 · 16218 阅读 · 7 评论 -
当 snapshot 失败时发生了什么
工作中遇到了与 snapshot 异常相关的问题,特此总结一下,与 snapshot 相关的流程图如下:当调用 AbstractUdfStreamOperator.snapshotState 方法时,实际上调用了public static void snapshotFunctionState( StateSnapshotContext context, OperatorStateBackend backend, Function userFunction) throws Excepti原创 2020-10-10 12:01:14 · 1509 阅读 · 0 评论 -
Flink 连接 hive 解决 java.net.UnknownHostException
错误今天在实验 Flink 连接 hive 的操作,由于 CDH 的 hadoop 是 HA,连接过程中报错如下:Exception in thread "main" java.lang.IllegalArgumentException: java.net.UnknownHostException: nameservice1 at org.apache.hadoop.security.SecurityUtil.buildTokenService(SecurityUtil.java:378) at o原创 2020-09-27 19:55:03 · 3179 阅读 · 4 评论 -
一文搞懂Flink生成StreamGraph
1. 前言2. FlatMap 的转化1.前言通过一文搞懂这一系列的文章,我们已经知道了,Flink 作业的提交过程:这篇文章主要聚焦在我们以简单的代码为例/** * @author shengjk1 * @date 2018/11/23 */public class FlinkJava8Demo { public static void main(String[] args) throws Exception { StreamExecutionEnvironmen..原创 2020-09-24 15:44:48 · 889 阅读 · 3 评论 -
JMM 知识点总结
java 内存模型总结,主要方便查看JMM屏蔽各种硬件和操作系统内存方法差异,以实现让 Java 程序在各个平台下都能达到一致的内存方法效果。主要的目的:定义程序中各种变量的访问规则( 关注在虚拟机中变量存取与内存交互的底层细节 )包括:实例字段、静态字段和构成数组的对象元素,不包括局部变量与方法参数除了增加高速缓存外,为了使处理器内部的运算单元能尽量被充分利用,处理器可能会对输入代码进行乱序执行优化,处理器会在计算之后将乱序执行的结果进行重组,保证该结果与顺序执行的结果一致。但并不保证程序中原创 2020-09-23 14:54:40 · 426 阅读 · 0 评论 -
一文搞懂 Flink如何移动计算
对于分布式框架来说,我们经常听到的一句话就是:移动计算,不移动数据。那么对于 Flink 来说是如何移动计算的呢?我们一起重点看一下 ExecuteGraph基本概念ExecutionJobVertex:表示 JobGraph 的一个计算顶点,每个 ExecutionJobVertex 可能会有很多个 并行的 ExecutionVertexExecutionVertex:表示一个并行的 subtaskExecution: 表示 ExecutionVertex 的一次尝试执行Graph 变化源代原创 2020-09-18 16:37:27 · 521 阅读 · 6 评论 -
一文搞懂 java -jar 发生了什么
之前一直就很好奇 java -jar 到底发生了什么,为什么执行 java -jar 代码就自动运行了。今天我们来说明一下,尽量覆盖操作系统、编译原理、JVM 的一些东西。( 本文将处于一个不断更新的状态,知道上面这些东西覆盖的差不多了为止,如果可以的话,也会加上硬件方面的东西 ),主要的目的就是为了能以最简单的 java 代码来串一些相对来说比较底层的东西,让自己以及让每个读者对计算机能有一个相对全局的了解。我们先约定如下:1.操作系统仅仅指的是unix 或类unix2. 64 位机器3. 64位原创 2020-09-17 15:26:22 · 2010 阅读 · 5 评论 -
解析 hashMap 源码之位运算
计算索引tab[i = (n - 1) & hash])当 n == 2^x 的时候,(n - 1) & hash 与 hash % n 是等价的,但 (n - 1) & hash ( 位运算 )效率更高,因为 % 是通过 加法跟移位 来实现的计算 hash 值 // 扰动函数 // 增加 hash 值的任意性,让高位参与到运算中来 static final int hash(Object key) { int h; retu原创 2020-09-07 17:07:05 · 375 阅读 · 0 评论 -
解析 hashMap 源码之基本操作 get
getHashMap<String, String> stringStringHashMap = new HashMap<>();stringStringHashMap.get("a");对应的 HashMap 源码 public V get(Object key) { Node<K,V> e; return (e = getNode(hash(key), key)) == null ? null : e.value;}接下来就是 ge原创 2020-08-16 10:46:30 · 256 阅读 · 0 评论 -
解析 HashMap 源码之基本操作 put
之前一直都在使用 HashMap 做一些操作,心里常常默认 HashMap 很快 ,从未做过深究。现在看过源码之后才发现 HashMap 的效率并没有想象中的那么高,O(1) O(n) O(tab数据length * 链表length) 均有可能,并且也不太适合存储大量数据。put 操作HashMap<String, String> stringStringHashMap = new HashMap<>();stringStringHashMap.put("a","a");原创 2020-08-14 18:34:54 · 179 阅读 · 0 评论 -
解析 HashMap 源码概括
本系列主要解析 jdk8 的 HashMap 源码,首先会从经常使用方法为入口点,一点点打开我们队 HashMap 的理解。总括使用过 HashMap 的同学应该都知道 HashMap 是由 数组 + 链表 + 红黑树 构成的。它的默认容量为 16 ,加载因子为 0.75,当超过阈值 16 * 0.75 的时候会进行扩容,当链表长度大于等于 8 的时候会尝试转化为 红黑树基本操作public class Test11 { public static void main(String[] args)原创 2020-08-14 18:30:57 · 165 阅读 · 0 评论 -
一文搞懂Flink rocksdb中的数据恢复
当我们设置 rocksdb state backend 时,并且从 checkpoint 重启时,首先进入 RocksDBKeyedStateBackendBuilder 的 getRocksDBRestoreOperation 方法// rockdb restore 入口方法 private AbstractRocksDBRestoreOperation<K> getRocksDBRestoreOperation( int keyGroupPrefixBytes, Closeabl原创 2020-08-12 20:48:31 · 1426 阅读 · 1 评论 -
关于进程的分类
普通进程与后台进程默认情况下,进程是在前台运行的,这时就把shell给占据了,我们无法进行其它操作。对于那些没有交互的进程,很多时候,我们希望将其在后台启动,可以在启动参数的时候加一个’&'实现这个目的:切换到后台的进程称为job。切换到后台时会输出相关job信息,以前面的输出[1] 21304为例:[1]表示job ID,21304表示进程ID是21304。 切换到后台的进程,仍然可以用ps命令查看,或通过jobs命令只查看所有job(后台进程)。后台进程会随着Shell的退出而结束。守护原创 2020-08-11 17:01:18 · 762 阅读 · 0 评论 -
leetcode-easy-array-最大子序和
审题给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。示例:输入: [-2,1,-3,4,-1,2,1,-5,4],输出: 6解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。思路无,看了答案之后,觉得甚是巧妙。主要用动态规划来解决动态规划: 把大问题拆分成相对简单的子问题,并且子问题的结果相互依赖。通过局部最优解来确定全局最优解。动态规划使用场景: 用于查找有很多重叠子问题情况的最优解原创 2020-07-27 20:39:52 · 154 阅读 · 0 评论 -
leetcode-easy-array-删除排序数组中的重复项
审题给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。示例 1:给定数组 nums = [1,1,2],函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。你不需要考虑数组中超出新长度后面的元素。示例 2:给定 nums = [0,0,1,1,1,2,2,3,3,4],函数应该返回新的长度 5, 并且原数组原创 2020-07-21 20:35:09 · 168 阅读 · 0 评论 -
leetcode-easy-array-两数之和
审题给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。示例:给定 nums = [2, 7, 11, 15], target = 9因为 nums[0] + nums[1] = 2 + 7 = 9所以返回 [0, 1]思路很多解题者都说最容易想到的就是暴力破解,不好意思,我就仅仅想到了暴力破解。但是暴力破解肯定是不行的解法中的最行的一个,当做备原创 2020-07-05 17:47:09 · 183 阅读 · 0 评论 -
手写 avl tree
为什么需要 avl treeavl tree 又称 平衡二叉树。主要在排序二叉树的基础上进行的一个优化。避免排序二叉树不平衡,从而严重影响查询效率avl tree 的特点平衡二叉树也叫平衡二叉搜索树。它可以是一颗空树或者它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一颗平衡二叉树avl tree 实现/** * @author shengjk1 * @date 2020/6/23 */public class AvlTreeDemo { public static v原创 2020-06-25 16:25:46 · 215 阅读 · 0 评论 -
排序二叉树-删除节点
前面( https://blog.youkuaiyun.com/jsjsjs1789/article/details/106772632 ),我们已经了解了什么是排序二叉树以及排序二叉树的遍历和添加元素,现在我们一起来看一下,排序二叉树是如何删除元素的。package xmht.datastructuresandalgorithms.datastructure.binarysortTree;/** * @author shengjk1 * @date 2020/6/15 */public class B原创 2020-06-23 15:40:50 · 1076 阅读 · 0 评论 -
读 Differences between JDK, JRE and JVM
JDKJava Development KitJava applications and applets 的开发环境。它包括 JRE,java解释/加载工具( java),编译工具( javac ),归档工具( jar ),文档生成工具( javac ) 以及其他的 java 开发需要的工具JREJava RunTime Environment运行 java 程序所需要的最小要求,包括 JVM,core classes 以及 supporting filesJVMJava Virtual Ma原创 2020-06-16 16:23:26 · 429 阅读 · 0 评论 -
排序二叉树-添加以及遍历
排序二叉树对于任何一个非叶子节点,要求左子树的值比当前节点的值小,右子树的值比当前节点的值大。如果有相同的值,则可以放置左右任意节点添加及遍历package xmht.datastructuresandalgorithms.datastructure.binarysortTree;/** * @author shengjk1 * @date 2020/6/15 */public class BinarySortTree { public static void main(String[]原创 2020-06-15 22:25:46 · 254 阅读 · 0 评论 -
赫夫曼编码-1
赫夫曼树应用场景赫夫曼编码式赫夫曼树在电讯通信中的经典应用之一。赫夫曼树也广泛的应用于数据文件的压缩。其压缩效率通常在 20% -90% 之间生成赫夫曼编码步骤与赫夫曼树类似package xmht.datastructuresandalgorithms.datastructure.tree.huffmancode;import org.jetbrains.annotations.NotNull;import java.util.*;/** * @author shengjk1原创 2020-06-07 18:11:44 · 207 阅读 · 0 评论 -
面试官:来,手写一个赫夫曼树
基本介绍带权路径长度最短的树,权值较大的节点离根越近路径和路径长度: 在一颗树中,从一个节点往下可以达到孩子或孙子节点之间的通路,称为路径。通路中分支的数目称为路径长度。如果规定根节点层数为1,则从根节点到第L层节点的路径长度为 L-1节点的权及带权路径长度 若树中节点赋给一个有这某种含义的数值,则这个数值就是该节点的权。从节点到该节点之间的路径长度与该节点的乘积称带权路径长度数的带权路径长度 所有叶子节点的带权路径长度之和,记为 wpl,权值越大的节点离根节点越近的二叉树才是最优二叉树构建赫原创 2020-06-07 17:58:15 · 359 阅读 · 0 评论 -
用大顶堆实现数据排序
堆堆分为大顶堆和小顶堆大顶堆 每个节点的值都大于或等于其左右孩子节点的值小顶堆 每个节点的值都小于或等于其左右孩子节点的值堆排序堆排序是选择排序的一种,最好最坏平均时间复杂度均为 O(nlogn),不稳定排序堆排序代码实现/** * @author shengjk1 * @date 2020/5/31 */public class HeapSort { public static void main(String[] args) { //将数组进行升序排列 int arr[]原创 2020-05-31 17:39:29 · 746 阅读 · 0 评论 -
搞定二叉树的查找
之前我们已经了解过了 二叉树的遍历,现在我们一起来看一下,二叉树的查找。class BinaryTree { private HeroNode root; public void setRoot(HeroNode root) { this.root = root; } //前序查找 public HeroNode preOrderSearch(int no) { if (root != null) { return root.preOrderSearch(no); }原创 2020-05-31 17:33:58 · 198 阅读 · 0 评论 -
数组实现顺序存储二叉树
顺序存储二叉树顺序存储二叉树只考虑完全二叉树第 n 个元素的左子节点为 2 * n +1第 n 个元素的右子节点为 2 * n +2第 n 个元素的父子节点为 (n-1)/2n 表示二叉树中第几个元素#####代码实现package xmht.datastructuresandalgorithms.datastructure.tree;/** * @author shengjk1 * @date 2020/5/30 */public class ArrBinaryTreeDem原创 2020-05-30 16:02:37 · 795 阅读 · 0 评论