一、HDFS数据格式
-
文件格式
面向行:.txt .seq
面向列 .rc .orc
面向列的优点:
1.空间利用率高
2.查询效率高:数据分析(olap)
3.可扩展性强 -
压缩格式
物理上可切分:.lzo 压缩速度快,压缩率低,适合大文件的压缩
.bz2 压缩速度慢,压缩率高,适合归档等不要求压缩速度情况
物理上不可切分:.gz 压缩速度快,适合压缩后<128M的文件
.snappy压缩速度快,适合作为map->reduce或job数据流中间的数据传输格式 -
文件格式的使用
1.设置输出格式为gzip
-Dmapred.output.compress=true
-Dmapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec//参数解析器 GenericOptionsParser optionParser = new GenericOptionsParser(conf, args); String[] remainingArgs = optionParser.getRemainingArgs(); 2.设置输出格式为lzo格式 -Dmapred.output.compress=true
-Dmapred.output.compression.codec=com.hadoop.compression.lzo.LzopCodec
-
自定义Partition
通过继承Partitioner类,自定义实现Partition自定义Partition的定义
public static class MyHashPartitioner<K, V> extends Partitioner<K, V> {/** Use {@link Object#hashCode()} to partition. */
public int getPartition(K key, V value, int numReduceTasks) {
return (key.toString().charAt(0) < ‘q’ ? 0 : 1) % numReduceTasks;
// return key.toString().charAt(0);
}
}
指定partition类
job.setPartitionerClass(MyHashPartitioner.class)
通过配置指定参数来实现:
自定义分区类的独立类代码如下:
package com.tianliangedu.examples;
import org.apache.hadoop.mapreduce.Partitioner;
public class MyHashPartitioner<K, V> extends Partitioner<K, V> {
public int getPartition(K key, V value, int numReduceTasks) {
return (key.toString().charAt(0) < 'q' ? 0 : 1) % numReduceTasks;
}
}
-Dmapreduce.job.partitioner.class=com.tianliangedu.examples.MyHashPartitioner
指定partition类
job.setPartitionerClass(MyHashPartitioner.class);
-
自定义reduce数量
-Dmapred.reduce.tasks=2 -
Configuration传递
实现基于input_filter目录中文件数据的一次排序,即Map和Reduce的读入和归约处理。
将本地文件whitelist.txt传给Driver类,读取到该文件内容txtContent
将txtContent通过Configuration的set方法传递给map和reduce任务
在map任务中通过Configuration对象的get方法获取传递过来的值txtContent
将txtContent解析成Set对象,对map任务中的map方法进行过滤输出
由于map端已经做了过滤,reduce端将不需任何改变