- 博客(66)
- 资源 (3)
- 收藏
- 关注
原创 动态编译,自定义类加载器加载成功Demo
/1. 获取 `JavaCompiler` 实例 JavaCompiler compiler = ToolProvider . getSystemJavaCompiler();//信息收集器 DiagnosticCollector < JavaFileObject > collector = new DiagnosticCollector < >();
2023-07-13 11:52:16
256
原创 RDD调用机制、数据流在RDD中的流通
第一个调用iterator的地方现在知道compute方法的入口方法时iterator方法,即整个调用链是从iterator方法开始的,既然rdd的处理调用是一个向上迭代的过程,那么第一个调用iterator的地方在哪里呢?RDD算子最终会被转化为shuffle map task和result task,并发送到executor执行。而这个地方就在ShuffleMapTask的runTask方法中:进入write方法会在传入的rdd基础上调用RDD的iterator方法。进入该方法:
2022-11-16 21:30:02
1068
原创 记录一次java到oracle时间类型的bug
因为Oracle中的Date类型对应的是java.sql下的Date,所以尝试方法1/2失败。同时由于我的字符串是精确到时分秒的,而java.sql.Date只能精确到天,所以尝试方法3转换失败。我的字符串类型:“yyyy-MM-dd HH:mm:ss”,如 “2021-12-12 12:21:21”即:java.sql.Timestamp.valueOf(“2021-12-12 12:21:21”)本来是想把java的字符串转换到oracle中的Date类型的,但是尝试了几种方式都是报错。
2022-09-11 11:48:54
605
原创 在Centos上远程连接Oracle数据库
在连接oracle数据库时,如果本机安装了oracle数据库,那么会自带安装有sqlplus,我们可以使用sqlplus直接连接即可,但是如果oracle安装在另外一台服务器上,而我们当前主机没有安装oracle,那么是需要工具去连接的。其中HOST、PORT、SERVICE_NAME必须填写,其他的都可以不填,SERVICE_NAME是实例名称,HOST是ORACLE所在服务器地址,PORT是数据库的端口号。(实际上不使用sqldeveloper这步可以不要)
2022-09-08 17:23:21
3500
原创 加入HBase组件后Hive报错问题:MethodNotFoundException
运行HBase组件后,Hive各种报错找不到方法。是jar包冲突导致的。由于在hadoop-env.sh中通过引入hbase下的所有jar包的方式引入的:这种方式配置会引入hbase的lib目录下所有jar包,此时hive会因为jar包冲突而崩溃(hive会加载hadoop的jar包,而hadoop又加载hbase里hadoop的jar包,造成了冲突)。删除hbase下的hadoop的jar包。或者不要用这种方式,通过软链接的方式引入hbase的jar包即可。hbase下的冲突jar包:...
2022-06-13 17:33:47
442
原创 MapReduce默认切片规则源码
在job提交过程中,在submitter.submitJobInternal的方法中,从以下代码进行切片并把切片数作为maps数量进入writeSpites方法,会调用writeNewSplits方法。在writeNewSplits方法中会调用input。input.getSplits方法进行切片并返回逻辑切片的列表,而createSplitFiles将会在临时工作目录创建切片元数据信息文件。而input则是通过反射创建一个InputFormat对象,默认是TextInputFormat。继续进
2022-05-11 21:45:59
237
原创 Spark中的两种shuffle过程原理
Spark两种Shuffle在spark1.1以前只有hashshuffle,1.1版本引入了sortshuffle,1.2版本以后默认方式改为sort方式,2.0版本以后移除了hashshuffle。HashShuffle执行原理:Map阶段的shuffle是为了下一个stage的task拉取数据作的。每个Map阶段task把要输出的数据按key进行hash根据hash得到的值,生成和下一个stage的task数量相同的磁盘文件并写入。在将数据写入磁盘之前,会先将数据写入内存缓冲中,
2022-04-24 11:12:35
1398
原创 mysql忘记密码、修改密码&&记录一次mysql启动错误
报错代码:Access denied for user 'root'@'localhost' (using password: YES)出现这个错误是由于密码错误导致。用网上的教程设置跳过密码验证的方式然后重设密码来实现,但是会有问题:1、首先设置跳过MySQL密码验证:vim /etc/my.cnf在[mysqld]下面加入:skip-grant-tables,保存退出。注意:在更改后需要重启mysql服务:systemctl restart mysqld2、登录mysql:直接输
2022-04-22 14:36:03
844
原创 查看broker节点信息
kafka查看broker节点信息可以进入zookeeper客户端中查看:运行zkCli.sh进入客户端。输入ls 可以看到相关的节点。 输入 ls /broker/ids 可以看到broker数
2021-12-15 16:04:09
3826
1
原创 zookeeper集群启动失败
尝试:1、 防火墙没有打开对应端口:2181/3888/2888等2、云服务器安全组没有配置相应的端口:2888、38883、zoo.cfg配置文件添加:quorumListenOnAllIPs=true4、查看server.n 和/data/mid文件里的是否一致5、把本机的server.n = ip:2888:3888中的ip改成0.0.0.0...
2021-12-14 21:15:06
3020
原创 Linux常用指令
source /etc/profile 使配置文件生效echo $ZOOKEEPER_HOME 输出配置的环境变量netstat -ano | grep 2181 查看2181端口的进程
2021-12-14 19:48:06
820
原创 启动zookeeper时发现没有成功
使用zkServer.sh start 启动后显示启动成果,但是通过zkServer.sh status发现服务器未启动。通过网上查找经验发现是8080端口被占用导致的,修改zookeeper的zoo.cfg配置文件修改端口即可:admin.serverPort=8081
2021-12-14 15:52:39
1087
原创 Thread通过run()方法和start()方法启动的差别
结论Thread.run方法会直接调用传入的Runnable对象的run方法,也就是说此时的Thread相当于一个静态代理,从而并没有通过创建一个线程的方式去执行run方法,方法的执行还是在原来的线程。通过Thread.start()方法去执行时,会调用本地方法start0()去创建一个线程,此时采用动态代理的方式去调用传入的Runnable的run方法,即通过创建一个线程的方式去执行任务。源码Thread的run方法: /** * If this thread was cons
2021-11-24 11:38:26
230
转载 AQS的实现分析
一、概述谈到并发,不得不谈ReentrantLock;而谈到ReentrantLock,不得不谈AbstractQueuedSynchronizer(AQS)!类如其名,抽象的队列式的同步器,AQS定义了一套多线程访问共享资源的同步器框架,许多同步类实现都依赖于它,如常用的ReentrantLock/Semaphore/CountDownLatch…。二、框架它维护了一个volatile int state(代表共享资源)和一个FIFO线程等待队列(多线程争用资源被阻塞时会进入此队列)。这里vol
2021-11-23 18:12:02
169
转载 SynchronousQueue
今天看了无锁且没有容量没有队列的这个变态的锁:SynchronousQueue。他的特性就是没有容器,也没有锁:存数据线程在到达队列时,若发现没有取数据的线程,就在那里一直等待,一直等待有取数据的线程过来唤醒,取走数据,才会释放。反之亦然。整个实现都是通过CAS实现。他的源码真的是非常的不好阅读,主要本人涉及到栈、链表的结构的操作不是很熟悉,对照着其他大牛的分析,一步步走Debug来研读,大致摸清了思路。下面来分析一下源码SynchronousQueue的创建先来看下构造器// 默认创建非公
2021-11-22 20:08:40
160
原创 System.currentTimeMillis()和System.nanoTime()区别
查看该函数的API,可以知道这个时间的单位是毫秒(相当于当时的时间戳,可以转换成对应的日期的)。而有些程序的执行时间很短,用这个函数计算时间的误差会很大。如就上面这段程序而言,循环次数为100000(10万)时,用时1毫秒,为10000(1万)时,用时0毫秒,更小的肯定也是0。对这类程序而言,这个精确度还远远不够!API说明:long java.lang.System.currentTimeMillis()Returns the current time in milliseconds. Note
2021-11-18 16:06:04
192
转载 JVM的堆和非堆即调整
堆(Heap)和非堆(Non-heap)内存按照官方的说法:“Java虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配。堆是在Java虚拟机启动时创建的。”“在JVM中堆之外的内存称为非堆内存(Non-heapmemory)”。可以看出JVM主要管理两种类型的内存:堆和非堆。简单来说堆就是Java代码可及的内存,是留给开发人员使用的;非堆就是JVM留给自己用的,所以方法区、JVM内部处理或优化所需的内存(如JIT编译后的代码缓存)、每个类结构(如运行时常数池、字段和方法数据)以及方
2021-11-12 14:59:36
279
转载 Server-Sent Events 教程
服务器向浏览器推送信息,除了 WebSocket,还有一种方法:Server-Sent Events(以下简称 SSE)。本文介绍它的用法。一、SSE 的本质严格地说,HTTP 协议无法做到服务器主动推送信息。但是,有一种变通方法,就是服务器向客户端声明,接下来要发送的是流信息(streaming)。也就是说,发送的不是一次性的数据包,而是一个数据流,会连续不断地发送过来。这时,客户端不会关闭连接,会一直等着服务器发过来的新的数据流,视频播放就是这样的例子。本质上,这种通信就是以流信息的方式,完成一
2021-11-11 15:01:55
632
转载 CORS解决跨域问题
跨域问题什么是跨域跨域是指跨域名的访问,以下情况都属于跨域:跨域原因说明示例域名不同www.jd.com 与 www.taobao.com域名相同,端口不同www.jd.com:8080 与 www.jd.com:8081二级域名不同item.jd.com 与 miaosha.jd.com如果域名和端口都相同,但是请求路径不同,不属于跨域,如:www.jd.com/itemwww.jd.com/goods为什么有跨域问题?跨域不一定会有跨域问题。
2021-11-11 14:17:44
4434
转载 @RequiredArgsConstructor(onConstructor = @__(@Autowired)) Intellij IDEA如何去掉@Autowired 注入警告的方法
在Service层注入Mybatis的Mapper我们通常会使用@Autowired 自动注入@Autowiredprivate ProductMapper productMapper;但是这样Intellij IDEA会显示红色告警,提示不能自动注入。当我们在Controller层注入Service时我们也经常直接在Filed上使用@Autowired 注解,这时候不显示红色警告,但是也显示Field injection is not recommended 的建议原因第一种情况是因为
2021-11-10 14:42:13
914
转载 HTTP响应头处理。网页嵌套问题、http缓存设置
HTTP响应头处理HTTP响应头中的许多属性都可以用来提高Web安全。我们来看一下Spring Security中提供显示支持的一些HTTP响应头Spring Security默认情况下 显式支持的HTTP相应头主要有以下几种:Cache-Control: no-cache, no-store, max-age=0, must-revalidatePragma: no-cacheExpires: 0X-Content-Type-Options: nosniffStrict-Transport-
2021-11-10 14:27:55
1121
转载 JWT中Token的生成
1、什么是Cookie?cookie指的就是浏览器里面能永久存储数据的一种数据存储功能。cookie由服务器生成,发送给浏览器,浏览器把cookie以kv形式保存到某个目录下的文本文件内,下一次请求同一网站时会把该cookie发送给服务器。由于cookie是存在客户端上的,所以浏览器加入了一些限制确保cookie不会被恶意使用,同时不会占据太多磁盘空间,所以每个域的cookie数量是有限的。Cookie有什么功能特点呢?在同一个页面中设置 Cookie,实际上是按从后往前的顺序进行的。如果要先删除一个
2021-11-10 13:56:18
805
转载 cookie、session、token区别与联系
sessionsession的中文翻译是“会话”,当用户打开某个web应用时,便与web服务器产生一次session。服务器使用session把用户的信息临时保存在了服务器上,用户离开网站后session会被销毁。这种用户信息存储方式相对cookie来说更安全,可是session有一个缺陷:如果web服务器做了负载均衡,那么下一个操作请求到了另一台服务器的时候session会丢失。cookiecookie是保存在本地终端的数据。cookie由服务器生成,发送给浏览器,浏览器把cookie以kv形式保存
2021-11-10 10:04:43
736
原创 HashMap、HashSet源码分析
HashSet源码分析1、基本结论1.1、底层实现1.2、基本机制2、源码分析2.1、插入元素2.2 resize()源码分析1、基本结论1.1、底层实现HashSet是由HashMap实现的,而HashMap是一个个键值对的集合,因此HashSet中的值作为HashMap的key,而自动new一个Object对象最为HashMap的value,这个Object的引用是静态常量的引用类型,所以整个内存仅存在一个Object,意味着所有的Set对应于HashMap中的value都是这个Object。因此
2021-11-08 21:58:13
436
转载 基于session的认证和基于Token认证的区别
一、session的状态保持及弊端二、token认证机制一、session的状态保持及弊端当用户第一次通过浏览器使用用户名和密码访问服务器时,服务器会验证用户数据,验证成功后在服务器端写入session数据,向客户端浏览器返回sessionid,浏览器将sessionid保存在cookie中,当用户再次访问服务器时,会携带sessionid,服务器会拿着sessionid从服务器获取session数据,然后进行用户信息查询,查询到,就会将查询到的用户信息返回,从而实现状态保持。弊端:1、服务器压
2021-10-26 14:05:56
537
原创 Math类的取整方法
Math类中提供了三个与取整有关的方法:ceil,floor,round,这些方法的作用于它们的英文名称的含义相对应,例如:ceil的英文意义是天花板,该方法就表示向上取整,Math.ceil(11.3)的结果为12,Math.ceil(-11.6)的结果为-11;floor的英文是地板,该方法就表示向下取整,Math.floor(11.6)的结果是11,Math.floor(-11.4)的结果-12;最难掌握的是round方法,他表示“四舍五入”,算法为Math.floor(x+0.5),即将原来
2021-10-12 15:55:55
751
原创 ArrayList 扩容源码分析
ArrayList1、ArratList无参构造器形式初始容量是0,加入第一个数据时容量设置为10,随后每次到达容量都会按当前容量的1.5倍扩容。2、arraylist指定容量的构造方式创建则初始容量是指定的容量,而后面每次到达容量上限都会按1.5倍扩容。源码:在ArrayList中,使用一个Object类型的数组实现对元素进行保存。首先编写测试代码: List<Integer> list = new ArrayList<>(); for (int i
2021-09-30 20:50:38
177
原创 关于String在内存的表示和intern方法
内存String 字符串的存储位置在JAVA7之后存储在堆空间中的字符串常量池中。而此前是存储在永久区之中。(java8之后jvm中的方法区的实现时元空间,而此前是永久区)不同创建方式在内存的位置String str = "this is str"; 这种方式通过字面量的方式创建一个字符串,此时会直接在堆的常量池中创建此字符串(如果之前已经创建过了,由于字符串的不变性,会使用之前的那个)。String str2 = new String(“this is str”); 这种方式会在堆空间中创建一个
2021-09-29 16:44:52
176
原创 代理模式,静态代理与动态代理区别、各自实现,以及动态代理的源码分析
一、什么是代理代理就是我们指定一个工具类,这个类作为服务申明(一个接口)和服务具体实现(继承这个接口并实现方法)的第三者,它也实现这个服务接口,同时需要把这个服务具体实现放入其中,但是实现该服务的方法时,通过调用这个服务具体实现的方法,同时在该方法前后提供额外的增强服务来提高服务的力度,从而实现方法的增强。二、静态代理概念:所谓静态代理就是上述的代理的实现由我们自己手动实现,在新增服务的时候需要在这个代理中心手动增加代理服务的实现者并在后面实例化代理调用它,下面是一个例子:需求:现在需要两个服务
2021-09-23 13:27:10
286
原创 Lambda表达式的相关知识(概念、简化和用法)
概念lambda表达式是java8的新特性之一,本质上来说是一个匿名函数,可以简化接口的实现从而简化代码。使用限定:只有函数式接口才能使用lambda表达式简化实现。函数式接口:接口中只有一个需要实现的方法的接口就是函数式接口(不包括default修饰的默认的方法,static修饰的静态方法,以及从object继承的toString等方法。)可以使用@FunctionalInterface注解检验是否是函数式接口在写lambda表达式的时候只用关注参数列表和方法体:(参数)->{方法体
2021-09-22 19:44:39
383
信息安全课程设计.zip
2020-03-05
安卓课程设计含有报告书.zip
2019-12-19
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人