trevni总结。设计,优点,代码实现。
来源:互联网 发布:天下3捏脸数据男 编辑:程序博客网 时间:2024/05/04 22:09
学习过程中碰到了trevni,trevni的资料不多,学习起来比较吃力。我总结了自己学习的一些知识,肯定不完善,先写下来,以后再补充。
普通的数据集一般都设计成很多行和很多列,每条记录就是一行,每个字段作为一列。写入记录时,就是把一行又一行写入文件,就像hadoop的sequence file。在一些情况下,列存储的性能比行存储会高很多。trevni就是一种列存储格式。数据集被分成多个row groups,每个row group包含很多行。具体的跟块大小有关。每个row group以列格式组织,所有的row groups组成整个数据集。
treni设计目标:
1.尽量增大row group的size。访问磁盘很消耗时间,所以减少访问磁盘的次数是很好的。
2.允许随即访问任意一个row group。某些查询会先查询一列,找到满足条件的列,再查询其他列。
3.尽量减少数据集分成的file数目。每个数据集会分成很多row groups。每个row group就是一个file。hadoop的master节点会管理所有file的信息,因此file的数目越少越好。
4.支持多个row groups之间的列合作。row group是在操作数据集的元单位。
5.保证数据完整。
6.保持高扩展性。
设计:
1.每个row group是一个单独的文件。文件中的列的所有值都是连续写入的。这最大化了row group的size,当查询少量列时,能优化性能。
2.一个file占单独一个hdfs的block。
3.文件的中每列被写成连续的64KB的压缩块。
4.元数据信息会被加到文件,列和block层。
5.每个bolck会加入checkSum。以保证数据完整。
trevni支持的数据类型:
- null, requires zero bytes. Sometimes used in array columns.
- boolean, one bit, packed into bytes, little-endian;
- int, like long, but restricted to 32-bit signed values
- long 64-bit signed values, represented as above
- fixed32 32-bit values stored as four bytes, little-endian.
- fixed64 64-bit values stored as eight bytes, little-endian.
- float 32-bit IEEE floating point value, little-endian
- double 64-bit IEEE floating point value, little-endian
- string as above
- bytes as above, may be used to encapsulate more complex object
{
ColumnFileWriter cfw = new ColumnFileWriter(createFileMeta(), //ColumnFileWriter是trevni提供给java的写入接口,构造函数。
new ColumnMetaData("a",ValueType.INT),
new ColumnMetaData("b",ValueType.STRING)
);
Random random = TestUtil.createRandom();
long time1 = System.currentTimeMillis();
for(int i = 0; i < 2000000; i++) //写入两百万条记录。
{
cfw.writeRow(random.nextInt(),TestUtil.randomString(random)); //随即生成记录,用writeRow方法写入
}
cfw.writeTo(out);
out.write(cfw.toString().getBytes());
long time2 = System.currentTimeMillis();
System.out.println(cfw.getColumnCount());
System.out.println(time2-time1);
}
{
@SuppressWarnings("resource")
ColumnFileReader cdr = new ColumnFileReader(file);
System.out.println(cdr.getRowCount());
Iterator<Integer> i = cdr.getValues("a"); //Return an iterator over values in the named column
Iterator<String> j = cdr.getValues("b");
int count = 0;
while(i.hasNext()&&j.hasNext())
{
count ++;
System.out.println(i.next());
System.out.println(j.next());
System.out.println(count);
}
}
- trevni总结。设计,优点,代码实现。
- 命令模式的代码实现及优点
- 网页设计使用Div+css的优点总结
- ImageLoader 设计及优点
- 托管代码的优点
- 代码的优点之一
- PHP优点总结
- ibatis优点总结
- LINQ 优点 总结
- LINQ 优点 总结
- Struts2优点总结
- JSON优点简单总结
- const优点全面总结
- Kotlin优点总结
- Trevni: A Column File Format
- 代码大全--设计启发总结
- 面向对象设计的优点
- 面向对象设计的优点
- 直接拿来用!最火的Android开源项目
- CALL是如何炼成的 之二:实践篇
- 【Android】Android视觉规范-间距规范与文字规范单位换算(dip、sp与px)
- VS 2008小技巧( 3 )
- 云计算
- trevni总结。设计,优点,代码实现。
- 10046事件概述
- 三角形的两种画法
- PHP+MYSQL+APACHE
- 今天看到一题:short a = 128, byte b = (byte)a,问打印的a,b分别是多少? key:a=128,b=-128
- 二级菜单联动 ajax+json
- 审计关闭
- hdu 2491 (贪心+排序)
- poj 2411