【hadoop之翊】——hadoop大核心之HDFS初识,hadoophdfs初识


今天来说说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/
等等相关的一系列命令,这边就不一一讲出~



一种是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里面文件的内容。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);
	}


hadoop hdfs的默认目录问题

frostfish425说的是对的!/user/hadoop是安装目录,就是说你hadoop相关的配置和代码都是放在这个位置,这个你自己定就可以了,但是要注意你配置文件和环境变量中的相关配置都要相应的发生改变。而/tmp/hadoop-hadoop/dfs/name是你配置的hdfs目录,也就是数据存放目录,在hdfs-site.xml中配置的,当然你也可以改变这个目录!这个目录挂载的磁盘要足够大,不然数据存放不下,你初始化的时候报的这个Storage directory /tmp/hadoop-hadoop/dfs/name has been successfully formatted其实就是在/tmp/hadoop-hadoop/dfs这个目录下创建了name目录,意思就是告诉你,数据存放目录已经创建成功了!
 

hadoop HDFS有提供查看空间总大小以及剩余空间大小的接口

hadoop 1.2.x
看src/webapps/hdfs/dfshealth.jsp,对应50070查看到的那个页面,里面搜就有了
例如: Configured Capacity对应
org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getCapacityTotal()

剩下的自己用同样的方法找一下就都有了
 

相关内容