自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

打酱油的葫芦娃

大数据 | 算法 | 数据挖掘 | Java | Python | Flink | Tensorflow | PyTorch

  • 博客(125)
  • 资源 (1)
  • 收藏
  • 关注

原创 关于我,技术交流

关于我坐标: 杭州本、硕均是交通专业,为了兴趣和爱好(主要是为了钱,哈哈哈),转行成为一名程序猿!技术方向为大数据和数据挖掘,Java为主,Python为辅。博客主要输出内容:分布式计算: Spark、Flink等框架的应用、架构设计、调优、源码分析等数据挖掘: TensorFlow、PyTorch等框架的应用及调优,机器学习算法、深度学习算法、强化学习等微服务: SpringBoot、SpringCloud全家桶、K8S等其他: Java进阶、Python数据分析等写博客的初衷总结、

2022-02-21 12:07:09 5920

原创 突破百度地图Web API的配额限制,实现接口调用自由!

本文系统分析了百度地图开放平台的Web API调用方式,通过JS逆向的方式实现了关键参数的构建,从而突破百度地图Web API的配额限制,实现接口调用自由。

2024-02-20 11:18:26 617

原创 MySQL的binlog和redolog

今天我们来聊一聊 MySQL 的 binlog 和 redo log。

2022-08-06 15:12:01 850 1

原创 基于源码搞懂LinkedHashMap并通过其实现LRU算法

LinkedHashMap 是通过哈希表和双向链表来实现的,其基于双向链表来保证对哈希表迭代时的有序性。LinkedHashMap 继承自 HashMap,从而可以直接复用 HashMap 对哈希表的操作逻辑,其只需要额外维护1套双向链表的操作逻辑即可。public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V>{ ......}节点LinkedHashMa

2022-05-07 17:24:08 3575

原创 彻底搞懂InnoDB存储引擎的索引模型

在 InnoDB 中,表都是根据主键的顺序以索引的形式来存放的,该种存放方式的表称为索引组织表。InnoDB 使用了 B+ 树索引模型,所以数据都是存储在 B+ 树中的。每一个索引在 InnoDB 里面均对应1棵 B+ 树。在讲解主键的 B+ 树之前,需要了解1个前置知识点:操作系统从磁盘读取数据到内存是以磁盘块(block)为基本单位的,位于同一个磁盘块的数据将被一次性读取出来,而不是需要什么取什么,该做法的理论依据就是计算机科学中著名的局部性原理–当一个数据被用到时,其附近的数据通常也会马上被使

2022-04-25 11:00:47 4435

原创 MySQL的InnoDB索引结构为啥选用B+树?

如果把数据库中的数据当做1个词典,那索引就是字典的目录,其目的是提升查找数据的速度。树的数据结构天然适合查找操作,最先被想到就是搜索二叉树。搜索二叉树二叉树(Binary Search Tree)是每个节点最多有2个子树(左子树和右子树)的树结构,而搜索二叉树是一类特殊的二叉树,其具有以下性质:若它的左子树不为空,则左子树上所有节点的值都小于根节点的值;若它的右子树不为空,则右子树上所有节点的值都大于根节点的值;它的左右子树也分别为搜索二叉树。搜索二叉树中序遍历的结果是有序的。搜索二

2022-04-20 14:51:12 6398

原创 如何在CentOS7系统上离线安装MySQL数据库

本文主要讲解如何在 CentOS7 系统上离线安装 MySQL 数据库。下载安装包http://dev.mysql.com/downloads/mysql/上传到服务器,解压(base) [root@master ~]# cd /usr/lib/ruanshubin/(base) [root@master ruanshubin]# tar -zvxf ./mysql-8.0.28-el7-x86_64.tar.gz 创建 mysql 用户(base) [root@master

2022-04-15 15:47:56 5394

原创 一文教会你HashMap为啥线程不安全(多图VIP版)

首先思考一下,为啥 HashMap 会存在线程安全性问题?有的人脱口而出,JDK7 的 HashMap 因为采用头插法,多线程环境下会造成死循环,JDK8 虽然改用了尾插法,但多线程环境下仍然存在丢失更新的问题,所以 HashMap 存在线程安全性问题。一听就是老八股人了,哈哈哈。但其实上面的答案并不全面,而且很容易误导编程的新手,让新手总以为 HashMap 只是因为死循环或者丢失更新的问题才导致的线程不安全。HashMap 之所以存在线程安全性问题,本质上是因为 HashMap 的"增删改"操作

