`

hdfs 学习(一)

阅读更多

HDFS概念:

1.数据块:每个磁盘都有默认的数据块的大小,这是磁盘进行读写的最小单位。构建与单个磁盘上的文件系统通过磁盘块来管理该文

件系统中的块,该文件系统块的大小可以是磁盘块的整数倍

HDFS也有块的概念,默认为64M,与单一磁盘上的文件系统相似,HDFS上的文件也被划分为块的大小的多个分块,作为独

立的存储单元,但是HDFS中小于一个块的大小的文件不会占据整个块的空间

2.为什么HDFS中的数据块如此之大

HDFS数据块比磁盘块大,这是为了最小化寻址开销。如果块设置的足够大,从磁盘传输数据的时间可以明显大于定位这个块开始

位置所需的时间,这样传输一个由多个块组成的文件的时间取决于磁盘传输速率

3.分布式系统中块抽象的好处
1>一个文件的大小可以大于网络中任意一个磁盘的容量
2>简化了存储子系统的设计
3>块适用于数据备份和容错能力

4.namenode 和datanode

HDFS集群中有两类节点。并以管理者-工作者模式运行,namenode(管理者),datanode(工作者)。
namenode 管理文件系统的命名空间,维护者文件系统树及整棵树内所有的目录和文件,这些信息以两类文件的形式永久保存
1>命名空间镜像文件
2>编辑日志文件
namenode 也记录着每个文件中各个块所在的数据节点信息,它并不永久保存块的位置信息

datanode 是文件系统的工作节点。他们根据需要存储并检索数据块,并定期向namenode发送他们所存储的块列表,没有nammode,

文件系统 将无法使用。因为如果namenode失效,则我们不知道如何根据datanode的块来重建文件

hadoop 两种机制来防止namenode失效:

1>备份那些组成文件系统元数据持久状态的文件。hadoop可以通过配置使namenode在多个文件系统上保存元数据的持久状态。这些

写操作时实时的,是 原子的。
2>运行辅助namenode,辅助namenode状态落后滞后于主节点,所以主节点失效时,会丢失部分信息,这种情况下一般把存储在NFS上

的namenode元数据复制到辅助namemode 并作为新的namenode运行


5.dfs.replication

hadoop默认块的副本数为3.

6.基本文件系统操作

1>从本地文件系统将一个文件复制到HDFS
bin/hadoop fs -copyFromLocal input/docs/quangle.txt hdfs://server0:9000/user/suse/quangle.txt

2>将hdfs文件复制回本地文件系统
bin/hadoop fs -copyToLocal quangle.txt quangle.copy.txt

bin/hadoop fs -mkdir newdir 创建目录

7.hadoop 文件系统

HDFS 只是hadoop 抽象文件系统的一个实现,java抽象类 org.apache.hadoop.fs.FileSystem 定义了hadoop的一个文件系统接口

java 接口

DistributedFileSystem

1>hadoop 从URL中读取数据

两种方式:
1>> java.net.URL 类

InputStream in = null;
try{
in = new URL("hdfs://host/path").openStream();

}finally{

IOUtils.closeStream(in);
}

2>>通过FileSystem API 读取数据

hadoop文件系统中通过 Hadoop Path 对象来代表文件,可以将一条路径看做为Hadoop 文件系统的url
获取FileSystem 实例由两种方法
public static FileSystem get(Configuration conf) throws IOException
public static FileSystem get(URL url,Configuration conf) throws IOException
第一个方法返回默认的文件系统
第二个返回给定url的文件系统,url为空则返回默认的文件系统

有了FileSystem 实例后 调用open()函数 来获取文件的输入流

Public FSDataInputStream open(Path f) throws IOExeption //默认缓冲区大小为4kb

Public abstract FSDataInputStream open(Path f,int buffersize)

FSDataInputStream :
实际上open()函数返回的是FSDataInputStream 对象,而不是标准的java.io类对象,这个类是继承了

java.io.DataInputStream 接口的一个特殊的类,支持随机访问,可以从流的任意一个位置读取

public class FSDataInputStream extends DataInputStream implents Seekable,PositionedReadable{
//implements elided

}

Seekable 接口支持在文件中找到指定的位置,并提供一个查询当前位置相对于文件起始位置的偏移量getPos 的查询方法

public interface Seekable{
void seek(long pos) throws IOExpection
long getPos()

}

调用seek()方法定位大于文件长度位置会导致异常。
与java.io.InputStream 中的skip() 不同。seek()可以移动到文件的任何绝对位置,skip()则只能相对于当前位置定位到另一

个新位置

seek 方法是一个相对高开销的操作

2>写入数据

public FSDataOutputStream create (Path f) throws IOException

create()方法 能够为需要写入的且当前不存在的文件创建父目录,如果希望不存在父目录就报错 则先调用
exists()方法


append 新建文件方法

public FSDataOutputStream append(Path f) throws IOException

该追加操作允许一个writer 打开文件后在访问该文件的最后偏移量处追加数据

0
3
分享到:
评论
3 楼 黎明lm 2012-08-17  
inprice 写道
又遇到一个照抄的.....没有贴出实际操作过程.
lz可以使用TestDFSIO来测试HDFS的吞吐量性能....


这个不是抄的.而是我开始接触hadoop的时候看hadoop权威指南 自己做的笔记而已。我知道你想要实际的操作过程也就是代码,但是如果你有能力的话可以自己写,如果没能力的话 就算是抄你可能也不一定抄的明白,不要指望别人给你完整的代码,那样的话 你就是在乞讨像个没有能力的乞丐一样
2 楼 inprice 2012-08-16  
又遇到一个照抄的.....没有贴出实际操作过程.
lz可以使用TestDFSIO来测试HDFS的吞吐量性能....
1 楼 liuxuejin 2011-10-22  
hdfs的性能 不知道 lz有没有测试过

相关推荐

Global site tag (gtag.js) - Google Analytics