- 博客(95)
- 资源 (1)
- 问答 (6)
- 收藏
- 关注
原创 Disruptor使用入门
RingBuffer被组织成要给环形队列,但它与我们在常常使用的队列又不一样,这个队列大小固定,且每个元素槽都以一个整数进行编号,RingBuffer中只有一个游标维护着一个指向下一个可用位置的序号,生产者每次向RingBuffer中写入一个元素时都需要向RingBuffer申请一个可写入的序列号,如果此时RingBuffer中有可用节点,RingBuffer就向生产者返回这个可用节点的序号,如果没有,那么就等待。同样消费者消费的元素序号也必须是生产者已经写入了的元素序号。
2014-08-03 17:42:41
11613
原创 Java输出流的选择
程序运行过程中有多个节点对象,其中有三个节点的状态需要持久化,其余节点的状态不需要持久化,所有的节点在运行过程中的状态都会不断变化,程序运行过程中需要保证三个需要持久化节点的数据在大部分场景下崩溃后,下次重启可以读入上次程序崩溃前的状态,此外每个节点有个单独的ID。由于是单机程序,所以使用了一个Map来存储这些数据
2014-07-27 13:54:04
1796
原创 深入理解ByteBuffer
ByteBuffer类是在Java NIO中常常使用的一个缓冲区类,使用它可以进行高效的IO操作,但是,如果对常用方法的理解有错误,那么就会出现意想不到的bug。
2014-05-23 14:15:46
15020
原创 getsockname函数与getpeername函数的使用
getsockname和getpeername函数getsockname函数用于获取与某个套接字关联的本地协议地址 getpeername函数用于获取与某个套接字关联的外地协议地址定义如下:#includeint getsockname(int sockfd, struct sockaddr *localaddr, socklen_t *addrlen);int getpe
2014-04-27 14:20:28
55541
5
原创 找数字面试题总结
从一个数组中找出出现若干次的数字,这样的面试题目很多,通用的方法是使用Hash表,然后统计每个数字的出现次数,这种方法时间复杂度为O(n),空间复杂度也为O(n),但是对于几种特殊的情况却可以使用更高效的方法来解决。一个整型数组里除了一个数字之外,其他的数字都出现了两次。如何找出数组中只出现一次的数字可以使用上面说的Hash表方法,空间复杂读为O(n),但是如果要求时间复杂度是O(n),空
2014-04-26 16:23:04
1486
原创 Java多线程总结
多线程为什么要使用多线程?使用多线程的理由有千千万,但是归结起来就是为了充分利用硬件的处理能力,使计算机硬件在同一时间段能够处理多个任务,也就是使用操作系统提供的多线程,多进程机制实现多个任务并行执行。Java中使用Thread,Runnable,Callable等可以很方便的创建和运行线程。多线程的问题在使用多线程时,如果多个线程同时读同一个资源(如文件),则不会产生任何问题,但
2014-04-18 09:07:49
984
原创 阿里技术沙龙讨论题
原题大意:有一栋楼,楼里有很多房间,每个房间有一盏灯和一个开关,这个开关可以控制这盏灯,此外每个房间还有两个不同颜色的LED灯有一个遥控器,遥控器上有两个按钮,每个按钮分别控制所有房间的一个LED灯。类似于俄罗斯方块,将每个房间灯亮时,看作一个方块,请你设计一个方法使用遥控器控制一个方块的下落过程。除智能通信设备以外,工具任选,方块的下落与否仅仅与时间相关,每个房间由一个人来控制灯
2014-03-30 12:46:25
1623
原创 Hadoop源码分析之读文件时NameNode和DataNode的处理过程
客户端在和数据节点建立流式接口的TCP连接,读取文件数据前需要定位数据的位置,所以首先客户端在DFSClient.callGetBlockLocations()方法中调用了远程方法ClientProtocol.getBlockLocations(),调用该方法返回一个LocatedBlocks对象,包含了一系列的LocatedBlock实例,通过这些信息客户端就知道需要到哪些数据节点上去获取数据。这个方法会在NameNode.getBlockLocations()中调用,进而调用FSNamesystem.同
2014-03-23 19:46:35
2963
原创 Morris二叉树遍历算法
在遍历儿叉树时,常常使用的是递归遍历,或者是借助于栈来迭代,在遍历过程中,每个节点仅访问一次,所以这样遍历的时间复杂度为O(n),空间复杂度为O(n),并且递归的算法易于理解和实现,二叉树的递归遍历算法代码如下:儿叉树的定义:typedef struct BNode { char ch; struct BNode *left, *right;} BNode, *BiTre
2014-03-21 11:42:49
7055
原创 Hadoop源码分析之客户端读取HDFS数据
在使用Hadoop的过程中,很容易通过FileSystem类的API来读取HDFS中的文件内容,读取内容的过程是怎样的呢?今天来分析客户端读取HDFS文件的过程
2014-03-03 15:10:43
3709
原创 Hadoop源码分析之HDFS客户端的输入流类结构
当从HDFS集群中读取数据到客户端时,就要用到HDFS中的输入流类了,但是这里使用到了DFSInputSteam,FSInputStream,FSDataInputStream,DFSDataInputStream等这些类,如果不了解Java IO类的设计思想,这里很容易看迷糊,为什么用到类这么多*InputStream类?装饰器模式与Java IO中的装饰器模式在Java IO中,也
2014-02-28 15:42:36
2557
原创 Hadoop源码分析之数据节点的握手,注册,上报数据块和心跳
在上一篇文章Hadoop源码分析之DataNode的启动与停止中分析了DataNode节点的启动大致过程,下面来重点分析DataNode节点中启动过程中的与NameNode节点的几个通信过程。IPC对象创建在DataNode类中有一个成员变量namenode,它是DatanodeProtocol类型,DatanodeProtocol接口是DataNode节点与NameNode节点间进行IP
2014-02-21 17:14:26
2191
原创 Hadoop源码分析之DataNode的启动与停止
DataNode的启动分可以为两个部分,创建DataNode对象和启动DataNode节点。DataNode.main()方法会调用DataNode.secureMain()方法,接着在secureMain方法中调用DataNode.createDataNode()方法,createDataNode方法调用了DataNode类中的instantiateDataNode方法和runDatanodeD
2014-02-17 17:12:50
3315
原创 Apache Ant入门
apache ant的安装和介绍在官方的用户手册上说明很详细,下面开始从Ant的一些概念开始基本概念projectAnt的构建文件(buildfiles)是XML格式的,每个构建文件都包含一个project标签,代表这个构建文件所要构建的项目。project标签有三个属性,分别是name、default、basedir,这三个属性的作用如下表所示:属性描述是否必
2014-02-14 14:40:18
1574
原创 Hadoop源码分析之NameNode的启动与停止(续)
在上一篇文章Hadoop源码分析之NameNode的启动与停止中大致分析了NameNode节点的启动过程,下面来重点分析NameNode启动过程中执行的initialize方法的几个要点。创建FSNamesystem对象NameNode类的实现中,大量的具体调用工作是由FSNamesystem对象完成的,FSNamesystem类是整个名字节点的门面,封装了对HDFS目录操作,数据块块操作
2014-01-25 20:40:08
2359
原创 Hadoop源码分析之NameNode元数据的存储
在对NameNode节点进行格式化时,调用了FSImage的saveFSImage()方法和FSEditLog.createEditLogFile()存储当前的元数据,启动NameNode节点时,又要从镜像和编辑日志中读取元数据。所以先分析FSImage是如何存储元数据到镜像文件和如何加载元数据到内存的。存储元数据到镜像文件在NameNode运行时会将内存中的元数据信息存储到所指定的文件,
2014-01-19 13:39:16
6696
原创 Hadoop源码分析之NameNode的格式化
在配置Hadoop环境后,第一次启动NameNode节点之前,需要使用命令hadoop namenode -format对NameNode节点进行格式化,那么这个格式化的过程是怎么样的呢?这篇文章就来分析NameNode格式化的过程。NameNode节点以参数-format启动之后,会进入NameNode.createNameNode()方法,在这个方法中有一个switch语句,其中有一项就是
2014-01-15 21:01:20
3313
原创 Hadoop源码分析之NameNode的目录构成与类继承结构
与DataNode节点类似,NameNode节点也有自己的目录和类继承结构,但是NameNode节点的目录结构比DataNode节点就简单多了,下面就来简单分析NameNode节点的目录构成与类继承结构。NameNode的目录构成在NameNode节点运行时,维护着整个HDFS中的文件及目录信息,如果NameNode出现故障,如掉电或进程崩溃,那么内存中的信息将全部丢失,因此必须将内存中的
2014-01-13 21:09:34
2215
原创 Hadoop源码分析之DateNode的目录构成与类继承结构
在继续分析NameNode启动之前,先看看DateNode与NameNode的目录构成与类继承结构,NameNode与DataNode的启动过程与这些目录结构和类继承结构相关,在启动的过程中会检查目录的状态。这里所分析的类的继承结构是与存储文件相关的类,与数据交换有关的类暂不考虑。
2014-01-12 20:52:04
3419
原创 基本TCP套接字编程
从进程到内核传递套接字地址结构的函数有3个:bind、connect和sendto,这些函数有一个参数是指向某个套接字地址结构的指针,另一个参数是该结构的整数大小,如:struct sockaddr_in servconnect(sockfd, (struct sockaddr *) serv, sizeof(serv));既然指针和指针所指的内容的大小都传递给了内核,于是内核知道到底
2014-01-10 15:15:38
1352
原创 谈一谈对GWT和SmartGWT的看法
由于公司的一个web项目进度太慢,本人以前做过web项目,所以被分到这个项目了。前一段时间也听说过一点:这个项目使用的是一个叫做GWT的框架,但是对GWT是什么没什么概念,进入这个项目之前,还在想,web项目,至少比客户端的项目做起来爽多了吧!但是没想到的是这就是悲剧就从此开始了,所以吐槽吐槽GWT。项目使用SmartGWT框架,以前没接触过,但是这个框架彻底颠覆了我对web开发的认识。看了两
2014-01-09 16:10:53
5370
原创 Hadoop源码分析之NameNode的启动与停止
在前面几篇文章中已经分析完了IPC的调用的大致过程,接下来分析NameNode节点的工作过程NameNode节点在HDFS文件系统中只有一个实例,它提供了与多个DataNode实例一起组成了HDFS系统。NameNode节点主要功能是维护着HDFS文件中两个重要的关系:HDFS文件系统的文件目录树,文件的数据块索引(即每个文件对应的数据块列表),数据块和DataNode节点的对应关系(
2014-01-07 11:09:56
5281
原创 套接字地址结构
大多数套接字函数都需要一个指向套接字地址结构的指针作为参数,每个协议族都定义了它自己的套接字地址结构。这些结构的名字均以sockaddr_开头,并以对应每个协议地址族的唯一后缀结尾。IPv4套接字地址结构IPv4套接字地址结构以sockaddr_in命名,定义在头文件中。POSIX定义为:struct in_addr { in_addr_t s_addr; /*32位IPv
2014-01-06 17:09:48
3074
原创 Hadoop源码分析之IPC服务端连接建立与方法调用(续)
在上一篇文章Hadoop源码分析之IPC服务端连接建立与方法调用中分析到了Handler线程的run()方法。在Server.Handler.run()方法中,首先从阻塞队列callQueue中取出一个方法调用对象(Call对象),然后进行方法的调用call()方法返回一个ObjectWritable对象,这个对象包含了方法返回值的类型和具体的返回值。在Server.s
2013-12-31 21:25:20
1597
原创 Hadoop源码分析之IPC服务端连接建立与方法调用
在前面两篇文章中分析了IPC中Server端的初始化与启动和 客户端IPC连接与方法调用下面来分析服务器当客户端进行方法调用时,将数据发送给服务器后,服务器的处理过程。服务器处理过程涉及的了多个线程与类,正式服务器端的各个部分的合作,才使得IPC机制简单且高效。连接建立在org.apache.hadoop.ipc.Client.Connection.setupConnection()方法中
2013-12-30 10:57:33
2616
转载 亲和数问题
看了July的《程序员编程艺术》的第六章亲和数问题,看了好长时间才搞清楚,智商拙计,记录下来,原文见:https://github.com/julycoding/The-Art-Of-Programming-by-July/blob/master/ebook/zh/06.0.md这个问题原文中给出了两种解法,一种是伴随数组线性遍历的方法,另一种是近似与线性的利用素数筛选法,关于素数筛选法首先看
2013-12-23 22:07:38
1448
原创 Hadoop源码分析之IPC连接与方法调用
在上一篇文章Hadoop源码分析之IPC中Server端的初始化与启动中,分析了Server端的初始化和启动过程,Server端调用Server.start()方法启动后,就启动了一个Responser线程,一个Listener线程和多个Handler线程。其中在Listener线程中又有多个Reader线程,那么这些线程间怎样和客户端交互,如何接收数据呢?下面就来分析Hadoop的IPC连接建立
2013-12-22 14:48:00
2480
原创 Hadoop源码分析之IPC中Server端的初始化与启动
Reference:《Hadoop技术内幕:深入理解Hadoop Common和HDFS架构设计与实现原理》
2013-12-20 09:23:04
3904
原创 Hadoop源码分析之IPC机制
IPCJava动态代理JavaNIOHadoop IPC接口必须继承自org.apache.hadoop.ipc.VersionedProtocol接口Reference《Hadoop技术内幕:深入解析Hadoop Common和HDFS架构设计与实现原理》
2013-12-19 13:55:59
4777
原创 Java动态代理
代理是基本的设计模式之一,它在调用者与真实的被调用对象之间增加一个代理层,调用者通过代理层来操作真实的对象,即调用者发送指令给代理层,然后由代理层调用真实对象,调用完成之后,代理层再将执行的结果返回给调用者。代理模式的调用过程如下图所示:使用代理模式,在调用者上只需要持有一个代理层的对象,由代理层的对象来完成具体的对象调用操作,屏蔽具体的细节,让调用者可以专注于自身的业务,而不用去处理
2013-12-17 13:50:08
1782
原创 Hadoop源码分析之DFSClient对象的创建
再上一篇文章Hadoop源码分析之DistributedFileSystem中说道:DistributedFileSystem的重点在于其成员变量DFSClient dfs,它执行了文件系统的具体的操作。所以现在就来学习一个DFSClient这个类。再来看看这个图:DFSClient就再HDFS客户端那里,DistributedFileSystem就是通过DFSClient来与Na
2013-12-16 21:54:34
3348
2
原创 Hadoop源码分析之DistributedFileSystem
在上一篇博文Hadoop源码分析之FileSystem中分析了org.apache.hadoop.fs.FileSystem这个类,作为FileSystem的子类,org.apache.hadoop.hdfs.DistributedFileSystem是Hadoop抽象文件系统的一个具体文件系统,当以hdfs模式通过FileSystem.get()获取具体文件系统时,返回一个Distributed
2013-12-15 11:46:18
6788
原创 Hadoop源码分析之FileSystem
新建了一个Configuration对象之后,在调用Configuration.get()获取配置键值对时,如果Configuration对象的properities为null,就会默认加载CLASSPATH上的默认配置文件(参见 Hadoop源码分析之Configuration),所以在得到一个Configuration对象之后就可以利用这个对象来新建一个FileSystem对象。Hadoo
2013-12-14 14:58:46
9208
原创 Hadoop源码分析之Configuration
org.apache.hadoop.conf.Configuration类是Hadoop所有功能的基础类,每一种功能执行之前都需要有先得到一个Configuration对象。Hadoop使用了XML文件作为配置文件,来保存运行时的配置信息,然后将配置加载到Configuration对象中,要使用配置信息时直接从Configuration对象中取。Hadoop配置文件将下载的Hadoop
2013-12-13 15:20:40
3440
原创 Hadoop源码分析之开篇
看Hadoop也有段时间了,刚开始只是学习在Hadoop上跑MapReduce程序,基本的使用方式都已经了解了,但是很多配置方面的还是很模糊,当看到一个模糊的点时,再网上搜又比较费时,所以索引静下心来看看Hadoop的源代码,搞清楚Hadoop内部运作原理。所以就用写博客的方式来记录看Hadoop源码的过程。看Hadoop源码,我会从HDFS开始,首先是HDFS的读写,当然在这个过程中会遇到很
2013-12-13 10:28:43
1685
原创 URI URL URN简介及其在Java中的应用
常常遇到URI,URL这两个概念,但是一直都没有仔细去区分,前几天看书遇到了就决定花点时间来区分这两个概念,与这两个概念一起的还有URN,下面是它们的定义:URI:Uniform Resource Identifier,统一资源标识符URL:Uniform Resource Locator,统一资源定位符URN:Uniform Resource Name,统一资源名URIU
2013-12-11 13:42:07
1665
原创 依赖注入
这几天在看《Java程序员修炼之道》这本书,看到了依赖注入(DI)这一章,加深了对DI的认识,但是对DI还是处于一知半解的状态。记录一下对DI的理解按照书中的讲解,有个疑问就是为什么要使用DI?不使用DI是否可以完成程序?不使用DI当然可以完成程序,但是使用了DI可以让对象从别处得到依赖,而不是由它自己来构造,这样能够降低代码之间的耦合度,让代码易于测试,易读等。DI还与另一个概念“控制反
2013-12-04 14:43:40
1295
用freemarker后引入CSS和JS的路径问题
2011-02-20
关于人人网生成JSON格式的JS文件的问题
2011-01-08
关于人人网的json数据的问题
2011-01-02
关于Socket的问题
2010-11-29
关于SSH的性能优化问题
2010-10-14
TA创建的收藏夹 TA关注的收藏夹
TA关注的人