2022-04-14 20:27:08 6961 2

原创 Flink进阶系列--类加载机制

本文的Flink源码版本为: 1.15-SNAPSHOT,读者可自行从Github clone.要讲解 Flink 的类加载机制,首先你得对 JDK 的类加载机制有所了解。推荐阅读我之前写的1篇博客: 基于源码深入了解Java的类加载机制(JDK8和JDK11双版本)接着看一下 FLink 的类加载器继承结构:FlinkUserCodeClassLoader 继承自 URLClassLoader 类,其 loadClass() 方法实现如下:@Overridepublic final Cl.

2022-04-10 16:38:47 7387 1

原创 基于源码深入了解Java的类加载机制(JDK8和JDK11双版本)

Java 虚拟机设计团队有意将类加载阶段中的"通过一个类的全限定名来获取描述该类的二进制字节流"这个动作放到 Java 虚拟机外部来实现,以便让应用程序自己来决定如何去获取所需的类,实现这个动作的代码称之为"类加载器 (Class Loader) "。由于 JDK9 引入了模块化新特性,所以 JDK9 前后的类加载实现也略有区别,本文将分开讲解。首先基于 JDK8 来讲解类加载机制。JDK8双亲委派模型java.lang.ClassLoader 抽象类的 loaderClass() 方法定义了类加

2022-04-09 16:59:49 6882

原创 Flink源码解析系列--StreamExecutionEnvironment类

本文的Flink源码版本为: 1.15-SNAPSHOT,读者可自行从Github clone.Flink 程序看起来像一个转换 DataStream 的常规程序。每个程序由相同的基本部分组成:获取一个执行环境(execution environment);加载/创建初始数据;指定数据相关的转换;指定计算结果的存储位置;触发程序执行。StreamExecutionEnvironment 是所有 Flink 程序的基础。创建你可以使用 StreamExecutionEnvironme.

2022-03-31 18:25:00 10256 1

原创 Flink源码解析系列--Timer定时器

Timer(定时器)是 Flink Streaming API 提供的用于感知并利用 Processing Time/Event Time 变化的机制。Ververica blog上给出的描述如下:Timers are what make Flink streaming applications reactive and adaptable to processing and event time changes.对于普通用户来说,最常见的显式利用 Timer 的地方就是 KeyedProcessF

2022-03-26 16:44:02 8178

原创 Flink源码解析系列--ProcessingTimeService定时器

