今天来说说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);
}