HDFS: 全称Hadoop Distributed File System
一. HDFS简介
1. HDFS实现目标:
2. HDFS自身的局限性:
二. HDFS相关概念
1. 块: 为了分摊磁盘读写开销,也就是再大量数据间分摊磁盘寻址的开销,块大小普通默认为64MB,一个文件被分成多个块,以块作为存储单位,块的大小远远大于普通文件系统,当然也可以设置为128MB.
当然不能设置的太大,原因: 如果块太大会导致MapReduce就一两个任务在执行,完全牺牲了MapReduce的并行度,发挥不了分布式并行处理的效果.
HDFS采用这种抽象的块的概念的设计好处:
2. HDFS两大组件:
名称节点:NameNode,是整个HDFS集群的管家,即一个数据目录来记录信息.
名称节点的数据结构数据节点: DataNode,存储实际数据
总结:
• 分布式文件系统是大数据时代解决大规模数据存储问题的有效解决方案,HDFS开源实现了GFS,可以利用由廉价硬件构成的计算机集群实现海量数据的分布式存储。
• HDFS具有兼容廉价的硬件设备、流数据读写、大数据集、简单的文件模型、强大的跨平台兼容性等特点。但是,也要注意到,HDFS也有自身的局限性,比如不适合低延迟数据访问、无法高效存储大量小文件和不支持多用户写入及任意修改文件等。
• 块是HDFS核心的概念,一个大的文件会被拆分成很多个块。HDFS采用抽象的块概念,具有支持大规模文件存储、简化系统设计、适合数据备份等优点。
• HDFS采用了主从(Master/Slave)结构模型,一个HDFS集群包括一个名称节点和若干个数据节点。名称节点负责管理分布式文件系统的命名空间;数据节点是分布式文件系统HDFS的工作节点,负责数据的存储和读取。
• HDFS采用了冗余数据存储,增强了数据可靠性,加快了数据传输速度。HDFS还采用了相应的数据存放、数据读取和数据复制策略,来提升系统整体读写响应性能。HDFS把硬件出错看作一种常态,设计了错误恢复机制。
实例:
* 利用hadoop 的java api检测伪分布式文件系统HDFS上是否存在某个文件?
准备工作:在Ubuntu系统中安装和配置Eclipse第二步:编写实现代码
在所在项目中加载jar包,具体操作如下:在所选的Eclipse项目(Dblab)上右键点击—>弹出菜单中选择>Properties—>Java Build Path—>Libraries—>Add External JARS
下面编写一个简单的程序来测试伪分布式文件系统HDFS上是否存在input.txt文件?
第一步:放置配置文件到当前工程下面
需要把集群上的core-site.xml和hdfs-site.xml(这两文件存在/hadoop/etc/hadoop目录
下)放到当前工程项目下,即eclipse工作目录的bin文件夹下面
第二步:编写实现代码
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
public class Chapter3 {
public static void main(String[] args) {
try {
String filename = "hdfs://localhost:9000/user/hadoop/test.txt";
Configuration conf = new Configuration();
FileSystem fs = FileSystem.get(conf);
if(fs.exists(new Path(filename))){
System.out.println("文件存在");
}else{
System.out.println("文件不存在");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
* 如何获取jar包
Java API所在的jar包都在已经安装好的hadoop文件夹里,路径:/usr/local/hadoop/share/hadoop(如果读者安装的hadoop不在此目录,请找到jar包所在的文件夹)