本文的Flink源码版本为: 1.15-SNAPSHOT,读者可自行从Github clone.@PublicEvolvingpublic interface ProcessingTimeService { // 返回当前的 processing time long getCurrentProcessingTime(); /** * Registers a task to be executed when (processing) time is {@code .

2022-03-24 22:05:39 7072

原创 Flink源码解析系列-- WatermarkGenerator接口及其常用实现

本文的Flink源码版本为: 1.15-SNAPSHOT,读者可自行从Github clone.Flink 提供了 WatermarkGenerator 接口用来"制造"水印:/** * {@code WatermarkGenerator} 可以基于事件或者周期性的生成 watermark。 * * <p><b>注意:</b> WatermarkGenerator 将以前互相独立的 {@code AssignerWithPunctuatedWatermar.

2022-03-23 22:46:50 6996

原创 Flink入门系列--和Springboot框架结合(1.14.3版本)

本文 Flink 版本为 1.14.3。本文主要讲解如何将 Flink 和 Springboot 两大框架融合在一起,可以对接 SpringCloud 生态系统,比如分布式配置中心、服务注册和发现、负载均衡等;可以通过 Restful 接口的形式提交 Flink 任务。本地工程构建软件环境:Flink 1.14.3Springboot 2.0.3.RELEASEJDK 11<?xml version="1.0" encoding="UTF-8"?><proj.

2022-03-20 12:51:40 10114 4

原创 Flink进阶系列--FLIP-27新的Source架构

Source 旧架构在 Flink 1.12之前,开发一个新的 source connector 是通过实现 SourceFunction 接口来完成的。@Publicpublic interface SourceFunction<T> extends Function, Serializable { // 当 source 开始发送数据时,run 方法被调用,其参数 SourceContext 用于发送数据。run 方法是一个无限循环,通过一个标识 isRunning 来跳出循

2022-03-18 16:16:47 9777

原创 Flink源码解析系列--FutureCompletingBlockingQueue阻塞队列

本文的Flink源码版本为: 1.15-SNAPSHOT,读者可自行从Github clone.Flink 在实现 SourceReaderBase 类时,并没有直接使用 JDK 自带的BlockingQueue 阻塞队列来缓冲 fetcher 线程获取的元素,而是自定义1个阻塞队列,即 FutureCompletingBlockingQueue 类。FutureCompletingBlockingQueue 的入队实现基本和 ArrayBlockingQueue实现类似,当队列已满时,会通过 Co.

2022-03-17 19:25:02 6144

原创 Flink入门系列--架构、应用程序执行、分层API(1.14.3版本)

Flink 集群剖析Flink 运行时由两种类型的进程组成:一个 JobManager 和一个或者多个 TaskManager。Client 不是运行时和程序执行的一部分,而是用于准备数据流并将其发送给 JobManager。之后,客户端可以断开连接(分离模式),或保持连接来接收进程报告(附加模式)。客户端可以作为触发执行 Java/Scala 程序的一部分运行,也可以在命令行进程./bin/flink run …中运行。可以通过多种方式启动 JobManager 和 TaskManager:直接在

2022-03-16 19:08:04 6024

原创 Flink源码解析系列--StreamPartitioner(流分区器)

本文的Flink源码版本为: 1.15-SNAPSHOT,读者可自行从Github clone.StreamPartitioner抽象类@Internalpublic abstract class StreamPartitioner<T> implements ChannelSelector<SerializationDelegate<StreamRecord<T>>>, Serializable { private stat.

2022-03-15 22:16:37 5941

原创 Flink源码解析系列--SubtaskStateMapper枚举类

假如 Flink 任务某个算子的并行度为4,该算子的状态做了 checkpoint 后任务停止。该算子的并行度调整为2后重新启动任务,新 task 中的各个 subtask 需要从 checkpoint 中哪些旧的 subtask 中获取数据呢?Flink 提供了 SubtaskStateMapper 枚举类来定义上述行为。其核心方法为:public abstract int[] getOldSubtasks( int newSubtaskIndex, int oldNumberOfSubtask

2022-03-14 15:41:41 6176

原创 Flink入门系列--安装部署及任务提交(1.14.3版本)

部署模式Flink 的部署模式分为3种:Application 模式Per-Job 模式Session 模式Application 模式Application 模式即 Flink 为1个应用专门创建1个集群,Flink集群和应用同生命周期,Application 的main()方法将由 JobManager执行。在其他部署模式下,用户 Jar 文件是通过 RPC 来进行分发的,因为需要走网络IO,当用户 Jar 文件较大时,JobManager 加载用户 Jar 文件将是1个耗时的操作。为

2022-03-12 11:57:12 7854

原创 数字的计算机表达--大小端和浮点数

大端和小端起源关于大端小端名词的由来,有一个有趣的故事,来自于Jonathan Swift的《格利佛游记》:Lilliput和Blefuscu这两个强国在过去的36个月中一直在苦战。战争的原因:大家都知道,吃鸡蛋的时候,原始的方法是打破鸡蛋较大的一端,可以那时的皇帝的祖父由于小时侯吃鸡蛋,按这种方法把手指弄破了,因此他的父亲,就下令,命令所有的子民吃鸡蛋的时候,必须先打破鸡蛋较小的一端,违令者重罚。然后老百姓对此法令极为反感,期间发生了多次叛乱,其中一个皇帝因此送命,另一个丢了王位,产生叛乱的原因就是另

2022-03-10 19:52:47 5391

原创 手撸RPC框架系列--Java简易版

RPC是Remote Procedure Call(远程过程调用)的简写,即实现调用远程计算机上的方法,就像调用本地方法一样。分布式环境下各个服务之间的协作,必然会用到RPC的思想。一般来讲,RPC框架会包含3部分:服务提供者(ServiceProvider)注册中心(RegistryCentre)服务消费者(ServiceComsumer)RPC整个过程可以概括如下:定义好统一的请求体(RpcRequest)和返回体(RpcResponse);定义好服务接口;服务提供者完成接口的实

2022-03-10 19:43:18 5000

原创 Flink源码解析系列--JdbcDialect接口

本文的Flink源码版本为: 1.15-SNAPSHOT,读者可自行从Github clone.虽然不同的关系型数据库均遵循一定的统一标准,但各自的Driver实现,增删改查的SQL语法等可能略有不同。就跟中国话也有各地区的方言一样,数据库也有属于自己的"方言",即JdbcDialect。在Flink中,JdbcDialect被定义为1个接口。public interface JdbcDialect extends Serializable { // 方言名称 String di.

2022-03-09 13:45:05 5987

原创 一文教会你Gitlab搭建

安装步骤配置yum源vim /etc/yum.repos.d/gitlab-ce.repo复制以下内容:[gitlab-ce]name=gitlab-cebaseurl=http://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el6Repo_gpgcheck=0Enabled=1Gpgkey=https://packages.gitlab.com/gpg.key更新本地yum缓存sudo yum makecache安装Gi

2022-03-08 11:29:32 8343

原创 Git私服搭建

系统环境系统: Linux:CentOS 7.2 64位由于CentOS已经内置了OpenSSH,如果您的系统没有,请自行安装。查看ssh版本:[root@****** ~]# ssh -V# 输出以下表示没问题,可以继续。 版本可能不一致,能用即可。OpenSSH_7.4p1, OpenSSL 1.0.2k-fips 26 Jan 2017避免系统环境和其他的不一致,请核对您系统的版本,其他发行版请对应修改。安装git建议以下操作都切换到root:# 请确保您切换到了roo

2022-03-08 11:23:58 8009

原创 Thread类源码解读3--线程中断interrupt

线程中断是一个很重要的概念,通常,取消一个任务的执行,最好的,同时也是最合理的方法,就是通过中断。本篇我们主要还是通过源码分析来看看中断的概念。本文的源码基于JDK1.8Interrupt status & InterruptedExceptionjava线程的中断机制为我们提供了一个契机,使被中断的线程能够有机会从当前的任务中跳脱出来。而中断机制的最核心的两个概念就是interrupt status 和 InterruptedException。java中对于中断的大部分操作无外乎以下两

2022-03-07 23:45:43 4829

原创 Thread类源码解读2--线程状态及常用方法

本文源码基于jdk1.8 。线程状态在Thread类中, 线程状态是通过threadStatus属性以及State枚举类实现的:/* Java thread status for tools, * initialized to indicate thread 'not yet started' */private volatile int threadStatus = 0;public enum State { /** * Thread state for a threa

2022-03-07 23:44:11 4835

原创 Thread类源码解读1--如何创建和启动线程

本文源码基于jdk1.8 。Runnale接口我们看Thread类的定义知道,它实现了Runable接口public class Thread implements Runnable { ...}而Runnable接口的定义如下:@FunctionalInterfacepublic interface Runnable { public abstract void run();}它只有一个抽象方法run。同时,该接口还被@FunctionalInterface注解标注,

2022-03-06 10:03:31 5034

原创 Yarn的调度器--Scheduler探究

引言在Yarn体系中,Scheduler负责为Application分配资源,按照调度策略可分为以下3种:FIFO SchedulerCapacity SchedulerFair Scheduler[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-b1MDm561-1646531647469)(Yarn的调度器–Scheduler探究/1.jpg)]下面具体介绍上述3种调度器:FIFO Scheduler顾名思义,该调度器是按照应用的提交顺序分配资源的,先进先

2022-03-06 10:01:34 5016

原创 Yarn的资源配置参数

YARN的资源调度主要针对的是内存(Memory)和CPU,并将其组合抽象成Container来管理分配。在YARN中,资源管理由ResourceManager和NodeManager共同完成,其中,ResourceManager中的调度器负责资源的分配,而NodeManager则负责资源的供给和隔离。ResourceManager将某个NodeManager上资源分配给任务(这就是所谓的“资源调度”)后,NodeManager需按照要求为任务提供相应的资源,甚至保证这些资源应具有独占性,为任务运行提供基

2022-03-05 16:14:57 5453

原创 Yarn的基本架构

基本流程1.应用程序通client类向ResourceManager提交程序,Application运行所需要的入口类,出口类,运行的命令,运行所需要的cpu资源和内存资源,jar包资源。2.ResourceManager通过内部的调度器,去集群中寻找资源,找到资源后与NodeManager进行通信,去启动相应的ApplicationMaster,AM会按照事先的规划将任务切分为许多的task任务。3.ApplicationMaster之后向ResourceManager进行申请资源,RM会将资源进行

2022-03-05 16:13:03 7671

原创 Java停止线程的3种方式

在Java中有以下3种方式终止正在运行的线程:使用退出标志,使线程正常退出;使用stop()方法强行终止线程,不推荐使用该方法,JDK已声明弃用;使用interrupt方法中断线程。使用标志位在 run() 方法执行完毕后,该线程就终止了。但是在某些特殊的情况下,run() 方法会被一直执行;比如在服务端程序中可能会使用 while(true) { … } 这样的循环结构来不断的接收来自客户端的请求。此时就可以用修改标志位的方式来结束 run() 方法。public class Server

2022-03-04 11:14:39 8072

原创 Unsafe类详解

Java 不能直接访问操作系统底层,而是通过本地方法来访问。Unsafe 类提供了硬件级别的原子操作。Unsafe 类在 sun.misc 包下,不属于 Java 标准。很多 Java 的基础类库,包括一些被广泛使用的高性能开发库都是基于 Unsafe 类开发,比如 Netty、Hadoop、Kafka 等。Unsafe 是用于在实质上扩展 Java 语言表达能力、便于在更高层(Java 层)代码里实现原本要在更低层(C 层)实现的核心库功能用的。这些功能包括裸内存的申请/释放/访问,低层硬件的.

2022-03-04 11:09:44 12508

原创 Java多线程系列--Future接口和CompletableFuture类

Future接口Future接口是Java 1.5引入的新特性,可以方便的用于异步结果的获取。接口定义如下:public interface Future<V> { // 取消提交的异步任务 boolean cancel(boolean mayInterruptIfRunning); // 判断异步任务是否已取消 boolean isCancelled(); // 判断异步任务是否已完成 boolean isDone(); /

2022-03-02 15:37:16 6077

原创 一文教会你如何基于高德地图获取城市公交网络数据(包含经纬度)

之前写过1篇如何基于8684公交查询网站获取城市公交网络数据的文章,但获取到的公交网络数据里是不包含经纬度信息的。近日,有小伙伴咨询我,怎样把公交线路和各站点的经纬度信息也同步获取到,从而进行一些可视化展示。周末闲来无事,就基于高德地图简单研究了一下,并把实现过程分享出来。1 获取公交线路名称集合想要获取整个城市的公交线路数据,第一步是先拿到城市公交线路的名称集合,然后再基于线路名去请求各个线路的详细信息。这一过程可以基于8684公交查询网站来实现,具体过程可参见我之前的博文。代码如下:de

2022-02-28 15:38:28 10697 10

原创 Flink源码解析系列--DataStream JDBC-Sink

本文的Flink源码版本为: 1.15-SNAPSHOT,读者可自行从Github clone.进行源码分析之前,首先看一下Flink DataStream JDBC-Sink的官方示例:StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();env .fromElements(...) .addSink(JdbcSink.sink( "insert into books (.

2022-02-23 16:40:27 9314

原创 一文教会你JDK8的函数式编程

JDK8的1个新特性就是支持函数式接口(Functional Interface)。函数式接口就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。函数式接口可以被隐式转换为Lambda表达式。我们也可以自行定义函数式接口,如:@FunctionalInterfaceinterface GreetingService{ void sayMessage(String message);}然后通过Lambda表达式来定义接口实现(JAVA8之前一般使用匿名类来实现):public c

2022-02-23 11:31:49 6690

原创 分布式系统之CAP和BASE理论

CAP理论2000年7月,加州大学伯克利分校的Eric Brewer教授在ACM PODC会议上,首次提出了CAP猜想。2002年,麻省理工学院的Seth Gilbert和Nancy Lynch从理论上证明了CAP猜想的可行性。所谓CAP理论,指的是分布式系统不可能同时满足一致性(C:Consistency)、可用性(A:Availability)和分区容错性(P:Partition tolerance)这3个基本需求,最多只能同时满足其中的2项。Consistency(一致性)分布式系统中,为了

2022-02-21 22:01:59 5570

原创 如何获取全国省市区行政边界数据

今天我们以高德地图为例,讲解一下如何获取全国省市区行政边界数据。高德开放平台Web服务APIhttps://lbs.amap.com/依次点击开发支持–Web服务–Web服务API,即可进入到高德开放平台Web服务API页面。可以发现,官方已开放了行政区域查询的接口。点击查看该接口的详细介绍:其实就是先申请Key,然后构造Http请求,发送请求解析返回数据即可。同时接口文档提到,该接口只能返回国、省、市、区的polyline(边界点集合),不支持街道级别,但已经满足我们的需求了。首先分

2022-02-17 19:59:06 15660 1

快学Scala(完整版)

快学Scala(完整版)

2017-09-20

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除