### 2.1 实验目的 1. 理解HDFS存在的原因; 2. 理解HDFS体系架构; 3. 理解master/slave架构; 4. 理解为何配置文件里只需指定主服务、无需指定从服务; 5. 理解为何需要客户端节点; 6. 学会逐一启动HDFS和统一启动HDFS; 7. 学会在HDFS中上传文件。 ### 2.2 实验要求 要求实验结束时,已构建出以下HDFS集群: 1. master上部署主服务NameNode; 2. Slave1、2、3上部署从服务DataNode; 3. client上部署HDFS客户端。 待集群搭建好后,还需在client上进行下述操作: 1. 在HDFS里新建目录; 2. 将client上某文件上传至HDFS里刚才新建的目录。 ### 2.3 实验原理 #### 2.3.1 分布式文件系统 分布式文件系统(Distributed File System)是指文件系统管理的物理存储资源不一定直接连接在本地节点上,而是通过计算机网络与节点相连。该系统架构于网络之上,势必会引入网络编程的复杂性,因此分布式文件系统比普通磁盘文件系统更为复杂。 #### 2.3.2 HDFS HDFS(Hadoop Distributed File System)为大数据平台其它所有组件提供了基本的存储功能。它具有高容错、高可靠、可扩展、高吞吐率等特征,为大数据存储和处理提供了强大的底层存储架构。 HDFS是一个主/从(master/slave)体系结构,从最终用户的角度来看,它就像传统的文件系统,可通过目录路径对文件执行CRUD操作。由于其分布式存储的性质,HDFS集群拥有一个NameNode和一些DataNodes,NameNode管理文件系统的元数据,DataNode存储实际的数据。 HDFS开放文件系统的命名空间以便用户以文件形式存储数据,秉承“一次写入、多次读取”的原则。客户端通过NameNode和DataNodes的交互访问文件系统,联系NameNode以获取文件的元数据,而真正的文件I/O操作是直接和DataNode进行交互的。 #### 2.3.3 HDFS基本命令 HDFS基本命令格式如下: ~~~ hadoop fs -cmd args ~~~ 其中,cmd为具体的操作,args为参数。 部分HDFS命令示例如下: ~~~ hadoop fs -mkdir /user/trunk #建立目录/user/trunk hadoop fs -ls /user #查看/user目录下的目录和文件 hadoop fs -lsr /user #递归查看/user目录下的目录和文件 hadoop fs -put test.txt /user/trunk #上传test.txt文件至/user/trunk hadoop fs -get /user/trunk/test.txt #获取/user/trunk/test.txt文件 hadoop fs -cat /user/trunk/test.txt #查看/user/trunk/test.txt文件内容 hadoop fs -tail /user/trunk/test.txt #查看/user/trunk/test.txt文件的最后1000行 hadoop fs -rm /user/trunk/test.txt #删除/user/trunk/test.txt文件 hadoop fs -help ls #查看ls命令的帮助文档 ~~~ #### 2.3.4 HDFS适用场景 HDFS 提供高吞吐量应用程序数据访问功能,适合带有大型数据集的应用程序,以下是一些常用的应用场景: 数据密集型并行计算:数据量极大,但是计算相对简单的并行处理,如大规模Web信息搜索; 计算密集型并行计算:数据量相对不是很大,但是计算较为复杂的并行计算,如3D建模与渲染、气象预报和科学计算; 数据密集与计算密集混合型的并行计算,如3D电影的渲染。 HDFS在使用过程中有以下限制: HDFS不适合大量小文件的存储,因NameNode将文件系统的元数据存放在内存中,因此存储的文件数目受限于NameNode的内存大小; HDFS适用于高吞吐量,而不适合低时间延迟的访问; 流式读取的方式,不适合多用户写入一个文件(一个文件同时只能被一个客户端写),以及任意位置写入(不支持随机写); HDFS更加适合写入一次,读取多次的应用场景。 ### 2.4 实验步骤 部署HDFS主要步骤如下: 1. 配置Hadoop的安装环境; 2. 配置Hadoop的配置文件; 3. 启动HDFS服务; 4. 验证HDFS服务可用。 #### 2.4.1 在master服务器上确定存在hadoop安装目录 ~~~ [root@master ~]# ls /usr/cstor/hadoop ~~~ 显示结果如图2-1所示: ![](https://box.kancloud.cn/27a1461414591469905af37c637cd26f_467x239.png) #### 2.4.2 确认集群服务器之间可SSH免密登录 使用ssh工具登录到每一台服务器,执行命令ssh 主机名,确认每台集群服务器均可SSH免密登录。若无法SSH免密登录,请参照实验一的1.4.4节进行配置。 #### 2.4.3 修改HDFS配置文件 (1)设置JDK安装目录 ~~~ 编辑文件“/usr/cstor/hadoop/etc/hadoop/hadoop-env.sh”,找到如下一行: export JAVA_HOME=${JAVA_HOME} 将这行内容修改为: export JAVA_HOME=/usr/local/jdk1.7.0_79/ ~~~ 这里的“/usr/local/jdk1.7.0_79/”就是JDK安装位置,如果不同,请根据实际情况更改。 (2)指定HDFS主节点 编辑文件“/usr/cstor/hadoop/etc/hadoop/core-site.xml”,将如下内容嵌入此文件里最后两行的\<configuration>\\\</configuration>标签之间: ~~~ <property><name>hadoop.tmp.dir</name><value>/usr/cstor/hadoop/cloud</value></property> <property><name>fs.defaultFS</name><value>hdfs://master:8020</value></property> ~~~ (3)拷贝集群配置至其它服务器 在master机上执行下列命令,将配置好的hadoop拷贝至slaveX、client。 ~~~ [root@master ~]# cat ~/data/2/machines slave1 salve2 slave3 client [root@master ~]# for x in `cat ~/data/2/machines` ; do echo $x ; scp -r /usr/cstor/hadoop/etc $x:/usr/cstor/hadoop ; done; ~~~ #### 2.4.4 启动HDFS 在master服务器上格式化主节点: ~~~ [root@master ~]# hdfs namenode -format ~~~ 配置slaves文件,将localhost修改为slave1~3: ~~~ [root@master ~]# vi /usr/cstor/hadoop/etc/hadoop/slaves slave1 slave2 slave3 统一启动HDFS: [root@master ~]#cd /usr/cstor/hadoop [root@master hadoop]# sbin/start-dfs.sh ~~~ #### 2.4.5 通过查看进程的方式验证HDFS启动成功 分别在master、slave1~3四台机器上执行如下命令,查看HDFS服务是否已启动。 ~~~ [root@master sbin]# jps #jps查看java进程 ~~~ 若启动成功,在master上会看到类似的如下信息: ~~~ 6208 NameNode 6862 Jps 6462 SecondaryNameNode ~~~ 而在slave1、slave2、slave3上会看到类似的如下信息: ~~~ 6208 DataNode 6862 Jps ~~~ #### 2.4.6 使用client上传文件 从client服务器向HDFS上传文件。 ~~~ [root@client ~]# hadoop fs -put ~/data/2/machines / ~~~ 执行命令:hadoop fs -ls /,查看文件是否上传成功。 如图2-2所示: ![](https://box.kancloud.cn/f2da8d696e1301f9cd74a258c74eda88_275x49.jpg)