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
metadata包括:1.一个long类型的数值,表示metadata的key/value对的数目。2.每对,有一组String key和bytes value。
file metadata包括:1.trevni.codec.压缩方法。2.trevni.checkSum。
列metadata:看下图。



接下来会贴自己写的一些代码,实现了trevni。

1.写入tervni格式文件
public static  void testTwoColumn(OutputStream out) throws IOException
{
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);
}


2.从trevni格式文件中读取
public static void readTwoColumn(File file) throws IOException
{
@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);
}
}


原创粉丝点击