- 博客(64)
- 资源 (9)
- 收藏
- 关注
原创 ClassNotFoundException、NoSuchMethodException?
背景/吐槽:公司的云平台架构部门提供了一个spark链接hbase的工具包,但是其中包含的依赖太多太多,对外提供的jar包一个包居然接近90M,然后引用进来之后问题就很容易一不小心就和本地自己依赖的jar包产生冲突,真的是坑嗷,由此也告诫自己以后自己如果对外提供服务jar包,一定要尽量去除不用的jar包,该设置scope为provided的设置provided,能shade的尽量学习flink官方...
2019-11-22 20:48:19
391
原创 数据库事务的四大特性&事务隔离级别介绍
事务概念:事务是指的满足ACID特性的一系列操作。四大特性(ACID)介绍如下:原子性(Atomicity): 事务被视为不可分割的最小单元,要么全部提交成功,要不都失败回滚到最初状态。一致性(Consistency):一般的一致性分为强一致性、弱一致性以及最终一致性,不同的一致性级别实现起来的难度不一样,最好的当然是强一致性。持久性(Durability):一旦事务提交,对事务所做过的...
2019-04-28 15:21:25
280
原创 Java四种线程池原理&应用分析
线程池种类线程池的实现分为四类:Executors.newCachedThreadPool()Executors.newFixedThreadPool(int size)Executors.newScheduledThreadPool(int size)Executors.newSingleThreadExecutor()ThreadPoolExecutor构造参数四个线程池类都是...
2019-04-24 23:34:19
320
原创 ZAB协议
为了保证写操作的一致性,zookeeper专门设计了原子广播协议(zab,zookeeper atomic broadcast),通过这种协议以及zookeeper的主从架构模式,来保证集群中各个副本之间的数据一致性。1. zab协议理论先来介绍一下单纯zab协议的理论,首先是zab协议中会给各个服务器定义不同的状态,分别为:Looking:表示当前集群没有Leader节点,进入领导选举过...
2019-04-19 15:49:40
429
原创 zookeeper基本概念
1. 什么是ZooKeeperZooKeeper是一种高可用的一致性协调框架,可以理解为一个轻量级的分布式内存文件系统,它内部使用ZAB协议作为一致性算法。它的内部提供了多层级的节点名空间(称为znode),客户端可以对znode进行监听,常见的应用场景主要为:分布式协调、分布式锁、元数据/配置信息管理、HA高可用等。2. 文件系统的四种znode在第一节中已经介绍ZooKeeper内部文件...
2019-04-19 15:39:28
256
原创 Spark Streaming window函数源码解析
概述 首先,对于window函数的作用可以参考官网介绍,不过官网只是对使用进行了简单的介绍,而对于内部如何实现我们今天想来进行一探究竟!因为只是个人也只是简单的用过,但是依据之前看Spark Streaming实现相关的源码,个人在看源码之前会思考其中应该会怎么实现,window函数的作用就是(窗口范围:windowDuration,滑动频率:slideDuration)每隔slideDura...
2019-04-12 17:04:30
927
原创 Redis内存优化の内存淘汰策略
公司服务由于实时计算跨度过大,前文说过需要用redis来进行状态管理,暂未发现一种数据修改但是不改变expire时间的做法,所以记录的数据全部未设置过期时间,计划通过脚本和一个大key来每天凌晨对redis前一天的状态数据进行清理,但是在24小时运行过程中,可能会出现数据量过大,导致内存消耗过大的问题,考虑到业务只需要记录top 100的记录,可以理解为top 100就是所谓的热点数据,而对于...
2019-04-09 12:42:12
2425
原创 ArrayList源码分析
本系列的所有源码主要是针对JDK 1.8的版本来探讨,部分容器源码在1.7和1.8又较大变动(例如HashMap)才会进行对比。 首先我们来看一下ArrayList的类图结构: 其中Cloneable、Serializable、RandomAccess分别是属于给该类添加某个属性的接口,而核心内容应该是List和AbstractList的类继承和接口实现。 接下来我们主要来围绕关...
2019-04-09 12:39:18
182
原创 ThreadLocal原理
参考:https://juejin.im/post/5a5efb1b518825732b19dca4 ThreadLocal用于提供线程级的全局变量,所谓线程级的全局变量意思就是这个变量只在当前线程内部是任意位置都可以获取到的,所以有部分同学就会用它来进行一些线程内的传参。 实际对于ThreadLocal而言,它的实现原理较为简单,就是每个线程在new Thread()创建的时候,内部都会...
2019-04-09 12:24:37
178
原创 Java内存模型和物理架构详解
1. 概述 我们常说的Java虚拟机具有很好的跨平台性,之所以强调所谓的跨平台性是因为不同的系统底层架构是会有区别的,而Java虚拟机的跨平台性就是它帮助我们把不同系统的底层区别给KO掉了,使得我们通过Java虚拟机编写的代码可以忽略不同平台底层的区别。而这其中关键的一点就是Java虚拟机的Java内存模型,内存模型其实就是JVM内部自己设计了一套规则,这套规则会规定不同线程之间信息同步的规则...
2019-04-09 12:23:09
643
原创 CountDownLatch和join的区别
蚂蚁一面被问到这个问题,当时实在是想不到两者在实现相同功能时的区别,回来百度了一下,发现其实还是蛮简单的问题哈。 首先,两者都能够实现阻塞线程等待完成后,再继续进行后续逻辑,对于两者相同的功能这里不再赘述,我们直接说说它们之间的区别,考虑一个场景,我们的主线程阻塞到某处,等待其它线程完成某些操作之后再继续后续操作,具体就是主线程M,等待子线程T1和T2完成某项操作,但是子线程T1和T2中的...
2019-04-09 12:21:11
771
原创 聊一聊Spark资源动态分配
1. 提出问题 相信很多面试也会问道类似的问题,那么这篇文章就是要围绕这个问题来进行展开进行分析Spark的资源动态分配。 通常我们在通过spark-submit提交Spark应用到yarn集群的时候,都会配置num-executors来指定分配多少个Executor,但是对于经验不足的新手而言,经常会不知道如何分配合适的资源数,所以经常会选择尽量多分配资源,认为资源分配的越多任务运行的就...
2019-04-08 11:12:54
1653
1
原创 Spark yarn-client和yarn-cluster的区别
之前面试遇到过一次这个问题,回答的很不好,这次专门记录下来,进行深入的解析两者区别。 首先,最简单也十分浅显的一种说法是:yarn-cluster是用于生产环境,这种模式下客户端client在提交了任务以后,任务就托管给yarn了,这个时候client就可以断开连接不需要再管后续事情了,这种情况下无法直接查看到application运行的日志,查看日志较为麻烦;而yarn-clien...
2019-04-08 11:09:16
2430
1
原创 Spark Core DAG生成源码分析
前提回顾 之前分析了Spark Streaming关于DAG的生成,对于Spark Streaming而言,先是通过自己代码中的各种transform方法来构造各个DStream之间的关联关系,然后再通过最后调用action操作的算子处进行回溯,action算子操作的DStream作为outputStream存储到DStreamGraph中的数组中,回溯过程中会找到数据来源处的DStream,...
2019-04-08 11:06:55
500
原创 SparkStreamingのCheckpoint源码分析
本文主要介绍SparkStreaming容错措施中的Checkpoint源码,为了保障应用的容错性,CheckPoint是十分重要的一环,本文来详细介绍SparkStreaming在进行CheckPoint的地方。 首先,我们从任务提交部分开始介绍,我们知道每个批次的任务是通过jobGenerator来生成的,我们围绕任务提交到结束的这个周期中来看哪些地方用到了CheckPoint,之前已...
2019-04-08 11:03:05
369
原创 Spark Streaming + Kafka + Redis状态管理 top100场景 Exactly Once
最近面试蚂蚁金服一面的时候,和面试官聊项目问题的时候,发现我这边业务实现的top100场景好像没有实现exactly once语义,我们项目的offset是存储在zk中,然后业务处理完毕后,最后再提交offset更新到zk,这种时候就会出现一个问题就是如果业务处理完毕,数据已经更新到redis中进行了累加,然后offset更新zk没成功宕机了,再次重启的时候就会读取老的offset导致数据重复...
2019-04-08 10:45:20
811
原创 AQS源码详解
一、AQS架构介绍前一批文章介绍了JUC中为了减少锁竞争而用的CAS和Unsafe类,那么针对JUC中的各种同步器,例如常用的ReentrantLock、CountDownLatch等,他们的实现都是继承自AbstractQueuedSynchronizer这个抽象类的,和CAS以及Unsafe一样,这个类是JUC中非常基础的一个类,为了在后续更好的理解各种依托它而实现的类的原理,我们很有必要先...
2019-03-07 17:34:21
382
原创 JDK-1.8 HashTable源码分析
文章分析源码依托版本为JDK1.8,先看看HashTable的类关系图,如下: 对于HashTable而言,我们先看它的容器存储结构,关于这一系列容器的源码首先理解了它们设计的存储结构后,相关方法的基本实现思路就能知道个大概了,这里关于HashTable而言,它的存储结构设计还是比较简单的,主要理解一下几个参数即可:private transient Entry<?,?&g...
2019-03-05 19:25:44
347
原创 JDK-1.8 HashMap源码分析
和之前的系列一样,我们先上HashMap的类继承关系图,如下: 一般说到HashMap,和它关联最大的应该就是ConcurrentHashMap、HashTable、TreeMap等。之前已经介绍了HashTable,这里通过继承关系图可以看到和HashTable不一样的是,HashMap是继承实现的AbstractMap,而HashTable则是继承实现自Dictionary类。 ...
2019-03-05 19:25:05
218
原创 Python判断文件是否存在
判断文件是否存在主要有两种方法:import osos.path.exists('xxx/xxx/filename') # True/False 以上方法中入参的路径可以是文件路径也可以是文件夹路径,所以可以用于判断文件以及文件夹是否存在。但是有一种特殊的情况是可能入参传的是一个文件夹路径,但是文件夹路径的上一层有个相同的文件,例如/usr/local/testfile这是一个文件...
2019-02-15 11:28:53
50121
原创 Spark Streaming全天候实时top N实现
1. 背景介绍 公司的日志平台是通过spark streaming消费kafka上的数据,解析完毕后直接存入到hdfs,然后到了每天凌晨通过pig脚本来对前一天的hdfs上的全量数据进行统计分析,得出前一天的日志的各项指标。全量的数据量一天通过lzo压缩后有大概4T,解压完估计得有40~50T。然后每天计算的指标有十个,有若干个指标是需要计算top n这种,而且pig脚本代码质量较差,有一些j...
2019-01-17 16:36:59
3405
1
原创 linux shell命令のcut、printf、awk、sed字符操作命令用法
1. cut列提取命令$ cut [options] filenameoptions: -f 列号:提取第几列 -d 分隔符:按照指定分隔符分割列,默认是制表符进行分割。例如,我们在系统中的/etc/passwd记录了所有的系统的用户信息,我们需要提取出所有的能够登录的用户的用户名,这里需要说明的是判断是否能够登录,只需要判断每行用户信息最后是否是/bin/bash即可。所...
2019-01-13 00:54:34
277
原创 修改centos的open files爬坑
集群环境有几台新增的机器,尝试修改open files的时候,按照平常的操作就是修改/etc/security/limits.conf和/etc/security/limits.d/90-nproc.conf使得重启后永久生效,然后执行ulimit -n 65536这种使得当前生效。这样大多数情况是OK的,但是这里要注意有坑,首先是否真正的生效,需要通过其他机器直接ssh username@i...
2018-12-27 19:25:03
7296
原创 监控某个网卡的流量
服务器配置一般会有多个网卡,但是一般多个网卡是主从配置形式的,我们在监控网卡流量时只需要监控master的网卡,通过ifconfig查看网卡配置:$ ifconfigbond0: flags=5187<UP,BROADCAST,RUNNING,MASTER,MULTICAST> mtu 1500eth0: flags=6211<UP,BROADCAST,RUNNING...
2018-12-19 19:00:06
2315
原创 hadoop on yarn集群动态新增节点
1.免密钥登录1.1 准备工作 新增的机器创建用户设置密码:useradd hadooppasswd hadoop 用户创建好以后,先找任意一台之前集群里的机器,把新增的机器的ip和hostname加入到/etc/hosts中,然后scp分发到集群中各个机器上,当然要包括新机器。然后继续回到新增的机器上,对hostname进行修改,先vim /etc/sysconfig/netw...
2018-12-19 17:09:29
1217
原创 YCSB进行mongodb性能测试
所用工具:YCSB(https://github.com/brianfrankcooper/YCSB) 墙裂建议用这个YCSB压测工具,个人使用发现十分简单高效,比之前用过的jmeter做接口压测还要简单,YCSB需要依赖maven和jdk,所以要先按照这两个,安装步骤直接贴官方文档:Install Java and MavenGo to http://www.oracle.com/t...
2018-12-03 18:48:22
1463
原创 mongodb分片+副本集集群搭建
搭建集群前,先熟悉集群中的几个概念:路由、分片、副本集、配置服务器。路由负责指挥外部来的请求到集群的哪台机器上去,指挥官的作用;分片属于数据库的物理层面的划分,将一个之前在一台机器上无法支撑的大的库或是集合进行划分,得到若干个分片,每个分片存储部分数据;副本集则是为了进行容错而产生的,因为集群环境下机器很容易出问题,对此需要对数据多在不同的机器上进行备份存储几份,从而如果其中一台出问题,其它的...
2018-11-29 19:17:06
1517
原创 Spark Streaming每个批次完毕后的清道夫工作分析
本文目标:搞明白每个批次作业运行完毕后,是如何进行清理工作的。 回到提交作业的地方,即JobGenerator的generateJobs这里,沿着这条线顺藤摸瓜找到清理任务的入口,可以看到任务生成成功后会提交任务运行,摸瓜路线:JobGenerator.generateJobs() --> jobScheduler.submitJobSet() --> JobHandler.r...
2018-11-22 18:27:07
984
原创 Spark Streaming之Block生成和存储源码解析
这篇文章我们要搞明白的问题有:Block数据是如何生成的Block是如何存储的 上一篇文章已经介绍了Receiver是如何启动的,以及在Executor和Driver运行的ReceiverSupervisor、Receiver、ReceiverTracker之间的劳作关系,但是关于Receiver接收到数据,然后和ReceiverSupervisor之间配合BlockManager...
2018-11-20 01:00:52
391
原创 Spark Streaming的Receiver的那些事儿!
这篇文章主要讲解Spark Streaming启动后,在StreamingContext中启动的ReceiverTracker以及这位大哥管理的Receiver的生成以及发布详细过程。我们先介绍Spark Streaming启动ReceiverTracker的过程,然后再提出一些问题,围绕这些问题对Receiver进行进一步的探索。 Spark Streaming启动时通过JobSched...
2018-11-18 20:14:32
666
原创 Spark Streaming批处理job生成流程解析
本篇文章继续上篇关于启动流程分析后进行,上篇中主要介绍了启动流程中主要涉及的JobScheduler和DStreamGraph在启动时的工作,已经知道启动起来之后,主要支撑运作的应该是JobScheduler-&gt;JobGenerator-&gt;Timer,通过定时器的形式每一个批次进行一次处理,那么每个批次开始定时器发布任务后,一直到当前批次处理完成,中间主要经历了哪些事前呢?对此,本...
2018-11-18 15:35:12
843
原创 Spark Streaming启动&DStreamGraph源码分析
在github上看到一个十分好的总结:https://github.com/lw-lin/CoolplaySpark, 对Spark Streaming整体的设计思想讲的算是个人见过十分好的了,看完之后有种原来如此,看完之后对整体的架构有了较为清晰的认识,不过由于篇幅问题,这个项目文档中是偏总结和思想的灌输,没有过于追究一些细节内容,本文以及后续将在此基础上进行源码的阅读,对细节进行更多的研究...
2018-11-15 19:20:21
328
原创 JVM之GC原理解析
1. GC ROOT 首先要说的还应该是垃圾回收首先要做的一件事情:判断一个对象是否已经GG需要被回收?垃圾回收时是依据这一步判断哪些对象是否需要回收来继续进行的,现在主流的JVM用的基本都是可达性分析算法,即所谓的GC ROOT。该算法的核心思想是通过某些初始化的对象节点(GC-ROOTS)开始,将任意两个有关联的对象之间建立建立连接,最终通过这些初始节点开始向下不断延伸,最终得到类似于一个...
2018-11-14 01:01:12
310
原创 Scala闭包
由于需要看Spark源码,发现其中用到了许多闭包的地方,所以很有必要搞明白闭包这玩意儿的用法。 网上对scala闭包最多的解释就是通过闭包,可以在超过局部变量作用域的地方仍然能够使用局部变量的值,这话反正我一开始读起来是似懂非懂的,看起来好像是类似于扩充了局部变量的使用范围,但是这又是如何实现的呢?带着疑问,看了一些资料后,发现还是直接用代码好解释一些。直接上测试代码:object C...
2018-11-13 11:06:57
178
原创 Spark Streaming任务调优实录记载
/bin/spark-submit --name jobname --driver-cores 2 --driver-memory 8g --num-executors 20 --executor-memory 18g --executor-cores 3 --conf spark.default.parallelism=120 --conf "spark.executor.extraJa...
2018-11-12 10:12:45
838
原创 Hadoop脚本启动之Start-all.sh脚本流程解析
自己的虚拟机环境中部署了一套自己测试用的hadoop环境,平时为了方便启动都是直接调用start-all.sh脚本直接启动,那么这个脚本中的执行流程是如何的,脚本是如何配置参数然后启动集群中各个服务进程的呢?之前只是知道用start-all.sh偷懒,有时间刚好看了一遍这个脚本的整体流程,以start-all.sh作为出发,了解整个脚本启动的流程对于理解集群配置还是有一定帮助的,起码可以了解bin...
2018-11-05 02:44:07
11267
原创 scrapy爬虫小练习-腾讯招聘信息爬取
创建scrapy项目,在cmd中找到需要创建项目的目录,运行scrapy startproject spidername即会自动创建好项目的目录结构,然后再在pycharm中打开即可。这里我们需要尝试爬取腾讯招聘网站上的信息:先依据以上创建爬虫:scrapy genspider tencent_hr tencent.com创建完成后的目录结构如图所示由于需要用到mongo存储爬取到的数...
2018-10-28 11:02:36
354
原创 session和selenium+PhantomJS模拟登陆v2ex
session方式登录def parse_url(self, url): response = requests.get(url=url, headers=self.headers) return response.contentstart = time.time()headers = { 'user-agent': 'Mozilla/5.0 (Windows...
2018-10-14 14:25:39
615
原创 lxml安装后无法import到etree模块
环境:python-3.7+lxml-4.2.5 一开始尝试了网上的办法发现都比较麻烦,因为去找老版本的lxml或者换python版本太麻烦了,后来在一篇博客的评论中找到了正确的办法,其实虽然网上说的是python 3.5之后的lxml中不再有etree,但是其实这种说法是有问题的,虽然新版本无法直接from lxml import etree这样,但是它只不过是换了一个办法引出etree...
2018-10-06 11:16:42
24000
26
原创 Xpath语法简介
Xpath是一款非常强大的XML/HTML解析框架,它能够将XML/HTML解析为类似于目录树的形式,叶子节点就是对应属性,而访问这些属性就和linux中的文件系统类似,以下列出部分语法,案例使用百度首页的部分html源码:<head class=""> <script async="" src="https://ss1.bdstatic.com/5eN1bjq8AAUY...
2018-10-06 10:04:37
183
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人