- 博客(38)
- 资源 (3)
- 收藏
- 关注
原创 Hadoop高可用特性解析
HDFS采用的是fsimage + edits的存储方式,fsimage是某个时间的内存文件系统镜像,edits是修改操作,每个修改操作称为一个事务,有一个整形的事务id指定。checkpoint的时候就存储一次fsimage,同时可以删除之前的edits。另外edits切割为很多segement,不同的segment都包含一段修改操作记录,正在写入的segment的文件名有inprogress和
2016-11-20 21:12:57 1320
原创 Java进程与父子进程的标准输出流关联导致线程卡死的故障
故障现象 Java调度系统创建PHP数据脚本后,并且获取其标准输出流,然后循环读取其标准输出流内容。此时PHP数据脚本执行时间过长,Java调度系统Process.destory()杀掉进程后,ps也无法找到对应PHP数据脚本,但Java的线程却无法退出,依然卡死在读取标准输出流。曾经怀疑是kill无法清理干净进程,于是变为强制执行kill -9杀掉超时的PHP数据脚本,但情况依旧,Ja
2016-10-15 23:32:01 1766
原创 数据库的一些论文的个人整理
数据库架构相关Architecture of a Database System. Joseph M. Hellerstein, Michael Stonebraker and James Hamilton 图灵奖获得者Michael Stonebraker的论文之一,具体介绍了数据库的架构以及相关理论和主流数据库的具体做法。启发: 对于已经阅读过基础的数据库教材的
2016-07-12 21:55:13 4975
原创 LRU-K,2Q,LIRS算法介绍与比较
研究H2的过程中发现新的存储引擎MVStore使用了新的cache替换算法——LIRS,经过一系列相关的论文研读,发现比旧存储引擎PageStore的LRU算法改良不少。为了更好地了解LIRS的优异性,把同样属于LRU变种的基于倒数第二次访问时间对比进行cache替换的LRU-K(K一般为2)[1],2Q[2],LIRS[3]算法进行对比。概述 为方便讨论,统一称呼要进行
2016-03-18 09:39:33 8757
原创 HBase的split分析
HBase在新建一个表的时候,默认会把所有数据都会放在一个HRegion上,主节点HMaster根据一定的策略把HRegion分配到不同的HRegionServer从节点上,客户端在进行读写操作的时候,就会访问对应HRegionServer的HRegion。当HRegion的数据量超过阀值的时候,为了防止单个热点访问带来的压力,HBase就会对HRegion进行split操作,一个父HRegion
2015-07-31 17:50:17 1888
原创 HBase的compact分析
HBase是基于LSM树存储模型的分布式NoSQL数据库。LSM树对比普遍的B+树来说,能够获得较高随机写性能的同时,也能保持可靠的随机读性能(可参考这里)。在进行读请求的时候,LSM树要把多个子树(类似B+树结构)进行归并查询,对于HBase来说,这些子树就是HFile(还包括内存上的树结构MemStore)。因此归并查询的子树数越少,查询的性能就越高。Compact的作用
2015-07-29 19:13:28 1819
原创 HBase写请求分析
HBase作为分布式NoSQL数据库系统,不单支持宽列表,并且对于随机读写来说也具有较高的性能。在高性能的随机读写事务的同时,HBase也能保持事务的一致性。目前HBase只支持行级别的事务一致性。本文主要探讨一下HBase的写请求流程,主要基于0.98.8版本的实现。客户端写请求 HBase提供的Java client API是以HTable为主要接口,对应其中的HBase表
2015-07-11 14:21:16 2821 1
原创 HBase读请求分析
HBase为了提供实时查询,以及较高性能的写请求事务吞吐量,对读/写请求都做了大量的优化。经过阅读源码和远程调试,大致了解了读请求的流程。本文主要是基于HBase的0.98.8版本的实现。客户端读请求 HBase为客户端提供了的读请求API主要有两个,get和scan。其中,get是通过指定单个的rowKey,获取其对应的value值。而scan是指定startRow和sto
2015-07-11 14:11:10 2896
原创 Hadoop的一个变长long编码剖析
Hadoop对于long、int (化成long进行编码)的编码设计了自己的一套编码方式,这是一个zero-compressed encoded的变长编码方式,有利于大大压缩冗余数据。具体算法其实很简单,具体来说有如下几点:1、对于-112 2、如果i大于0,则编码的第一个字节 b 范围在-113和-120之间,则 i 会有 (-112 - b)个字节,所以可以表示有1-8个字节;3、
2015-06-14 23:38:11 1083
原创 Java泛型的一些限制
和C++泛型对比,Java泛型只是一种编译期间的擦拭机制。这是由于考虑到和以前的兼容而考虑的一种折中方案。在编译好的泛型代码里,编译期间已经把所有的泛型信息给擦拭掉,因此无法获得任何有关泛型参数类型的信息。因此List和List实际上是同一类型。 参考以下代码: //以下3个例子都无法通过编译 public void testGeneric(Object arg) {
2015-06-07 10:53:36 1400
原创 log4j之个人浅析
最近稍微大致地阅读了log4j的源码,毕竟这是Java开源日志框架里几乎最常用的一个实现。在大多数实际应用中,还需要诸如common-logging、slf4j等Facade模式日志框架对log4j进行封装,实际日志记录、输出等级、格式化等工作都是由log4j完成。本文把注意力集中在log4j身上,探讨一下这个开源日志框架的内部。特性 关于log4j的具体配置以及例子这里就不多说了,
2015-05-10 20:49:23 935
原创 Zookeeper介绍
Zookeeper是一个分布式的开源系统,目的是为分布式应用提供协调一致性服务。分布式应用能够在Zookeeper提供的简单原语集之上构造更高层次的服务,例如统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等。Zookeeper使用了类似文件系统的目录树结构的数据模型,帮助简化程序编写。 目前,一些知名的大数据开源框架就是利用了Zookeeper来完善分布式的协调一致
2015-03-15 21:57:05 1071
原创 Hadoop 1.2.1升级2.6.0的一次崎岖之旅(包括Hive、HBase对应的升级)
为了更好地紧跟大数据发展先进性的技术趋势,追赶业界最顶尖的发展技术,我们把线上环境的Hadoop 1.2.1升级到2.6.0版本。这次的升级其实早有预谋,但鉴于升级过程较为繁琐,并且不但涉及HDFS的底层存储的升级,还涉及Hive、Hbase等上层系统的使用,有一定的风险,因此一直都在等待一个合适的时机。直到最近,我们的利用了Hadoop2.6.0和HBase的0.98.8的API的ETL系统正式
2015-03-07 17:44:11 2060
原创 HDFS新特性Centralized Cache Management介绍
概述 HDFS作为Hadoop底层存储架构实现,提供了高可容错性,以及较高的吞吐量等特性。在Hadoop 2.3版本里,HDFS提供了一个新特性——Centralized Cache Management。该特性能够让用户显式地把某些HDFS文件强制映射到内存中,防止被操作系统换出内存页,提高内存利用效率,有效加快文件访问速度。对于Hive来说,如果对某些SQL查询里需要经常读取
2015-03-07 17:39:29 1815 1
原创 Hadoop集群中JobTracker和TaskTracker启动耗时过多的原因分析
在正式环境中,我们遇到一个这样的问题:配置更改后,需要重启JobTracker和TaskTracker节点的进程。在重启过程中,JobTracker和TaskTracker进程都很快启动完成,但是查看JobTracker的50030端口的Web管理页面时,发现JobTracker一直无法探知任何一个TaskTracker节点,大概经过10分钟后,才陆陆续续地探知完所有的TaskTracker节点。
2015-03-07 17:35:05 1737
原创 Hadoop的默认调度器JobQueueTaskScheduler的一个Map Task Pending问题
在正式环境的Hadoop任务调度里,集群整体资源还有大量slot的情况下,出现了某些MapReduce任务无法被调度,一直处于pending状态,无法获得集群slot资源进行计算的诡异情况。更改几个指定类的loglevel后,查看其Debug的log发现了问题原因:这是由于Hadoop 1.x默认的FIFO调度器JobQueueTaskScheduler在进行集群均衡计算时,忽略Speculati
2015-03-07 17:29:57 2184
原创 Hadoop2.0新特性
一、大数据处理系统 大量节点服务器组成集群,用户根据需要输入不同处理请求,经过复杂计算过程,输出对应结果,整个计算过程对用户来说透明。 对于这个大量节点组成的数据处理系统,需要考虑的问题有很多,比如数据存储、数据处理、资源管理、容错性、扩展性、较好的吞吐量......等问题。在目前来说,Hadoop框架可以有效解决以上大部分问题,而且由于Hadoop对于集群上的节点硬件要求不
2015-03-07 17:07:57 2133
原创 Hadoop的mapreduce.framework.name属性原理
配置Tez引擎时,只要我们把Tez的jars和配置文件路径添加进HADOOP_CLASSPATH里,然后通过设置mapred-site.xml文件的mapreduce.framework.name属性为yarn-tez,就可以替换默认的MR框架为tez引擎。 其中的奥妙在于使用了JDK6+的一个特性ServiceLoader类。其为JDK实现了一个依赖注入的机制。 Servic
2015-01-21 13:10:15 4643
原创 智能指针的研究
由于C++中堆内存是由程序员自己管理,要把对象分配在堆中,必须手动调用new,并且必须记住调用delete释放之前分配的内存。大量的new和delete必定会造成代码十分混乱,并且很容易出现悬空指针和内存泄漏等问题,smart pointer智能指针就是帮助程序员更好地处理这些问题。 研究了3个智能指针实现的框架(boost,android,还有一个是内部库),每个框架的实现大体思路都一
2014-09-08 17:03:45 946
转载 关于boost的shared_ptr以及weak_ptr的研究
shared_ptr当引用计数为0,delete p;weak_ptr可以防止循环引用导致内存泄漏,与shared_ptr不同的引用计数;lock时增加引用计数,返回对应shared_ptrclass sp_counted_base//负责不同平台的INTERLOCKED_INCREMENT/INTERLOCKED_DECREMENT:use_count_( 1 ),
2014-08-24 23:44:06 1097
原创 Phaser实现源码剖析
在这里首先说明一下,由于Phaser在4.3代码里是存在,但并没有被开放出来供使用,但已经被本人大致研究了,因此也一并进行剖析。 Phaser是一个可以重复利用的同步栅栏,功能上与CyclicBarrier和CountDownLatch相似,不过提供更加灵活的用法。也就是说,Phaser的同步模型与它们差不多。一般运用的场景是一组线程希望同时到达某个执行点后(先到达的会被阻塞),执行一个
2014-07-19 17:55:41 1673
原创 Semaphore实现源码剖析
Semaphore是一个计数的信号量。从概念上来说,信号量维持一组许可(permits)。acquire方法在必须的时候都会阻塞直到有一个许可可用,然后就会拿走这个许可。release方法添加一个许可,会有可能释放一个阻塞中的获取者(acquirer)。然而,Semaphore没有使用真实的许可对象,只是保持一个可用计数并且采取相应的行为。信号量一般用于限制可以访问一些(物理上或者逻辑上)的资
2014-07-16 11:59:34 1045
原创 Exchanger源码剖析
Exchanger是一个针对线程可以结对交换元素的同步器。每条线程把某个对象作为参数调用exchange方法,与伙伴线程进行匹配,然后再函数返回的时接收伙伴的对象。另外,Exchanger内部实现采用的是无锁算法,能够大大提高多线程竞争下的吞吐量以及性能。算法实现 基本方法是维持一个“槽”(slot),这个槽是保持交换对象的结点的引用,同时也是一个等待填满的“洞”(hole)。如
2014-07-15 20:06:01 1430
原创 CountDownLatch & CyclicBarrier源码实现解析
CountDownLatch CountDownLatch允许一条或者多条线程等待直至其它线程完成以系列的操作的辅助同步器。 用一个指定的count值对CountDownLatch进行初始化。await方法会阻塞,直至因为调用countDown方法把当前的count降为0,在这以后,所有的等待线程会被释放,并且在这以后的await调用将会立即返回。这是一个一次性行为——co
2014-07-10 16:44:35 1230
原创 ReentrantReadWriteLock实现源码剖析
ReentrantReadWriteLock提供了一个读写锁的实现,并且有着ReentrantLock相似的语义。简介非公平策略 此模式下,读写锁获取的顺序是不确定的,服从于可重入的限制。不公平锁意味着持续的竞争可能会无限延迟一个或者更多的读线程或者写线程,但比公平锁有更高的吞吐量。公平策略 此模式下,线程竞争锁获取会使用一个大致精确的FIFO的策略。当前锁被释
2014-07-05 17:27:06 1286
原创 ReentrantLock实现源码剖析
作为一个可重入的独占锁,ReentrantLock与隐式监控锁synchronized有着相同的行为和语义,不过ReentrantLock有着更高的扩展性。简介 ReentrantLock由上一次成功获取锁,但还没有释放锁的线程所拥有。如果锁没有被任何线程所拥有,那么此时有线程调用lock方法则会成功获取锁并返回。另外,如果当前获取锁的线程再次调用lock方法,该方法会马上返
2014-07-03 17:59:18 954
原创 AbstractQueuedSynchronizer实现源码解析(三)
前两部分,已经剖析了独占模式和共享模式下的获取锁以及释放锁的过程,接下来就是AQS最后的一个实现部分,Condition的实现。 AQS框架在内部提供两一个ConditionObject类,给其它独占锁提供Condition支持。一个锁对象可以关联任意数目的条件对象,条件对象提供了await、signal和signalAll操作,还包括一些带有超时,interrupt的方法。Condit
2014-07-02 21:30:43 1094
原创 AbstractQueuedSynchronizer实现源码解析(二)
在前面分析了独占模式获取锁和释放锁的流程,接下来将进行共享模式的获取锁和释放锁的分析。 这里说明一下,不同线程能够获取共享模式的锁,但此时如果有线程尝试获取独占模式的锁则会失败,同理,当单一线程获取来独占模式的锁之后,此时不允许任何线程获取共享模式的锁。 关于共享模式获取锁的实现,AQS内部的做法也是把一个标记位共享模式的结点添加到独占模式同一个等待队列中,然后释放的时候同样是
2014-07-01 16:20:46 870
原创 AbstractQueuedSynchronizer实现源码解析(一)
由于Android版的AbstractQueuedSynchronizer实现与JDK版本稍有不同,这里主要针对Android版实现进行解析。简介 AbstractQueuedSynchronizer(AQS)是实现依赖于FIFO等待队列的阻塞锁定或者相关同步器(ReentrantLock, Semaphore等)的一个框架,在java.util.concurre
2014-06-30 16:05:27 1097
原创 java并发包源码剖析 - 序章
对比PC开发,由于移动平台的硬件性能有限,有关磁盘IO、网络连接以及数据库操作等操作都是更为耗时,以及用户对于手机相应速度要求更高等原因,因此耗时操作绝大部分都在多线程上运行。多线程并发在移动应用开发上有着极其重要的地位。 为了更好地理解并发,因此决定对java的整个并发包进行源码程度剖析。这里说明一下,由于Android版的java sdk虽然保证接口与java SE的JDK兼
2014-06-30 15:49:04 1196
原创 一个基于AbstractQueuedSynchronizer类的Java的Mutex类的实现
之前由于需要查看了ThreadPoolExecutor的实现,然后发现了内部的封装工作线程的Worker类继承自AbstractQueuedSynchronizer类,查了一下,发现这个类封装了典型的并发锁操作,是java并发库java.util.concurrent的基础(作者就是鼎鼎大名的Doug Lea大神),花了大约一天的时间看了AbstractQueuedSynchronizer的原
2014-04-25 17:41:51 1009
转载 也谈向Richedit插入动态Gif的实现(转载)
<br /><br />http://www.deadc0de.com/archives/insert-gif-to-richedit.html#more-14<br /> <br />最近在做IM软件,需要实现向Richedit插入表情,表情是动态的GIF图像。<br />由于以前没有做过关于richedit的开发,百度了下,需要使用OLE技术。也就是说,插入的图片都是一个OLE对象。而RICHEDIT则是一个OLE容器,相关链接如下。<br />How to insert a bitmap into a
2010-10-15 19:22:00 2353 1
高级Bash脚本编程指南
2010-06-03
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人