HDFS原理、命令行接口和Java接口

1 HDFS的设计目标

我们都知道,Hadoop是一种用来进行海量数据存储和计算的分布式系统基础架构,它具有高效、低成本、高可靠(容错)及高扩展(可伸缩)等优点。
(1)HDFS作为Hadoop的核心之一,它适合分布式存储超大文件,适合一次写入多次读取的文件访问模式,并且HDFS尤其具有高容错性和高吞吐量等优点。
(2)HDFS不适合用于存储大量 的小文件,因为namenode将文件系统的元数据存储在内存中,因此该文件系统所能存储的文件总数受限于namenode的内存容量;HDFS不支持并发写以及文件任意位置的修改,因为这些操作比较低效;HDFS不适合低时间延迟的数据访问,因为HDFS是为高数据吞吐量应用优化的,这可能会以高时间延迟为代价,用HBase可以满足低延迟的访问需求。

2 HDFS中的数据块(block)

HDFS上的文件被划分为块大小的多个分块作为独立的存储单元。Hadoop2以后HDFS中的块的默认大小为128M。HDFS中小于一个块大小的文件不会占据整个块的空间。HDFS中的块比磁盘中的块大,其目的是为了最小化寻址开销,如果块设置得足够大,从磁盘传输数据的时间可以明显大于定位这个块开始位置所需的时间,这有利于由多个块组成的文件的传输;但是如果设置太过大,导致mapreduce中的map任务数太少(因为map通常一次处理一个块中的数据),少于集群中的节点数量,作业的运行速度就会比较慢。
块的好处:
(1)块可以保证大文件的分布式存储,一个文件的不同部分可能分别存储在不同的节点上;
(2)使用块抽象而非整个文件作为存储单元,大大简化了存储子系统的设计;
(3)块非常适合用于数据备份进而提供数据容错能力和可用性。

3 NameNode和DataNode

NameNode和DataNode分别为HDFS的主从节点。NameNode是整个文件系统的管理节点,它在内存中维护着整个文件系统的文件目录树,文件/目录的元数据以及每个文件对应的数据块列表,它接收客户端的操作请求。它在磁盘上还对应着fsimage文件和edits文件。DataNode是文件系统的工作节点,它根据需要存储并检索数据块,他接受客户端或NameNode的调度,并定期向NameNode发送它们所存储的块的列表。SecondaryNameNode是实现HA(高可用)的一种解决方案,而在Hadoop2以后的集群中使用的是主(active)备(stand by)NameNode这一方案来实现HA。


4 HDFS的命令行接口(hadoop fs或hdfs dfs命令)

l-help[cmd]  //显示命令的帮助信息
l-ls(r)<path>  //显示当前目录下所有文件
l-du(s)<path>  //显示目录中所有文件大小
l-count[-q]<path>  //显示目录中文件数量
l-mv<src><dst>  //移动多个文件到目标目录
l-cp <src><dst>  //复制多个文件到目标目录
l-rm(r)  //删除文件()
l-put<localsrc><dst>  //本地文件复制到hdfs
l-copyFromLocal  //put
l-moveFromLocal  //从本地文件移动到hdfs
l-get[-ignoreCrc]<src><localdst>  //复制文件到本地,可以忽略crc校验
l-getmerge <src><localdst>  //将源目录中的所有文件排序合并到一个文件中
l-cat<src>  //在终端显示文件内容
l-text<src>  //在终端显示文件内容
l-copyToLocal [-ignoreCrc]<src><localdst>  //复制到本地
l-moveToLocal <src><localdst>
l-mkdir<path>  //创建文件夹
l-touchz<path>  //创建一个空文件

5 HDFS的Java接口

package captain.hadoop.hdfs;

import java.io.FileInputStream;
import java.net.URI;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;

//利用HDFS的Java接口实现目录的创建、删除,文件的上传、下载。
public class HDFSDemo {

	public static final String HDFS_PATH = "hdfs://hadoop:9000";
	public static void main(String[] args) throws Exception{
		
		//注意需要root权限,需将"root"作为其参数
		FileSystem fs = FileSystem.get(new URI(HDFS_PATH), new Configuration(), "root");
		
		//创建文件夹
		makeDirectory(fs);
		
		//上传文件
		uploadData(fs);
		//另一种上传文件的方式:直接调用FileSystem的实例方法
		//fs.copyFromLocalFile(new Path("D:/Eclipse_Workspace/Hadoop/log.txt"), new Path("/log"));
		
		//下载文件
		downloadData(fs);
		
		//删除文件(夹)
		deleteFile(fs);
	}
	
	//删除文件函数
	private static void deleteFile(FileSystem fs) throws Exception {
		fs.delete(new Path("/testHDFS"), true);
	}
	
	//下载文件函数
	private static void downloadData(FileSystem fs) throws Exception {
		FSDataInputStream in = fs.open(new Path("/testHDFS/log"));
		IOUtils.copyBytes(in, System.out, 1024, true);
	}
	
	//创建目录函数
	private static void makeDirectory(FileSystem fs) throws Exception {
		fs.mkdirs(new Path("/testHDFS"));
	}
	
	//上传文件函数
	private static void uploadData(FileSystem fs) throws Exception {
		FileInputStream in = new FileInputStream("D:/Eclipse_Workspace/Hadoop/log.txt");
		FSDataOutputStream out = fs.create(new Path("/testHDFS/log"));
		IOUtils.copyBytes(in, out, 4096, true);
	}

}


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值