- 博客(130)
- 资源 (2)
- 收藏
- 关注
原创 推荐系统的基础算法和企业级设计
推荐系统的基础算法和企业级设计推荐系统介绍推荐系统的技术选型和基础数据2.1 技术选取2.2 数据简介算法讨论基于统计学的推荐算法LFM算法实时推荐算法推荐系统介绍在互联网时代,为了能够给用户良好的体验并且增大用户的留存率,推荐系统应运而生。简单的推荐系统就是依据统计的推荐,也就是说,这与用户无关,每个人的界面看到的东西都是一样的。比如电商中Hot的商品,或者电影观看网站的Top N的电影。只要能够获得所有用户的够买或者评分数据,我们就能够做出统计推荐。另一部分的推荐则是个性化推荐,每个用户推到的东
2021-10-15 09:57:29 452
原创 appium操控微信小程序的坑
在微信上打开一个小程序,如果浏览器能够检测到,那就说就说明微信已经开启了debug模式。小程序是运行在谷歌浏览器里面的,是一个进程,这种也叫webview。你要获取里面的元素,得把上下文从微信迁到小程序。我打算使用appium操控微信小程序,只要能够获取到小程序的页面元素就算成功。C:\Users\resus\Desktop\a.txt 是日志的目录。他说微信已经启动了,我根本没启动啊。我这里的问题是:没有打开debug模式。把webview想成是PC的页面就行。微信没有打开,直接就定位通讯录。
2023-10-27 17:21:23 2155
原创 spark对接elasticsearch遇到的坑
问题:pushdown是官网强烈推荐的,不过我怎么知道他将spark sql转成了什么dsl语句呢?也就是说,我怎么知道谓词下推有没有成功?问题:我从host1中读取es的数据,要写入host2中,怎么做呢?问题:我不要es自动生成_id,我自己指定。问题:出现了和hadoop相关的问题。解决:读取和写入使用不同的配置。问题:解析none值有问题。...
2022-08-26 09:19:03 1896 3
原创 mysql中的锁
此次实验所使用的mysql版本为mysql8:因为我们可以在中看到锁的情况。引擎是innodb。事务隔离级别是RR。mysql中的锁可以按照锁的粒度分,表锁就是其中的一种(另一种是行锁)。虽然锁一整张表在实际操作中是不明智的,但我们还是探究一下。准备的表:我们有主键索引以及二级索引。然后插入一些数据:为了看到中锁的情况,我们需要设置:S锁首先看看表级别的读锁:读锁可以被多次获取(session1和session2同时获取到了读锁)。我们可以看到的数量增加了。然后我们查看锁的情况:可以看到一个锁(
2022-06-29 19:39:51 1279 1
原创 使用ProxyFactoryBean实现AOP
以前我在springAOP里写过aspectJ的代理生成逻辑,也看了spring编码方式的代理生成。我们可以来复习一下。我们整一个接口和实现类:再整一个拦截器,或者叫,就是说,切面怎么切的意思。他接受一个作为参数,在这里就是(一次方法调用)。然后是配置类:测试类:从这个demo中我们已经可以看到spring的aop全貌了:代理的接口,目标对象,如何代理,以及使用代理工厂去生成代理。我们还能够使用去生成代理,这时候就不再是原始的生成方式了,因为这时需要走spring的bean的生命周期。他首先是个,
2022-06-16 12:06:58 338
原创 从put操作看ConcurrentHashMap如何解决线程安全问题
hashmap(jdk1.8)是线程不安全的,其中一个体现是方法,我们看一下大概的逻辑:如果原来这里没有相同hash值的节点,那就new一个,其实就是说,这是一个新节点,没有hash冲突发生。假设线程A和线程B都执行操作,然后key的hash值一样,然后同时走到假设之前没有hash相同的节点存在,那么A和B线程就会都执行如此一来后执行的线程就会将先执行的覆盖掉,本来两个元素就变成了一个元素,而不会出现链表挂下去的情况。我的测试代码:为了让效果出来,我需要修改一下的源码:我让hash冲突的线程睡1秒
2022-06-02 11:07:38 766
原创 [WinError 193] %1 不是有效的 Win32 应用程序问题解决
[WinError 193] %1 不是有效的 Win32 应用程序问题解决
2022-05-31 22:25:40 5557
原创 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 539
原创 @Async注解引发的报错之解决
solution问题解决问题解决在上篇文章中,我们知道了TaskServiceImpl在注入RobotServiceImpl前后从raw version变成了代理。而且我们希望找到dependentBeanMap这个map维护的地方。在属性注入的代码里,我们看到了dependentBeanMap维护的地方。那么我们想:能不能不进这个方法?...
2022-05-15 19:28:05 1029
原创 @Async注解引发的报错之AsyncAnnotationBeanPostProcessor
回顾上篇文章,我们正在走robotServiceImpl的生命周期,走到属性注入的时候,发现容器中没有taskServiceImpl,于是去创建taskServiceImpl,那就要走taskServiceImpl的生命周期。taskServiceImpl实例化后也要属性注入robotServiceImpl,发现容器中也没有,那就再去创建robotServiceImpl,创建过程中发现robotServiceImpl在singletonsCurrentlyInCreation这样一个集合中,于是就从si
2022-05-05 17:50:41 599
原创 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 3041
原创 @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 1390
原创 @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 992 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 926
原创 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 759
原创 hbase rowkey设计案例
介绍hbase中的rowkey可以唯一定位一条数据。rowkey设计的合不合理,很大程度上可以解决数据倾斜的问题。和rowkey密切相关的是分区键,我们可以用命令行或者代码方式创建分区键:比如staff这个表就有4个分区键:aaaabbbbccccdddd由此切割成5个分区。rowkey带着一条数据来了之后就要和这些分区键去比较,决定自己进入哪一个分区。比较的规则是字典排序。我们想要的是,第一,一条数据来了之后,立马能够知道他进入哪个分区,而不用一位一位的比较。能够达成这个想法的做
2021-10-15 08:30:01 1276
原创 网络通信加密与应用
网络传输数据是不安全的,因为数据可以截取,篡改。因此,我们需要用加密算法对数据进行加密。加密和应用对称加密与非对称加密支付宝的应用https协议对称加密与非对称加密所谓的对称加密,就是加密与解密用的是同一把钥匙。这里的问题在于,只要这把钥匙泄露,那么整个通信过程就完全被监听了。此时,我们需要更多的钥匙,来确保信息的安全性。先看发送方—>接受方这条路径。发送方用一把钥匙加密,接收方用另一把钥匙解密。接收方—>发送方也是一样,一把钥匙加密,一把钥匙解密。至此,我们出现了四把钥匙
2021-10-15 08:29:35 367
原创 自定义分区并区内排序
简单的wordCount假设我们的文件中有这么一些数据:sparksparkhivehadoopsparksparkhivehadoopsparksparkhivehadoopsparksparkhivehadoopsparksparkhivehadoopsparksparkhivehadoopsparksparkhivehadoopsparksparkhivehadoopsparksparkhivehadoopsparkspar
2021-10-15 08:28:24 378
原创 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 677
原创 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 353
原创 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 537
原创 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 2593
原创 Spark源码之通信环境
Spark通信通信组件RpcEndpoint,RpcEnv,RpcEndpointRef,RpcAddressTransportServer,TransportClient,Outbox,Inbox,DispatcherDriver端Executor端通信组件为了了解spark的通信环境,我们需要了解它的主要组件。RpcEndpoint,RpcEnv,RpcEndpointRef,RpcAddress首先是RpcEndpoint:一个通信终端有他自己的生命周期:constructor ->
2021-10-14 20:37:11 236
原创 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 239
原创 电商数仓简介
数仓是为决策用的,它的架构逻辑十分严密。数仓分区ods层dwd与dim层事务型事实表周期型事实表累计型快照事实表dws层dwt层ads层用户行为路径分析漏斗模型留存用户ods层数仓是分层的。ods层是直接从hdfs拿数据,不做任何修改,只是添加了时间分区。添加时间分区后,方便后续的查询和管理。那hdfs的原始数据从哪里来呢?如果是业务数据,那就是从mysql用sqoop导进来的,导入的时候就会使用压缩(比如LZO压缩)。mysql有什么表,hdfs就对应有什么表。如果是日志数据,那就从文件导入
2021-10-14 17:41:10 1279
原创 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 1518
原创 namenode的启动
我们简单看下namenode启动需要经历的步骤。namenode启动要做什么启动9870服务端口加载镜像文件和编辑日志文件初始化RPC服务启动资源检查检查心跳检查是否进入安全模式启动9870服务端口因为namenode是一个进程,所以找到它的main方法:进入createNameNode:找到new NodeNode(conf),进去。找到初始化方法,进入:他要获取绑定的地址,我们希望知道这个地址是什么。看看这个默认的地址:端口号是9870。这就是我们经常用的namenode的
2021-10-14 12:24:19 4249
原创 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 425
原创 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 147
原创 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 2835
原创 namenode的fsimage与edits文件
引入hadoop集群中,namenode管理了元数据。那么,元数据存储在哪里呢?如果是磁盘中,必然效率过低,如果是内存中,又会不安全。所以元数据存储在内存中,但是有一个备份文件fsimage在磁盘。这就防止了断电元数据丢失的问题。现在内存中的元数据增加之后,需要不断同步fsimage吗?这样又很没有效率。但你又必然要更新元数据,所以,可以将追加的操作写入一个文件edits。fsimage与edits一起加载到内存中,就会得到所有的元数据。合并元数据一旦变得庞大,加载到内存就会很慢。所以,还需要
2021-10-14 09:21:56 603
原创 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 196
原创 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 2081 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 521
原创 netty对于websocket的支持
netty & websocketwebsocket协议netty serverwebsocket协议要实现网页版的聊天室,用http协议是不行的,因为http协议是个短链接,发过去之后拿到响应就死掉了。http1.1出现了keepAlive。这里可以实现长连接。所谓长连接,就是可以重用之前建立的tcp连接。但是,keepAlive是一个假的长连接。server可以随时断掉,server和client是不对等的状态。另外,它的实现是client要不断向server询问是否有新数据,每次询
2020-07-10 22:55:39 471
原创 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 315
原创 redis分布式锁的层层推导
redisson项目依赖和配置场景与问题使用setnx做锁业务出现异常宕机抽取方法可重入锁自旋续命项目依赖和配置pom.xml<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.3.0.RELEASE</version>
2020-07-09 16:14:39 166
原创 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 600
原创 mysql乐观锁实例
mysql乐观锁介绍例子介绍mysql乐观锁是mvcc的一种实现。mvcc就是multiple version concurrent control。所谓乐观锁,就是假设数据不会冲突。所以你可以尽情地update,submit。如果发现有并发问题了,mysql可以将失败结果返回给用户。悲观锁就是一开始就要加锁,心情很悲观。我们知道innodb有行锁,两个用户同时update一条数据的时候,稍慢的用户会阻塞等待,直到抢到锁的事务commit之后,他才能修改。这里的等待是很耗性能的。利用一个版本
2020-06-30 20:38:44 857 2
spring-framework-5.1.x.zip
2020-05-02
digits.zip
2019-09-27
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人