- 博客(41)
- 资源 (25)
- 收藏
- 关注
原创 flink学习(七)——DataStream API介绍
前面我们尝试用flink写了一个WordCount程序,并且介绍了flink提供的api层级,接下来我们正式来学习flink的DataStream API。为什么先学习DataStream API,而不是ProcessFunction API,这是因为ProcessFunction API是通过DataStream API调用的,它作为DataStream API的补充,可以实现DataStream API所不能实现的一些高级功能。DataStream程序结构剖析我们回到WordCount的那个例
2021-01-13 16:36:27 685
原创 flink学习(六)——flink api层次
在前文我们写了一个WordCount程序体验了一下flink程序的编写。在本篇中我们详细学习下flink api的分类及其应用场景。Flink’s APIflink提供了4个层次的api抽象:在最下层,就是有状态流式编程,它提供了状态编程和时间编程(时间编程后面会学到)的基础能力。它通过Process Function嵌入到DataStream API中。它It is embedded into the DataStream API via the Process Function. It all
2020-12-21 22:45:46 1748
原创 flink学习(五)——浅尝WordCount
前面学了那么多,我们还没有上手写过代码,现在我们来学习如何用flink实现流式的WordCount程序。准备工作java开发环境,推荐Intellij IDEA。netcat程序。如果是windows系统,可以到https://eternallybored.org/misc/netcat/网站下载netcat,并解压配好环境变量即可;如果是centos系统,直接yum install -y nc即可;pom文件配置 <!-- Apache Flink dependencies
2020-12-19 20:26:28 402 1
原创 flink学习(四)——flink任务执行原理详解
在前文中我们学习了flink的整体架构和任务提交执行的流程。现在我们来学习flink在内部具体如何执行任务。任务执行图在flink中有四层执行图,StreamGraph -> JobGraph -> ExecutionGraph -> 物理执行图,如图所示:StreamGraph:是根据用户通过 Stream API 编写的代码生成的最初的图,用来表示程序的拓扑结构。每个转换操作会生成一个StreamNode,两个StreamNodes之间由StreamEdge连接在一起,Str
2020-12-19 15:08:59 3236 3
原创 flink学习(三)——flink整体架构
flink作为一个分布式计算引擎,它可以在所有主流集群资源管理器中,如Hadoop YARN,Apache Mesos和Kubernetes,也可以运行在独立集群中。当然,它还提供了本地运行模式,可以供我们开发测试。架构组成flink集群中最重要的两个进程组件是:JobManager 和 TaskManager。这是典型的主从架构:一个集群中只能有一个JobManager(HA部署的除外,它会有一个leader jobmager和一个standby jobmanager),但是可以有多个TaskMan
2020-12-19 00:15:07 807 1
原创 flink学习(二)——flink怎么进行流计算
Apache Flink is a framework and distributed processing engine for stateful computations over unbounded and bounded data streams.上述那句话是flink官网对flink的描述。我们可以总结出两点计算特征:分布式有状态计算分布式很好理解。在大数据时代,作为数据处理引擎,分布式是必须的能力。...
2020-12-04 16:09:20 1181
原创 flink学习(加餐)——flink-mysql-cdc设置从指定position消费
目前发布的flink-connector-mysql-cdc(version:1.1.0)不支持从指定的mysql bin-log文件的某个position开始消费。不过也不是没有办法,我们可以增加一些额外配置使其支持。参考自Support read from specific MySQL Binlog position它的原理是通过设置OFFSET_STATE_VALUE属性,解析出bin-log文件和对应的position,在启动的时候即可指定position消费。OFFSET_STATE_VA
2020-12-04 11:25:09 1253
原创 flink学习(一)——什么是流处理
流处理引入为了理解流处理,我们先来看看批处理。批处理是把我们感兴趣的数据一起搜集下来加以处理,产生结果。比如说双十一当天有多少个用户购买了商品,每个用户分别买了多少件,分别是哪些品类的商品。过去需要第二天或者几个小时后才能出统计结果,我们才能知道双十一当天或者截止到某个小时有多少人买了东西等,这些是批处理的结果。批处理的结果生成相距用户实际行为的发生间隔了很长一段时间,往往是一天或者几小时。在现在的互联网竞争下,有时候这些数据统计延迟是无法接受的,我们需要更快地知道当前最新的数据状态,这就需要流处理(也可
2020-12-03 02:27:24 574
原创 flink学习(加餐)——job任务状态变化
我们来看一下flink官网的图:光看图就头晕了,我们可以来整理一下。首先flink job任务状态总共有:CreatedRunningFinishedFailedCanceledFailingCancelingRestartingSuspended根据个人理解,我们可以把这些状态分为四大类:起始态中间态最终态过渡态起始态表示任务启动时的状态,中间态表示任务运行时的状态,最终态表示任务最后的状态,过渡态表示任务在上述这些状态转化时中间过渡的状态。这样我们就把九个状
2020-12-03 01:56:36 3653 1
原创 进程与线程(一)
我们打开一个应用程序,就是操作系统就会启动一个进程。不同的应用程序之间数据是隔离的,比如qq无法访问到浏览器的数据(保存到文件的除外),也即进程之间运行数据是隔离的。线程是进程内部的执行单元,操作系统执行程序的最小单元。进程之间数据是隔离的,但是同一个进程内的不同线程之间资源是共享的。...
2020-10-30 00:09:03 155
原创 学点算法(十一)——将二叉树转为数组
今天我们来学习如何将二叉树转为数组(填坑学点算法(九)——二叉树中序遍历算法(递归实现))。首先,我们看下面这棵二叉树,我们从根节点出发,左右孩子依次排列在根节点后面,放入数组中,然后继续以同样的方法遍历其左右孩子,如果孩子节点的位置已经被叔父节点占据,则继续排在叔父节点后面,如果遇到没有左右孩子的情况,则将没有的节点置为null,将节点排列在数组中,直至遍历结束,位于数组结尾的null(后面没有有效节点值)可去除。我们来看下这个过程:首先我们放入1及其左右孩子,得到[1, 2, 3]。取1的左
2020-09-22 02:53:21 3224 2
原创 hadoop partitioner类加载分析
在hadoop中,在map方法结束写出数据的时候需要对数据进行分区,具体分区实现由Partitioner类提供,而Partitioner类的加载逻辑如下:partitions = jobContext.getNumReduceTasks();if (partitions > 1) { // 设置的分区数(即reduce task的个数)大于1,则使用设置的分区类 partitioner = (org.apache.hadoop.mapreduce.Partitioner<K,V>
2020-09-11 17:40:27 271
原创 hadoop mapreduce加载ClientProtocol(JobRunner)方法解析
hadoop mapreduce加载ClientProtocol(JobRunner)使用了spi机制,具体方法在Cluster#initialize。它会使用frameworkLoader加载ClientProtocolProvider,在hadoop的jar包里配置了两个实现类:org.apache.hadoop.mapred.YarnClientProtocolProvider,配置文件见~\.m2\repository\org\apache\hadoop\hadoop-mapreduce-cli
2020-09-06 10:48:14 362
原创 学点算法(十)——二叉树中序遍历算法(迭代实现)
今天我们继续来学习二叉树的中序遍历算法。在学点算法(九)——二叉树中序遍历算法(递归实现)中我们已经学习了二叉树中序遍历的递归算法,今天我们继续来学习它的迭代算法。我们先来看整个遍历的过程,如图所示:...
2020-06-30 15:37:09 693
原创 学点算法(九)——二叉树中序遍历算法(递归实现)
今天我们来学习二叉树的中序遍历算法。二叉树有多种遍历方法,前中序遍历和层次遍历。我们今天的主角是中序遍历,它的遍历顺序为:左子树根节点右子树如下图所示:我们知道树的定义本身就是递归式的,左子树就是一棵以根节点的左孩子为根节点的树,右子树也同理,所以遍历左子树或者右子树直接是把原来的根节点换成根节点的左孩子或者右孩子即可。这样我们可以很快地写出递归的中序遍历算法。import java.util.ArrayDeque;import java.util.ArrayList;import
2020-06-29 16:02:18 2329 1
原创 学点算法(八)——括号匹配算法
今天我们来学习括号匹配算法。作为程序员应该都知道,我们在码代码的过程中,会用到各类括号,无论是{}还是()还是[]。括号都要求成对出现,要不然就会报语法错误。得益于强大的IDE,我们不需要自己去检测括号,如果多写活着漏写了括号,IDE就会提示我们有语法错误,我们改正一下就可以了。那你是否好奇过IDE的这个检测算法是如何实现的呢?接下来我们来分析分析。我们前面提到了可能会有多种括号情况:{}、()、[]等等。我们先只取一种来分析,我们这里取()。见多识广先从简单的开始:0 * (1 + 2) ——
2020-06-22 17:14:20 2788 2
原创 学点算法(七)——十进制数转换为二进制数
今天我们来学习进制转换算法。大家学习计算机或者编程,都会知道计算机处理数据都是基于二进制的,而我们在日常生活中都是使用十进制。如果要用计算机存储数据,肯定要将十进制转化为二进制,或者我们要查数据,要将二进制转换为十进制,那么问题来了:现在有一个十进制数,我们如何将其转换为二进制数呢?比如我们现在有一个数字:1024(预先给定的数字默认用十进制理解)。用十进制表示为:1024(10)=1×103+0×102+2×101+4×1001024_{(10)} = 1 \times 10^3 + 0 \time
2020-06-15 22:11:38 2635
原创 学点算法(六)——数组选择排序
今天我们来学习数组的插入排序算法。假设你是一个农场工人,收获了100个萝卜,长短不一,农场主让你从小到大排列好售卖,你应该怎么做?
2020-06-12 18:56:22 658
原创 学点算法(五)——使用归并算法求数组的逆序对数
今天来学习归并算法的一个应用,求数组中的逆序对数。首先我们需要知道逆序对是什么东西:在一个数组中,有两个元素,索引小的元素比索引大的元素大,那这两个元素就构成一个逆序对。而一个数组中所有逆序对的个数就叫做逆序对数。暴力求解法我们可以很容易地想出暴力求解的方法:遍历数组,依次取数组中的每一个数,然后与索引排在其后的元素比较,如果比它小,则逆序对数+1,遍历完毕,得到的逆序对数则是数组的逆序对数。代码如下:/** * 暴力求解法求逆序对数 * @param nums 数组 * @return 逆
2020-06-08 17:11:53 307
原创 学点算法(四)——数组插入排序
今天来学习数组的插入排序算法。再将算法之前,我们先来想象这样一个场景:我们要上体育课,体育老师要求同学们从高到矮排好队。当同学们都排好队的时候,小甲同学迟到了。这时候小甲同学随便站个地方可不行,因为这样队伍就不是排好的了,所以要将小甲同学插入到队伍中,使队伍重新又是从高到矮排好的。小甲同学对比自己和同学们的身高,找到自己的位置,排到队伍里,就完成了队伍的排序。这个将一个无序元素插入到n个元素的有序集合,使新的(n+1)个元素的集合变成重新有序的动作就是插入排序的基本思想。借助这种思想,我们就可以把一个数
2020-06-07 09:23:13 307
原创 学点算法(三)——数组归并排序
今天来学习归并排序算法。归并算法的核心思想是分而治之,就是将大问题转化为小问题,在解决小问题的基础上,再去解决大问题。讲这句话套用到排序中,就是将一个大的待排序区间分为小的待排序区间,对小的排序区间进行排序,然后再去解决大区间的排序,而如何对小排序区间进行排序的时候可以继续使用该方法,将小的待排序区间分为小小的待排序区间… …依次往复。最终将排序区间分为只有一个元素的时候,因为一个元素已经就是排好序的,无需继续切分了,然后我们再依照此结果去解决大区间的排序。假设我们现在有[53, 89, 32, 45,
2020-06-02 20:23:01 1494 2
原创 学点算法(二)——有序数组二分搜索算法
今天来学习一下二分搜索算法。二分搜索算法针对有序数组,如果数组乱序,则无法使用二分搜索法。先来看一下二分搜索算法的运行原理:判断区间是否有效,无效区间则退出循环。取待查找区间的中间位置元素与目标值对比。如果目标值小于中间位置元素,则更新待查找区间索引,到左边子区间继续查找。如果目标值大于中间位置元素,则更新待查找区间索引,到右边子区间继续查找。相等,则找到元素,返回索引。循环退出,返回区间左边索引。我们举个例子直观感受一下:有一个数组[1, 3, 4, 5, 9, 10, 11,
2020-05-27 19:56:09 332
原创 学点算法(一)——ArrayList内部数组实现元素去重
在ArrayList中,内部实际存储的元素的是数组,要实现元素去重,即是对改数组进行去重。常规思路是借助外部数据结构,如HashMap等来实现数据查找是否存在后去重,这里我们来实现一个利用内部自身数组的去重方法。为了简要说明,我们自己来实现一个ArrayList,省略泛型实现,并且只实现add和remove方法,用来添加元素和删除元素,最后再实现我们要讲解的deduplicate去重方法。MyArrayList实现public class MyArrayList { private int s
2020-05-18 23:41:09 402
原创 算法学习——算法复杂度分析
时间复杂度分析规则单端代码:只关注循环执行次数最多的一段代码多段代码:加法法则,总复杂度等于量级最大的那段代码的复杂度嵌套代码:乘法法则,嵌套代码的复杂度等于嵌套内外代码复杂度的乘积多规模代码:多个参数控制的则将多个复杂度相加常见时间复杂度O(1)O(logn)O(n)O(nlogn)O(m+n)O(m*n)空间复杂度分析略...
2019-08-04 17:44:42 863
翻译 java虚拟机栈空间
翻译自:https://www.geeksforgeeks.org/java-virtual-machine-jvm-stack-area/在线程创建的时候,JVM会为每个线程创建一个单独的栈空间。JVM的栈内存不需要是连续的。JVM在栈上会进行两个操作:压入和弹出栈帧。对于一个特定的线程来说,栈被称为运行时栈(Run - Time Stack)。这个线程调用的每个方法会被存储在响应的运行时...
2019-04-20 17:30:13 3405 1
翻译 为啥内存需要堆?
翻译自:https://www.quora.com/Why-are-heaps-used-for-memory-allocation-Why-arent-stacks-or-any-others-used我们需要知道的最重要的事情是栈的功能和堆的功能这两者是有显著区别的。在一个典型的编程语言中,在一个方法调用的时候,一个“栈帧”就会被创建出来。随后,所有的该方法的本地变量就会在这个栈帧的范...
2019-04-09 11:13:21 1558 1
原创 Maven Toolchains自定义配置文件目录
maven的toolchains插件默认的配置文件读取目录为~/.m2,但是有时候配置文件toolchains.xml不在这个目录下,会导致maven编译报错,可以在运行maven命令的时候给定--global-toolchains file参数来自定义toolchains.xml的路径。...
2019-04-02 10:17:36 2532
原创 在Mac下使用vscode远程编辑文件
vscode编辑器有一个插件Remote VSCode,可以帮助我们在本地机器上使用vscode直接编辑远程文件。安装及配置步骤本地配置1、打开vscode,安装插件Remote VSCode ,按下快捷键Shift+Command+R,搜索remote,启动命令Remote: Start Server,2、打开命令行,输入命令ssh -R 52698:127.0.0.1:52698 远...
2019-01-10 10:02:42 7491 3
原创 mac解决brew link时报Permission denied的错误
在使用brew安装mysql的时候,报了如下错误:mkdir: /usr/local/var/homebrew/locks: Permission deniedError: Can't create update lock in /usr/local/var/homebrew/locks!Fix permissions by running: sudo chown -R $(whoami...
2019-01-02 01:04:53 4439
原创 IntellijIdea创建简单JavaWeb项目
在初始页面,点击Create New Project,如下选中WebApplication,把Create web.xml勾选上,然后填入项目名,点击Finish完成项目创建。目录结构如下所示,但是这个时候还不是Maven项目,还要启用Maven。在项目名上右键,然后点击Add Framework Support,找到Maven,点击OK,然后再pom.xml文件中填...
2018-12-31 18:32:30 652
原创 scrapy学习笔记一 —— 创建jobbole小爬虫
一、安装scrapy创建虚拟环境运行命令:conda create -n scrapy python=3.7 ,会在anaconda安装目录下的envs文件夹下创建出scrapy运行环境:~/anaconda3/envs/scrapy/切换到刚刚创建的scrapy虚拟环境,运行命令:pip install scrapypycharm设置刚刚创建的解释器二、创建爬虫py文件im...
2018-10-27 15:51:48 528
原创 python将代码安装至本地仓库
在python开发过程中,有时候会写一些通用的方法,这些方法可以被多个项目共享,但是每次写项目需要copy来copy去也非常不爽,所以如果能像python其他项目一样直接import进来就好了。下面举一个例子:我们开发好了这样一个项目: 现在我们想把这个导入到python的site-packages中,在项目根目录(InstallDemo目录)下新建一个setup.py文件,填入以下内容...
2018-07-13 10:34:51 1573
原创 Python如何修改脚本运行的命令行参数
在python中,所有的命令行参数存放在一个特殊的变量中:sys.argv。该变量的第一个参数是脚本名,路径可能是全路径,也可能不是,这取决于操作系统。其他的变量存储在argv[1:]里。知道这个后,想要修改命令行参数据非常容易了,只需要修改argv列表就可以了。比如添加一个参数s,运行sys.argv.append(s),添加一系列参数l,运行sys.argv.extend(l)...
2018-07-02 19:28:05 2412
原创 Servlet中getRequestURI()和getRequestURL()方法的区别
getRequestURI()和getRequestURL()的区别
2017-10-04 17:25:02 9637
原创 linux(ubuntu)跳板机连接和文件传输
今天工作环境从windows换成了ubuntu,开发的时候需要连上线上主机,但是需要通过跳板机连接。如果只是连接的话可以还是容易搞定的,但是遇到了一个文件传输的问题,由于有了跳板机,需要搞两次,有点烦,于是网上搜资料,最后终于搞定了。(我公司环境是通过密钥连接的,密码连接应该也类似)在~/.ssh下新建一个文件config,输入以下内容:Host gateway HostName 192.168
2017-06-22 18:14:21 10028 1
hadoop-2.7.2.zip
2020-11-13
draw.io-13.0.3-windows-no-installer.exe
2020-05-28
python-3.8.2官方文档
2020-04-28
复杂性思考第二版英文版pdf
2017-09-13
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人