摘要: 分布式哈希和一致性哈希是分布式存储和p2p网络中说的比较多的两个概念了。介绍的论文很多,这里做一个入门性质的介绍。 分布式哈希(DHT) 两个key point:每个节点只维护一部分路由;每个节点只存储一部分数据。从而实现整个网络中的寻址和存储。DHT只是一个概念,提出了这样一种网络模型。并且说明它是对分布式存储很有好处的。但具体怎么实现,并不是DHT的范畴。 一致性哈希: DHT的一种实现。本质还是一个哈希算法。回想平时我们做负载均衡,按querystring签名对后端节点取模是最简单也是最常用的算法,但节点的增删后所造成的问题显而易见,原有的请求几乎都落不到同一台机器上。优化一点的... 阅读全文
posted @ 2013-11-26 16:31 LifeStudio 阅读(897) 评论(0) 推荐(0) 编辑
摘要: 首先,必须强调一点:String Pool不是在堆区,也不是在栈区,而是存在于方法区(Method Area)解析:String Pool是常量池(Constant Pool)中的一块。我们知道,常量就是不可以再改变的值,给它建一个池子很明显是为了加快程序运行的速度;在一个程序中,常量和变量是相对存在的;变量因为可变性所以一般存在于栈中,而常量去作为一个特殊群体被存在在常量池中。常量池(constant pool)指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。--- (很明显在方法区)它包括了关于类、方法、接口等中的常量,也包括字符串常量(这个就是Sring Pool啦 阅读全文
posted @ 2013-11-23 17:20 LifeStudio 阅读(2116) 评论(0) 推荐(0) 编辑
摘要: 使用,必须要知道其原理,在课堂上学过散列函数的用法及其原理。但一直不知道怎么实践。 后来,在实际项目中,需要做一个流量分析预处理程序。每5分钟会接收到现网抓来的数据包并解析,每个文本文件大概200M左右,数据量颇多。要求根据用户ID和协议ID为key,计算其流量平均值。 起初的想法是按行加载每一条数据并放入ArrayList中,然后写个算法比较每一个数据的用户ID和协议ID,如果一样则累加其流量。测试中发现其效率极低,为此第一反应是改进算法。怎么做才更高效呢?后来想到了课堂中学到的散列函数,于是写了个MD5散列函数将用户ID和协议ID为key进行散列,若得到的结果相同则累加其流量,循环... 阅读全文
posted @ 2013-11-23 15:01 LifeStudio 阅读(1331) 评论(0) 推荐(0) 编辑
摘要: 解析Java对象的equals()和hashCode()的使用前言在Java语言中,equals()和hashCode()两个函数的使用是紧密配合的,你要是自己设计其中一个,就要设计另外一个。在多数情况 下,这两个函数是不用考虑的,直接使用它们的默认设计就可以了。但是在一些情况下,这两个函数最好是自己设计,才能确保整个程序的正常运行。最常见的是当 一个对象被加入收集对象(collection object)时,这两个函数必须自己设计。更细化的定义是:如果你想将一个对象A放入另一个收集对象B里,或者使用这个对象A为查找一个元对象在收集对 象B里位置的钥匙,并支持是否容纳,删除收集对象B里的元对象 阅读全文
posted @ 2013-11-08 14:06 LifeStudio 阅读(263) 评论(0) 推荐(0) 编辑
摘要: 最近在写一个MR调度程序,在以服务进程中同时开启了两个MapReduce线程。这两个MR共享同一份输入源,此时会造成Cast异常:java.lang.ClassCastException:org.apache.hadoop.mapreduce.lib.input.FileSplitcannotbecasttoorg.apache.hadoop.mapred.InputSplitatorg.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:412)atorg.apache.hadoop.mapred.MapTask.run(MapTas 阅读全文
posted @ 2013-11-06 14:02 LifeStudio 阅读(581) 评论(0) 推荐(0) 编辑
摘要: 默认的mapper是IdentityMapper,默认的reducer是IdentityReducer,它们将输入的键和值原封不动地写到输出中。默认的partitioner是HashPartitinoer,它根据每条记录的键进行哈希操作来分区。输入文件:文件是MapReduce任务的数据的初始存储地。正常情况下,输入文件一般是存在HDFS里。这些文件的格式可以是任意的;我们可以使用基于行的日志文件,也可以使用二进制格式,多行输入记录或其它一些格式。这些文件会很大—数十G或更大。小文件与CombineFileInputFormat Hadoop在处理大量小文件时的性能稍微逊色一些,一个原因是Fi 阅读全文
posted @ 2013-11-04 16:29 LifeStudio 阅读(4205) 评论(0) 推荐(0) 编辑
摘要: As it is said in the recent article"Google: Taming the Long Latency Tail - When More Machines Equals Worse Results", latency variability has greater impact in larger scale clusters where a typical request is composed of multiple distributed/parallel requests. The overall response time dram 阅读全文
posted @ 2013-10-31 20:00 LifeStudio 阅读(700) 评论(0) 推荐(0) 编辑
摘要: 一、总论根据http://lucene.apache.org/java/docs/index.html定义:Lucene是一个高效的,基于Java的全文检索库。所以在了解Lucene之前要费一番工夫了解一下全文检索。那么什么叫做全文检索呢?这要从我们生活中的数据说起。我们生活中的数据总体分为两种:结构化数据和非结构化数据。结构化数据:指具有固定格式或有限长度的数据,如数据库,元数据等。非结构化数据:指不定长或无固定格式的数据,如邮件,word文档等。当然有的地方还会提到第三种,半结构化数据,如XML,HTML等,当根据需要可按结构化数据来处理,也可抽取出纯文本按非结构化数据来处理。非结构化数据 阅读全文
posted @ 2013-10-27 14:29 LifeStudio 阅读(298) 评论(0) 推荐(0) 编辑
摘要: 最近在一家公司做java实习,写了个网络字节采集器。写了个单例TCPServer来采集数据,其中用到了InputStream.read()来读取数据。产生了一系列问题,下面做下总结: 关于while((length = is.read(data)) != -1)问题。 在写此方法时,产生了一些疑惑,read何时阻塞?何时返回值-1? 首先做个假设: 1、读不满data的length就一直阻塞。为此,做了以下实验: Server端: byte[] data = new byte[8]; while((length = is.read(data)) != -1){ ... 阅读全文
posted @ 2013-10-21 10:56 LifeStudio 阅读(14228) 评论(1) 推荐(0) 编辑
摘要: 关于字节序(大端法、小端法)的定义《UNXI网络编程》定义:术语“小端”和“大端”表示多字节值的哪一端(小端或大端)存储在该值的起始地址。小端存在起始地址,即是小端字节序;大端存在起始地址,即是大端字节序。也可以说:1.小端法(Little-Endian)就是低位字节排放在内存的低地址端即该值的起始地址,高位字节排放在内存的高地址端。2.大端法(Big-Endian)就是高位字节排放在内存的低地址端即该值的起始地址,低位字节排放在内存的高地址端。举个简单的例子,对于整形0x12345678。它在大端法和小端法的系统内中,分别如图1所示的方式存放。网络字节序我们知道网络上的数据流是字节流,对于一 阅读全文
posted @ 2013-10-12 18:19 LifeStudio 阅读(955) 评论(0) 推荐(0) 编辑