map是怎样读取数据的
许多方法是把each line as a record
reduce 多的时候要分区
combiner 指定一个合并函数就可以了
conf.setcombinerClass()
HDFS以流式数据访问模式来存储超大文件
namenode将文件系统的元数据(文件,目录和数据的存储信息)存在内存中 因此文件系统所能存储的文件总数受限于namenode的内存容量
数据块的大小是固定的 分片的大小不固定 若一个split大于一个block的大小 那么对于个处理这个split的map任务,不在这个块上的split可能需要通过网络传输到这个map任务上来 没有充分发挥数据本定性的优越性质
数据块大 就是为了减少寻址开销
文件系统块块地抽象 1 文件的大小可以大于网络中任何一个磁盘的容量 文件的所有块不需要存储在同一个磁盘上 他们可以用网络上的任意一个磁盘来存储 当然也可以用一个磁盘存储一个文件 2 大大简化了子系统的设计 便于管理 信息不与块同时存储 大小一样 便于计算块的多少 3适合用于数据备份和提供容错能力
./hadoop fscd / -files -blocks 查询块信息
namenode管理文件系统的命名空间
datanode 存储数据 工作节点 根据需要存储并检索数据块 定期想namenode发送他们所存储块地列表
seekable 接口支持在文件中找到指定位置 并提供一个查询单签位置相对于文件其实位置的偏移量(getPos())方法。
public class FileSystemDoubleCat {
public static void main(String[] args) throws Exception {
String uri = args[0];
Configuration conf = new Configuration();//配置信息
FileSystem fs = FileSystem.get(URI.create(uri), conf);//fs相当于一个指针
FSDataInputStream in = null;
try {
in = fs.open(new Path(uri));
IOUtils.copyBytes(in, System.out, 4096, false);
in.seek(0); // go back to the start of the file
IOUtils.copyBytes(in, System.out, 4096, false);
} finally {
IOUtils.closeStream(in);
}