您的位置:首页 > 运维架构

Hadoop分布式文件系统——HDFS的读写

2016-01-22 10:06 288 查看
HDFS是运行在通用硬件平台上的可容错分布式文件系统。它优化了大文件的流式读取模式,适用于那些高吞吐并且对延迟性要求相对比较低的场景。它还通过文件“一次写入,多次读取”的简单策略保证了数据的一致性。HDFS亦使用了“块复制”的概念,让数据在集群的节点间进行复制,每个数据块复制的份数由“复制因子”决定。

HDFS包含三个服务:

A、NameNode:保存着集群中所有数据块位置的一个目录。

B、Secondary NameNode:周期性同步NameNode的块索引数据。在同步处理中,Secondary NameNode下载NameNode的image文件和editlogs,并对它们做本地归并,最后再将归并完的image文件发回给NameNode。Secondary NameNode并不是NameNode的热备份,当NameNode故障的时候它并不能工作。

C、DataNode:管理着从NameNode分配过来的数据块。它并不能感知集群中其他DataNode的存在,只和NameNode进行交互。

一、HDFS的读写操作:

public class HdfsWriter extends Configured implements Tool {

/* (non-Javadoc)
* @see org.apache.hadoop.util.Tool#run(java.lang.String[])
*/
@Override
public int run(String[] arg0) throws Exception {
String localInputPath = arg0[0];
Path outputPath = new Path(arg0[1]);
Configuration conf = getConf();
FileSystem fs = FileSystem.get(conf);
OutputStream os = fs.create(outputPath);
InputStream is = new BufferedInputStream(new FileInputStream(localInputPath));
IOUtils.copyBytes(is, os, conf);
return 0;
}

public static void main(String[] args) {
try {
int returnCode = ToolRunner.run(new HdfsWriter(), args);
System.exit(returnCode);
} catch (Exception e) {
e.printStackTrace();
}
}

}


public class HdfsReader extends Configured implements Tool {

/* (non-Javadoc)
* @see org.apache.hadoop.util.Tool#run(java.lang.String[])
*/
@Override
public int run(String[] as) throws Exception {
Path inputPath = new Path(as[0]);
String localOutputPath = as[1];
Configuration conf = getConf();
FileSystem fs = FileSystem.get(conf);
OutputStream os = new BufferedOutputStream(new FileOutputStream(localOutputPath));
InputStream is = fs.open(inputPath);
IOUtils.copyBytes(is, os, conf);
return 0;
}

public static void main(String[] args) throws Exception {
int returnCode = ToolRunner.run(new HdfsReader(), args);
System.exit(returnCode);
}

}


二、读写原理:FileSystem是一个抽象类,代表一个通用文件系统。调用FileSystem.get()方法时,会将Hadoop配置中的fs.default.name参数(形式:hdfs://)作为URI,选择初始化一个正确的文件系统。create()方法返回JAVA I/O的OutputStream对象,open()方法返回JAVA I/O的InputStream对象。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息