自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(130)
  • 资源 (2)
  • 收藏
  • 关注

原创 推荐系统的基础算法和企业级设计

推荐系统的基础算法和企业级设计推荐系统介绍推荐系统的技术选型和基础数据2.1 技术选取2.2 数据简介算法讨论基于统计学的推荐算法LFM算法实时推荐算法推荐系统介绍在互联网时代,为了能够给用户良好的体验并且增大用户的留存率,推荐系统应运而生。简单的推荐系统就是依据统计的推荐,也就是说,这与用户无关,每个人的界面看到的东西都是一样的。比如电商中Hot的商品,或者电影观看网站的Top N的电影。只要能够获得所有用户的够买或者评分数据,我们就能够做出统计推荐。另一部分的推荐则是个性化推荐,每个用户推到的东

2021-10-15 09:57:29 265

原创 appium操控微信小程序的坑

在微信上打开一个小程序,如果浏览器能够检测到,那就说就说明微信已经开启了debug模式。小程序是运行在谷歌浏览器里面的,是一个进程,这种也叫webview。你要获取里面的元素,得把上下文从微信迁到小程序。我打算使用appium操控微信小程序,只要能够获取到小程序的页面元素就算成功。C:\Users\resus\Desktop\a.txt 是日志的目录。他说微信已经启动了,我根本没启动啊。我这里的问题是:没有打开debug模式。把webview想成是PC的页面就行。微信没有打开,直接就定位通讯录。

2023-10-27 17:21:23 1737

原创 自己用的停用词(2955个)

停用词多就是好啊,先记下来,以后增加的话再增。

2022-10-20 09:23:37 733 1

原创 spark对接elasticsearch遇到的坑

问题:pushdown是官网强烈推荐的,不过我怎么知道他将spark sql转成了什么dsl语句呢?也就是说,我怎么知道谓词下推有没有成功?问题:我从host1中读取es的数据,要写入host2中,怎么做呢?问题:我不要es自动生成_id,我自己指定。问题:出现了和hadoop相关的问题。解决:读取和写入使用不同的配置。问题:解析none值有问题。...

2022-08-26 09:19:03 1587 3

原创 mysql中的锁

