今天来说说hadoop的一大核心——HDFS,这个是很重要的,它呢,是分布式文件系统。为什么说hadoop能存储海量数据?其实主要还是依赖与hdfs的能力,主要依赖的是hdfs能存储海量数据。

1、 为什么hdfs能存储海量数据呢?

一开始抛出这样的问题来想想。至于HDFS的基本概念什么的都不用多说了的~我们重在使用,而不是去做“研究”。扯蛋的话就是,“专家的研究”已经成为名副其实的贬义词了,很带有讽刺意义了,在现在这个时代~你们懂的~因为他们有的没有真正经历过,而却要说着要去“研究”~所以我们不“纠结于”概念,我们只要使用就可以了的~

回到问题,这个是为什么呢?其实很简单,hdfs包含两大核心——NameNode和DataNode,namenode在集群中是只能有一个的,datanode可以有多个,我们要知道,数据其主要实是保存在datanode上的,从字面上也能理解的~并且datanode可以平滑扩展的~这就好比数据可以存储在一个大型的datanode中的,所以能支持海量数据的存储。

2、怎么使用hdfs?

安装了hadoop的就可以直接使用hdfs了的,一般有两种方式:

一种是命令式:

我们知道hadoop的bin目录下有一个hadoop的命令,这个其实算是hadoop的一个管理命令,我们可以使用这个来对hdfs操作的。

hadoop fs -lsr /

以上是递归列出hdfs根目录下的所有文件(夹)

解释一下:

hadoop 不用解释了的,fs 指的是hdfs, -ls(r) 这个类似linux的目录列表命令,列出所有文件(夹),括弧的r表示递归,/ 表示根目录。

其他常用的命令还有:

hadoop fs -mkdir [path] 表示创建文件夹

hadoop fs -put [path] 表示上传文件到hdfs

hadoop fs -put ~/hello.txt /tmp/input/

等等相关的一系列命令,这边就不一一讲出~

HDFS的核心概念 hdfs的三大核心_hadoop


HDFS的核心概念 hdfs的三大核心_海量数据_02

一种是api式:

看下面程序:

public static void main(String[] args) throws Exception {
		URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory());
		final URL url = new URL(PathConstant.FILE01);
		final InputStream in = url.openStream();

		/**
		 * @param in
		 *            输出流
		 * @param out
		 *            输出流
		 * @param buffSize
		 *            缓冲区大小
		 * @param close
		 *            是否关闭流
		 */
		IOUtils.copyBytes(in, System.out, 1024, true);
	}



public class PathConstant {
	public static final String FILE01 = "hdfs://192.168.0.167:9000/tmp/input/micmiu-01.txt";
	
	public static final String DIR_PATH = "hdfs://192.168.0.167:9000/tmp/";
	
	public static final String TEST_PATH = "hdfs://192.168.0.167:9000/tmp/test/";

	public static final String FILE_PATH = "hdfs://192.168.0.167:9000/tmp/test/demo.txt";
}

运行上面的程序如下:

HDFS的核心概念 hdfs的三大核心_海量数据_03

直接输出的是hdfs里面文件的内容。org.apache.hadoop.io.IOUtils; 这个是hadoop里面提供的一个操作工具类

以上这种是java.socket的方式,其实hadoop里面推荐了使用FileSystem这个类来操作:

public static void main(String[] args) throws Exception {
		// 创建文件夹
		// mkdir();

		// 上传文件
		// uploadData();

		// 下载文件
		// getContent();
		// 删除文件(夹)
		// delete();
	}

	public static void delete() throws IOException {
		FileSystem testFileSystem = FileSystem.get(
				URI.create(PathConstant.TEST_PATH), new Configuration());
		/**
		 * @param f
		 *            目录
		 * @param recursive
		 *            递归
		 */
		boolean flag = testFileSystem.delete(new Path(PathConstant.TEST_PATH),
				true);
		System.out.println(flag);
	}

	public static void uploadData() throws IOException, FileNotFoundException {
		FileSystem testFileSystem = FileSystem.get(
				URI.create(PathConstant.TEST_PATH), new Configuration());

		FSDataOutputStream out = testFileSystem.create(new Path(
				PathConstant.FILE_PATH));
		FileInputStream in = new FileInputStream(
				"F:\\hadoop.file\\demo\\hello.txt");

		IOUtils.copyBytes(in, out, 1024, true);
	}

	public static void getContent() throws Exception {
		FileSystem fileSystem = FileSystem.get(
				URI.create(PathConstant.FILE_PATH), new Configuration());

		InputStream in = fileSystem.open(new Path(PathConstant.FILE_PATH));

		IOUtils.copyBytes(in, System.out, 1024, true);
	}

	public static void mkdir() throws Exception {
		FileSystem fileSystem = FileSystem.get(
				URI.create(PathConstant.DIR_PATH), new Configuration());

		boolean flag = fileSystem.mkdirs(new Path(PathConstant.TEST_PATH));
		System.out.println(flag);
	}