一. Hadoop的启动
1. 启动方式
要启动 Hadoop 集群,需要启动 HDFS 和 YARN 两个集群。
注意:首次启动 HDFS 时,必须对其进行格式化操作。本质上是一些清理和准备工作,因为此时的 HDFS 在物理上还是不存在的。
使用命令:
hdfs namenode -format 或者 hadoop namenode -format
关于hdfs的格式化:
首次启动需要进行格式化
- 格式化本质是进行文件系统的初始化从操作,创建一些自己所需要 的文件;
- 格式化之后,集群启动成功,后续再也不需要进行格式化;
- 格式化的操作在 hdfs 的主角色(namenode)所在的机器上操作;
1.1 单节点逐个启动
在主节点上使用以下命令启动 HDFS NameNode:
hadoop-daemon.sh start namenode
在每个从节点上使用以下命令启动 HDFS DataNode:
hadoop-daemon.sh start datanode
在主节点上使用以下命令启动 YARN ResourceManager:
yarn-daemon.sh start resourcemanager
在每个从节点上使用以下命令启动 YARN nodemanager:
yarn-daemon.sh start nodemanager
以上脚本位于$HADOOP_PREFIX/sbin/目录下。如果想要停止某个节点上某个角色,只需要把命令中的 start 改成 stop 即可。
1.2. 脚本一键启动
如果配置了 etc/hadoop/slaves 和 ssh 免密登录,则可以使用程序脚本启动所有 Hadoop两个集群的相关进程,在主节点所设定的机器上执行。
hdfs:$HADOOP_PREFIX/sbin/start-dfs.sh
yarn:$HADOOP_PREFIX/sbin/start-yarn.sh
停止集群:
stop_dfs.sh、stop-yarn.sh
二. HDFS 入门
1.HDFS 基本概念
1.1 HDFS 介绍
HDFS是 Hadoop Distribute File System 的简称,意为:Hadoop 分布式文件系统。是Hadoop核心组件之一,作为最底层的分布式存储服务而存在。分布式文件系统解决的问题就是大数据存储。它们是横跨在多台计算机上的存储系统。分布
式文件系统在大数据时代有着广泛的应用前景,它们为存储和处理超大规模数据提供所需的扩展能力。
1.2 HDFS 设计目标
- 1)硬件故障是常态,HDFS 将有成百上千的服务器组成,每一个组成部分都有可能出现故障。因此故障的检测和自动快速回复是 HDFS 的核心架构目标。
- 2)HDFS 上的应用与一般的应用不同,它们主要是以流式读取数据。HDFS 被设计成适合批量处理,而不是用户交互式的。相较于数据访问的反应时间,更注重数据访问的高吞吐量。
- 3)典型的 HDFS 文件大小是 GB 到 TB 的级别,所以,HDFS 被调整成支持大文件。它应该提供很高的聚合数据带宽,一个集群中支持数百个节点,一个集群中还应该支持千万级别的文件。
- 4)大部分 HDFS 应用对文件要求的是 write-one-read-many 访问模型。一个文件一旦创建、写入、关闭之后就不需要修改了。这一假设简化了数据一致性问题,使高吞吐量的数据访问成为可能。
- 5)移动计算的代价比之移动数据的代价低。一个应用请求的计算,离它操作的数据越近就越高效,这在数据达到海量级别的时候更是如此。将计算移动到数据附近,比之将数据移动到应用所在显然更好。
- 6)在异构的硬件和软件平台上的可移植性。这将推动需要大数据集的应用更广泛地采用 HDFS作为平台。
2.HDFS重要特性
首先,它是一个文件系统,用于存储文件,通过统一的命名空间目录树来定位文件;
其次,它是分布式的,由很多服务器联合起来实现其功能,集群中的服务器有各自的角色。
2.1 master/slave 架构
HDFS 采用 master/slave 架构。一般一个 HDFS 集群是有一个 Namenode 和一定数目的 Datanode 组成。Namenode 是 HDFS 集群主节点,Datanode 是 HDFS 集群从节点,两种角色各司其职,共同协调完成分布式的文件存储服务。
2.2 分块存储
HDFS 中的文件在物理上是分块存储 (bolock)的,块的大小可以通过配置参数来规定,默认大小在 hadoop2.x版本中是128M。
2.3 名字空间(NameSpace)
HDFS 支持传统的层次型文件组织结构。用户或者应用程序可以创建目录,然后将文件保存在这些目录里。文件系统名字空间的层次结构和大多数现有的文件系统类似,用户可以创建、删除、移动或重命名文件。
Namenode 负责维护文件系统的名字空间,任何对文件系统名字空间或属性的修改都将被 Namenode 记录下来。
HDFS 会给客户端提供一个统一的抽象目录树,客户端通过路径来访问文件,形如:
hdfs://namenode:port/dir-a/dir-b/dir-c/file.data
2.4 Namenode 元数据管理
我们把目录结构及文件分块位置信息叫做元数据。
Namenode 负责维护整个hdfs 文件系统的目录树结构,以及每一个文件所对应的 block 块信息(block 的 id,以及现在的datanode 服务器)。
2.5 Datanode 数据存储
文件的各个 block 的具体存储管理由 datanode 节点承担。每一个 block 都可以再多个
datanode 上。Datanode 需要定时向 Namenode 汇报自己持有的 block 信息。存储多个副本(副本数量也可以通过参数设置dfs.replication,默认是3)
2.6 副本机制
为了容错,文件的所有 block 都会有副本。每个文件的 block 大小和副本系数都是可配置的。应用程序可以指定某个文件的副本数目。副本系数可以再文件创建的时候指定。也可以再之后改变。
2.7 一次写入,多次读出
HDFS 是设计成适应“一次写入,多次读出”的场景,且不支持文件的修改。正因为如此,HDFS 适合用来做大数据分析的底层存储服务,并不适合用来做网盘等应用,因为,修改不方便,延迟大,网络开销大,成本太高。
3. HDFS 基本操作
3.1 Shell 命令行客户端
Hadoop提供了文件系统的 shell 命令行客户端,使用方法如下:
hadoop fs <args> 文件系统 shell 包括与 Hadoop 分布式文件系统(HDFS)以及Hadoop支持的其他文件系统(如本地FS,HFTP FS,S3 FS 等)直接交互的各种类似 shell 的命令。所有FS shell 命令都将路径URI作为参数。URI格式为 scheme://authority/path。对于 HDFS,该 scheme 是hdfs,对于本地 FS,该 scheme 是 file 。scheme 和 authority 是可选的。如果未指定,则使用配置中指定的默认方案。
对于 HDFS ,命令示例如下:
hadoop fs -ls hdfs://namenode:host/parent/child
hadoop fs -ls /parent/child fs.defaultFS 中有配置
对于本地文件系统,命令示例如下:
hadoop fs -ls file:///root/
如果使用的文件系统是 HDFS ,则使用 hdfs dfs 也是可以的,此时
hadoop fs \<args\> = hdfs dfs \<args\>
3.2 Shell 常用命令介绍
- -ls
使用方法:hadoop fs -ls [-h] [-k]
功能:显示文件、目录信息。
示例:
hadoop fs -ls /user/hadoop/file1
- -mkdir
使用方法:hadoop fs -mkdir [-p]
功能:在 hdfs 上创建目录,-p表示会创建路径中的各项父目录
示例:
hadoop fs -mkdir -p /user/hadoop/dir1
- -put
使用方法:hadoop fs -put [-f] [-p] [-|…].
功能:将单个 src 或多个 srcs 从本地文件系统复制到目标文件系统。
-p:保留访问和修改时间,所有权和权限
-f :覆盖目的地(如果已经存在)
示例:
hadoop fs -put -f localfile1 localfile2 /user/hadoop/hadoopdir
- -get
使用方法:hadoop fs -get [-ignorecrc] [-crc] [-p] [-f]
-ignorecrc:跳过对下载文件的 CRC 检查
-crc:为下载的文件写 CRC 校验和
功能:将文件复制到本地文件系统。
示例:
hadoop fs -get hdfs://host:port/user/hadoop/file localfile
- -appendToFile
使用方法:hadoop fs -appendToFile …
功能:追加一个文件到已经存在的文件末尾
示例:
hadoop fs -appendToFile localfile /hadoop/hadoopfile
- -cat
使用方法:hadoop fs -cat [-ignoreCrc] URI [URI …]
功能:显示文件内容到 stdout
- -tail
使用方法:hadoop fs -tail [-f] URI
功能:将文件的最后一千字节内容显示到 stdout
- -f : 选项将在文件增长时输出附加数据
示例:
hadoop fs tail /hadoop/hadoopfile
- -chgrp
使用方法:hadoop fs -chgrp [-R] GROUP URI [URI …]
功能:更改文件组的关联。用户必须是文件的所有者,否则是超级用户
- -chmod
功能:改变文件的权限,使用 -R 将使改变在目录结构下递归进行。
示例:
hadoop fs -chmod 666 /hadoop/hadoopfile
- -chown
功能:改变文件的拥有者。使用 -R 将使改变在目录架构下递归进行。
示例:
hadoop fs -chown someuser:somegrp /hadoop/hadoopfile
- -copyFromLocal
使用方法:hadoop fs -copyFromLocal URI
功能:从本地文件系统中拷贝文件到 hdfs 路径去
示例:
hadoop fs -copyFromLocal /root/1.txt /
- -copyToLocal
功能:从hdfs 拷贝到 本地
示例:
hadoop fs -copyToLocal /aaa/jdk.jar.gz
- -cp
功能:从hdfs 的一个路径拷贝 hdfs 的另一个路径
示例:
hadoop fs -cp /aaa/jdk.tar.gz /bbb/jdk.tar.gz.2
- -mv
功能:在 hdfs 目录中移动文件
示例:
hadoop fs -mv /aaa/jdk.tar.gz
- -getmerge
功能:合并下载多个文件
示例:比如 hdfs 的目录 /aaa/ 下有多个文件:log.1,log.2,log.3,…
hadoop fs -getmerge /aaa/log.* ./log.sum
- -rm
功能:删除指定的文件。只删除非空目录和文件。-r 递归删除。
示例:
hadoop fs -rm -r /aaa/bbb/
- -df
功能:统计文件系统的可用空间信息
示例:
hadoop fs -df -h /
- -du
功能:显示目录中所有文件大小,当只指定一个文件时,显示此文件的大小
示例:
hadoop fs -du /user/hadoop/dirl
- -setrep
功能:改变一个文件的副本系数。-R 选项用于递归改变目录下所有文件的副本系数
示例:
hadoop fs -setrep -w 3 -R /user/hadoop/dirl