此次实验所使用的mysql版本为mysql8:因为我们可以在中看到锁的情况。引擎是innodb。事务隔离级别是RR。mysql中的锁可以按照锁的粒度分,表锁就是其中的一种(另一种是行锁)。虽然锁一整张表在实际操作中是不明智的,但我们还是探究一下。准备的表:我们有主键索引以及二级索引。然后插入一些数据:为了看到中锁的情况,我们需要设置:S锁首先看看表级别的读锁:读锁可以被多次获取(session1和session2同时获取到了读锁)。我们可以看到的数量增加了。然后我们查看锁的情况:可以看到一个锁(

2022-06-29 19:39:51 998 1

原创 使用ProxyFactoryBean实现AOP

以前我在springAOP里写过aspectJ的代理生成逻辑,也看了spring编码方式的代理生成。我们可以来复习一下。我们整一个接口和实现类:再整一个拦截器,或者叫,就是说,切面怎么切的意思。他接受一个作为参数,在这里就是(一次方法调用)。然后是配置类:测试类:从这个demo中我们已经可以看到spring的aop全貌了:代理的接口,目标对象,如何代理,以及使用代理工厂去生成代理。我们还能够使用去生成代理,这时候就不再是原始的生成方式了,因为这时需要走spring的bean的生命周期。他首先是个,

2022-06-16 12:06:58 232

原创 从put操作看ConcurrentHashMap如何解决线程安全问题

hashmap(jdk1.8)是线程不安全的,其中一个体现是方法,我们看一下大概的逻辑:如果原来这里没有相同hash值的节点,那就new一个,其实就是说,这是一个新节点,没有hash冲突发生。假设线程A和线程B都执行操作,然后key的hash值一样,然后同时走到假设之前没有hash相同的节点存在,那么A和B线程就会都执行如此一来后执行的线程就会将先执行的覆盖掉,本来两个元素就变成了一个元素,而不会出现链表挂下去的情况。我的测试代码:为了让效果出来,我需要修改一下的源码:我让hash冲突的线程睡1秒

2022-06-02 11:07:38 710

原创 [WinError 193] %1 不是有效的 Win32 应用程序问题解决

[WinError 193] %1 不是有效的 Win32 应用程序问题解决

2022-05-31 22:25:40 5385

原创 Thread join源码解析

Thread join源码解析join例子解析join例子join就是某个线程加入的意思,或者说,插队,可以保证线程的顺序执行。我们看一个简单的例子:public class TestJoin { public static void main(String[] args) throws InterruptedException { System.out.println("main start"); Thread t1 = new Thread(() ->

2022-05-27 10:38:17 468

原创 @Async注解引发的报错之解决

solution问题解决问题解决在上篇文章中,我们知道了TaskServiceImpl在注入RobotServiceImpl前后从raw version变成了代理。而且我们希望找到dependentBeanMap这个map维护的地方。在属性注入的代码里,我们看到了dependentBeanMap维护的地方。那么我们想:能不能不进这个方法?...

2022-05-15 19:28:05 932

原创 @Async注解引发的报错之AsyncAnnotationBeanPostProcessor

回顾上篇文章,我们正在走robotServiceImpl的生命周期,走到属性注入的时候,发现容器中没有taskServiceImpl,于是去创建taskServiceImpl,那就要走taskServiceImpl的生命周期。taskServiceImpl实例化后也要属性注入robotServiceImpl,发现容器中也没有,那就再去创建robotServiceImpl,创建过程中发现robotServiceImpl在singletonsCurrentlyInCreation这样一个集合中,于是就从si

2022-05-05 17:50:41 496

原创 springboot的web服务器

我们知道,springboot是spring-mvc的整合,其中一项优点是内嵌服务器。但是,他并非一定要使用内嵌服务器,springboot也提供了外部部署的选项。springboot启动内嵌服务器外部服务器内嵌服务器首先摘入官网的一段话:Under the hood, Spring Boot uses a different type of ApplicationContext for embedded servlet container support. The ServletWebServe

2022-02-13 21:02:09 2900

原创 @Async注解引发的报错之循环依赖

@Async注解引发的报错之循环依赖回顾RobotServiveImpl与TaskServiceImpl的循环依赖回顾我们现在正在探究循环依赖中加了@Async注解产生的错误。报的错误是:Unsatisfied dependency expressed through field 'taskService'; nested exception is org.springframework.beans.factory. BeanCurrentlyInCreationException: Err

2022-02-03 19:40:46 1289

原创 @Async注解引发的报错之组件导入

引入我有一个TaskService:@Servicepublic class TaskServiceImpl implements TaskService { @Autowired private AlgorithmService algorithmService; @Autowired private RobotService robotService; @Override @Async public void getTaskExecut

2022-02-02 22:34:23 925 2

原创 shuffle过程

案例假设我们写一个wordcount的程序:sc.textFile("hdfs://hadoop102:8020/spark-input/word.txt").flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_).saveAsTextFile("hdfs://hadoop102:8020/spark-out/wcout")观看job:划分了两个stage,因为出现了shuffle:一共是4个task,第一个stage两个task,第二个

2021-10-21 17:58:54 808

原创 mapJoin与reduceJoin

mapreduce中可以实现map端的join以及reduce端的join,我们看下有什么区别。mapJoin与reduceJoin数据准备reduce joinmap joinhive的map join测试数据准备有一张订单表(order):1001 01 11002 02 21003 03 31004 01 41005 02 51006 03 6三列对应的字段分别是订单ID,产品ID以及产品数量。然后还有一张产品表(pd):01 小米02 华为03 格力对应的字段分别是

2021-10-15 20:27:08 629

原创 hbase rowkey设计案例

介绍hbase中的rowkey可以唯一定位一条数据。rowkey设计的合不合理,很大程度上可以解决数据倾斜的问题。和rowkey密切相关的是分区键,我们可以用命令行或者代码方式创建分区键:比如staff这个表就有4个分区键:aaaabbbbccccdddd由此切割成5个分区。rowkey带着一条数据来了之后就要和这些分区键去比较,决定自己进入哪一个分区。比较的规则是字典排序。我们想要的是,第一,一条数据来了之后,立马能够知道他进入哪个分区,而不用一位一位的比较。能够达成这个想法的做

2021-10-15 08:30:01 1193

原创 网络通信加密与应用

网络传输数据是不安全的,因为数据可以截取,篡改。因此,我们需要用加密算法对数据进行加密。加密和应用对称加密与非对称加密支付宝的应用https协议对称加密与非对称加密所谓的对称加密,就是加密与解密用的是同一把钥匙。这里的问题在于,只要这把钥匙泄露,那么整个通信过程就完全被监听了。此时,我们需要更多的钥匙,来确保信息的安全性。先看发送方—>接受方这条路径。发送方用一把钥匙加密,接收方用另一把钥匙解密。接收方—>发送方也是一样,一把钥匙加密,一把钥匙解密。至此,我们出现了四把钥匙

2021-10-15 08:29:35 250

原创 自定义分区并区内排序

简单的wordCount假设我们的文件中有这么一些数据:sparksparkhivehadoopsparksparkhivehadoopsparksparkhivehadoopsparksparkhivehadoopsparksparkhivehadoopsparksparkhivehadoopsparksparkhivehadoopsparksparkhivehadoopsparksparkhivehadoopsparkspar

2021-10-15 08:28:24 341

原创 rdd之行动算子

行动算子就是会触发action的算子,触发action的含义就是真正的计算数据。一些行动算子collectreduceaggregateforeachcounttakeOrderedmincollectcollect就是将executor端的数据收集到driver端。比如一个简单的wordcount程序:object CollectAction { def main(args: Array[String]): Unit = { val conf: SparkConf = new Spa

2021-10-15 08:27:36 585

原创 rdd算子之cogroup

coGroup及其应用cogroupintersectionleftOuterJoin, rightOuterJoin, fullOuterJoin, joincogroupcogroup也能组合RDD。例子:object CogroupOperator { def main(args: Array[String]): Unit = { val sparkConf: SparkConf = new SparkConf().setAppName(this.getClass.getSimpl

2021-10-15 08:26:41 324

原创 rdd算子之byKey系列

spark中有一些xxxByKey的算子。我们来看看。rdd算子之byKey系列groupByKey解释实现groupByreduceByKeydistinctaggregateByKeycombineByKeygroupByKey解释假设我们要对一些字符串列表进行分组:object GroupByKeyOperator { def main(args: Array[String]): Unit = { val conf = new SparkConf().setMaster("loc

2021-10-15 08:25:54 409

原创 rdd算子之map相关

首先是RDD算子中与map有关的几个算子的理解。rdd算子之map相关mapmapPartitionsmapPartitionsWithIndexmapmap其实就是一种数据结构的映射,将一种结构转换成另一种结构。一个简单的spark程序实现列表中的每个数乘以2:object MapOperator { def main(args: Array[String]): Unit = { val conf = new SparkConf().setMaster("local[*]").set

2021-10-14 20:42:38 2425

原创 Spark源码之通信环境

Spark通信通信组件RpcEndpoint,RpcEnv,RpcEndpointRef,RpcAddressTransportServer,TransportClient,Outbox,Inbox,DispatcherDriver端Executor端通信组件为了了解spark的通信环境,我们需要了解它的主要组件。RpcEndpoint,RpcEnv,RpcEndpointRef,RpcAddress首先是RpcEndpoint:一个通信终端有他自己的生命周期:constructor -&gt

2021-10-14 20:37:11 201

原创 spark源码之环境准备

我们使用yarn集群作为研究spark环境准备yarn环境准备启动Driver启动Executoryarn环境准备spark的入口类是SparkSubmit,在这里,我们开始提交参数这里的args就是--class这些的。解析好这些参数后,我们会返回一个SparkSubmitArguments的一个属性action的值并进行模式匹配。我们可以看到,action默认就是SUBMIT。于是走submit分支:假设我们没有使用--proxy-user参数,于是走runMain(args,

2021-10-14 18:58:08 195

原创 电商数仓简介

数仓是为决策用的,它的架构逻辑十分严密。数仓分区ods层dwd与dim层事务型事实表周期型事实表累计型快照事实表dws层dwt层ads层用户行为路径分析漏斗模型留存用户ods层数仓是分层的。ods层是直接从hdfs拿数据,不做任何修改,只是添加了时间分区。添加时间分区后,方便后续的查询和管理。那hdfs的原始数据从哪里来呢?如果是业务数据,那就是从mysql用sqoop导进来的,导入的时候就会使用压缩(比如LZO压缩)。mysql有什么表,hdfs就对应有什么表。如果是日志数据,那就从文件导入

2021-10-14 17:41:10 1010

原创 hdfs上传文件

hdfs写数据流程将文件添加到目录树将数据写入队列机架感知DN写数据、客户端收到应答将文件添加到目录树假设我们有一段创建文件并写入数据的代码: FileSystem fileSystem; @Before public void init() throws Exception{ String user = "ocean"; Configuration configuration = new Confi![image.png](http://oce

2021-10-14 13:40:31 1325

原创 namenode的启动

我们简单看下namenode启动需要经历的步骤。namenode启动要做什么启动9870服务端口加载镜像文件和编辑日志文件初始化RPC服务启动资源检查检查心跳检查是否进入安全模式启动9870服务端口因为namenode是一个进程,所以找到它的main方法:进入createNameNode:找到new NodeNode(conf),进去。找到初始化方法,进入:他要获取绑定的地址,我们希望知道这个地址是什么。看看这个默认的地址:端口号是9870。这就是我们经常用的namenode的

2021-10-14 12:24:19 3958

原创 MapReduce之Reduce

我们接着MapReduce之ShuffleReduceCopyMergeReduceCopy走到这里,我们就进入到reduce了。reduce有三个明确的阶段:copy,sort,reduce。在初始化ShuffleConsumerPlugin的时候,他需要创建一个MergeManager:这个MergeManager就是用来做文件合并的。接下来我们使用localFetcher去拉取map的输出文件。在此我们将获取file.out文件和file.out.index文件。我们将

2021-10-14 12:05:58 309

原创 MapReduce之Shuffle

承接上文MapReduce之Map阶段。我们需要将map后的数据往外写。shuffle收集数据排序和溢写合并收集数据我们写出的数据是("I", 1)。我们需要往kvbuffer中写key和value。写key的时候我们既要写I,又要写它的位置,不然怎么能找到它呢?写的时候,如果剩余内存不够用了,就会发生溢写:写I之前,我们已经有1这个位置了:写了I之后就有了它的ASCII值了:接着写1这个值,因为我们的1是Long,占8个字节,所以会占用kvbuffer的8个位置:此时我们

2021-10-14 11:03:19 121

原创 MapReduce之Map阶段

MapReduce阶段分为map,shuffle,reduce。map进行数据的映射,就是数据结构的转换,shuffle是一种内存缓冲,同时对map后的数据分区、排序。reduce则是最后的聚合。此文探讨map阶段的主要工作。map的工作代码介绍split启动mapTask代码介绍我们还是准备word count的代码:maper:public class WordCountMapper extends Mapper<LongWritable, Text, Text, LongWrita

2021-10-14 10:32:04 2644

原创 namenode的fsimage与edits文件

引入hadoop集群中,namenode管理了元数据。那么,元数据存储在哪里呢?如果是磁盘中,必然效率过低,如果是内存中,又会不安全。所以元数据存储在内存中,但是有一个备份文件fsimage在磁盘。这就防止了断电元数据丢失的问题。现在内存中的元数据增加之后,需要不断同步fsimage吗?这样又很没有效率。但你又必然要更新元数据,所以,可以将追加的操作写入一个文件edits。fsimage与edits一起加载到内存中,就会得到所有的元数据。合并元数据一旦变得庞大,加载到内存就会很慢。所以,还需要

2021-10-14 09:21:56 490

原创 gc日志分析

gc日志轻GCFull GC轻GC先来这么一个小程序:public class TestGCMessage { public static void main(String[] args) { int size = 1024 * 1024; byte[] b1 = new byte[2 * size]; byte[] b2 = new byte[2 * size]; byte[] b3 = new byte[3 * size];

2021-05-07 20:18:01 126

原创 k8s部署单节点的mysql和nacos

k8s部署单节点的mysql和nacos自定义StorageClass部署单节点mysql部署单节点nacos自定义StorageClass因为mysql和nacos都是有状态服务,所以我们需要指定存储的方式。这里,我们使用的是nfs。你需要提前安装好nfs服务器并且在客户端完成挂载。参考博文:nfs服务器搭建对每个有状态服务,手动部署pv和pvc是麻烦的,所以我们可以用StorageClass来自动的为我们生成pv和pvc。apiVersion: v1kind: ServiceAccount

2021-04-22 16:28:35 1888 2

原创 stream流式计算的妙用

有了stream流式计算,结合着函数式接口和链式调用,对于数据的处理变得更加简单,同时增强可读性。比如我们有一个User类:@Data@AllArgsConstructor@NoArgsConstructorpublic class User { private int id; private String name; private int age;}然后有一些User对象: User user1 = new User(1,"a",12);

2020-07-11 18:24:43 461

原创 netty对于websocket的支持

netty & websocketwebsocket协议netty serverwebsocket协议要实现网页版的聊天室,用http协议是不行的,因为http协议是个短链接,发过去之后拿到响应就死掉了。http1.1出现了keepAlive。这里可以实现长连接。所谓长连接,就是可以重用之前建立的tcp连接。但是,keepAlive是一个假的长连接。server可以随时断掉,server和client是不对等的状态。另外,它的实现是client要不断向server询问是否有新数据,每次询

2020-07-10 22:55:39 413

原创 nio零拷贝解析

nio zero copy传统网络数据拷贝nio网络数据传递传统网络数据拷贝传统的server和client之间的数据传输就是用一个while循环不断的读取和发送。server:public class OldServer { public static void main(String[] args) throws Exception { ServerSocket serverSocket = new ServerSocket(8899); while (

2020-07-09 20:29:08 231

原创 redis分布式锁的层层推导

redisson项目依赖和配置场景与问题使用setnx做锁业务出现异常宕机抽取方法可重入锁自旋续命项目依赖和配置pom.xml<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.3.0.RELEASE</version&gt

2020-07-09 16:14:39 142

原创 Unsafe的使用(基于例子)

Unsafeintroget unsafenew instanceprivate fieldexceptionoff heap memoryintroUnsafe是不开源的,但是它无所不能。它能申请堆外内存、cas、park和unpark、修改private变量等等的。get unsafepublic class UnsafeUtil { public static Unsafe getUnsafe() throws Exception{ Field field = Unsa

2020-06-30 22:13:57 498

原创 mysql乐观锁实例

mysql乐观锁介绍例子介绍mysql乐观锁是mvcc的一种实现。mvcc就是multiple version concurrent control。所谓乐观锁,就是假设数据不会冲突。所以你可以尽情地update,submit。如果发现有并发问题了,mysql可以将失败结果返回给用户。悲观锁就是一开始就要加锁,心情很悲观。我们知道innodb有行锁,两个用户同时update一条数据的时候,稍慢的用户会阻塞等待,直到抢到锁的事务commit之后,他才能修改。这里的等待是很耗性能的。利用一个版本

2020-06-30 20:38:44 715 2

spring-framework-5.1.x.zip

spring5编译后的源码,供大家进行源码学习。基于gradle编译。编译前的源码在github下载。我使用的是gradle4.0.1,groovy2.4.11,jdk1.8.0_131,idea2018.2.2。

2020-05-02

digits.zip

python数字识别数据,训练集1934个txt文件,测试集946个txt文件,都是经过黑白化后得到的二进制数据,每个txt文件代表一个数字,作用是检验KNN算法的。

2019-09-27

空空如也

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

TA关注的人

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