Hadoop入门学习(一)—— HDFS分布式文件系统
一、前言:大数据概述
大数据的核心工作其实就是:从海量的高增长、多类别、低信息密度的数据中挖掘出高质量的结果。
核心工作有三点:大数据存储、大数据计算、大数据传输
大数据软件生态:
存储:Hadoop-HDFS(是使用最为广泛的分布式存储技术)、HBase(使用最为广泛的NoSQL、KV型数据库,是基于HDFS之上构建的)
计算:Hadoop-MapReduce(大数据分布式计算引擎)、Hive(以SQL为开发语言的分布式计算框架、其底层使用了MapReduce)、Spark(基于内存计算的分布式计算系统)、Flink(主要用于实时计算)
传输:Kafka(分布式消息系统)、Flume(流式数据采集工具,可以从非常多的数据源中完成数据采集传输任务)、Sqoop(是一款ETL工具,可以协助大数据体系和关系数据库之间进行数据传输)
二、Hadoop 概述
Hadoop是一个Apache基金会所开发的分布式系统基础架构
主要解决:海量数据的存储和分析计算问题
Hadoop的优势:
(1)高可靠性:Hadoop底层维护多个数据副本,所以即使Hadoop某个计算元素或存储出现故障,也不会导致数据的丢失。
(2)高扩展性:在集群间分配任务数据,可方便的扩展数以干计的节点。
(3)高效性:在MapReduce的思想下,Hadoop是并行工作的,以加快任务处理速度。
(4)高容错性:能够自动将失败的任务重新分配。
Hadoop的功能主要有三个:分布式存储、计算和调度。分别对应三个功能组件:HDFS、MapReduce、YARN
2.1 分布式计算概述
分布式计算模式主要分为两类:分散-汇总模式和中心调度步骤执行模式
分散-汇总模式:将数据分片,多台服务器各自负责一部分数据处理;然后将各自的结果进行汇总处理;最终得到想要的计算结果。(MapReduce)
中心调度步骤执行模式:由一个节点作为中心调度管理者;将任务划分为几个具体步骤(包含数据处理、数据交换、数据汇总等过程);管理者安排每个机器执行任务;最终得到结果数据。(Spark、Flink)
三、Hadoop HDFS 分布式文件系统
3.1 HDFS的基础架构
Hadoop HDFS 是一个典型的中心化模式(主从模式)技术架构。
HDFS有三个角色:
主角色:NameNode(负责管理HDFS整个文件系统,负责管理DataNode,是一个独立的进程)管理HDFS的的名称空间,配置副本策略,管理数据块的映射信息,处理客户端的读写请求,
从角色:DataNode(一个独立进程,主要负责数据的存储)存储实际的数据块,执行数据块的读写操作,
主角色的辅助角色:SecondaryNameNode(一个独立进程,主要帮助NameNode完成元数据整理工作)并非NameNode的热备,当NameNode挂掉的时候,它并不能马上替换NameNode并提供服务。主要工作是辅助NameNode,分担其工作量,比如定期合并Fsimage和Edits(后面会讲),并推送给NameNode。在紧急情况下,可辅助恢复NameNode。
Hadoop集群有三种运行模式:
(1)Local (Standalone) Mode 本地模式,单台服务器,数据存储在Linux本地
(2)Pseudo-Distributed Mode 伪分布式模式,单台服务器,数据存储在HDFS
(3)Fully-Distributed Mode 完全分布式模式,多台服务器,数据存储在HDFS
HDFS的缺点:
3.2 VMware虚拟机部署HDFS集群
1、从Hadoop官网下载安装包
2、上传 & 解压 安装包
安装包目录结构
3、修改Hadoop的配置文件
4、准备数据目录
5、在集群中分发Hadoop文件夹
6、配置环境变量
通过执行命令 source /etc/profile 使环境变量生效
7、格式化整个文件系统
启动hdfs集群后,通过浏览器输入NameNode主机地址:9870,可以查看到hdfs文件系统的管理网页
8、集群时间同步(如果生产环境中服务器不能连接外网,则需要对集群进行时间同步):
1)查看/设置所有节点ntpd服务状态和开机自启动状态
sudo systemctl status ntpdsudo systemctl start ntpdsudo systemctl is-enabled ntpd
2)修改集群主节点的ntp.conf配置文件 sudo vim /etc/ntp.conf
3)修改集群主节点的 etc/sysconfig/ntpd 文件
4)重新启动 ntpd 服务 sudo systemctl start ntpd
5)设置 ntpd 服务开机启动 sudo systemctl enabled ntpd
6)集群其他节点设置(必须使用root账户)
3.3 HDFS的 Shell 操作
3.3.1 进程启停管理
一键启停:
单进程启停:
3.3.2 HDFS文件系统基本信息
HDFS与Linux系统一样,均是以 / 作为根目录的组织形式。
3.3.3 文件系统操作命令
Hadoop提供了两套命令体系:
Hadoop命令(老版用法),用法:hadoop fs [generic options]
hdfs命令(新版本用法),用法:hdfs dfs [generic options]
1、创建文件夹
hadoop fs -mkdir [-p]
hdfs dfs -mkdir [-p]
path 为待创建目录,-p选项会沿着路径创建父目录
2、查看指定目录下内容
hadoop fs -ls [-h] [-R] [...]
hdfs dfs -ls [-h] [-R] [...]
path 指定目录路径,-h显示文件size,-R递归查看指定目录及其子目录
3、上传文件到HDFS指定目录下(从本地Linux 上传到HDFS中)
hadoop fs -put [-f] [-p]
hdfs dfs -put [-f] [-p]
-f 覆盖目标文件(已存在),-p保留访问和修改时间,所有权和权限
本地文件系统(客户端所在机器),目标文件系统(HDFS)
4、查看HDFS文件内容
hadoop fs -cat ...
hdfs dfs -cat ...
读取大文件可以使用管道符配合more,进行翻页查看
hadoop fs -cat | more
hdfs dfs -cat | more
5、下载HDFS文件(下载文件到本地系统文件目录,必须是目录)
hadoop fs -get [-f] [-p]
hdfs dfs -get [-f] [-p]
-f 覆盖目标文件(已存在),-p保留访问和修改时间,所有权和权限
6、拷贝HDFS文件(-f 覆盖目标文件)
hadoop fs -cp [-f] ...
hdfs dfs -cp [-f] ...
7、追加数据到HDFS文件中(将所有给定本地文件的内容追加到给定dst文件;如果dst文件不存在,将创建该文件;如果为- ,则输入为从标准输入中读取)
整个HDFS文件系统的文件修改只支持删除和追加操作
hadoop fs -appendTofile ...
hdfs dfs -appendTofile ...
8、HDFS数据移动操作(移动文件到指定文件夹下,可以使用该命令重命名文件名称)
hadoop fs -mv ...
hdfs dfs -mv ...
9、HDFS数据删除操作(删除指定路径的文件或文件夹)
hadoop fs -rm -r [-skipTrash] URI [URI ...]
hdfs dfs -rm -r [-skipTrash] URI [URI ...]
-skipTrash 跳过回收站,直接删除;URI被删除路径;-r删除文件夹(不加-r删除文件)
官方命令指导文件:
https://hadoop.apache.org/docs/r3.3.4/hadoop-project-dist/hadoop-common/FileSystemShell.html
可以通过WEB界面操作
HDFS权限问题
3.3.4 HDFS客户端
Big Data Tools插件
通过NFS网关将HDFS挂载到本地系统
HDFS提供了基于NFS(Network File system)的插件,可以对外提供NFS网关,供其它系统挂载使用。
NFS 网关支持 NFSv3,并允许将 HDFS 作为客户机本地文件系统的一部分挂载,现在支持:上传、下载、删除、追加内容
3.4 HDFS的API操作(Java编程)
(1)环境准备,将下载的hadoop文件夹放置在开发主机(windows电脑)
(2)配置HADOOP_HOME及路径Path系统环境变量
(3)启动程序
(4)在 IDEA 中创建一个 Maven 工程 HdfsClientDemo,并导入相应的依赖坐标
(5)创建 HdfsClient 类进行测试
3.4.1 API 参数的优先级
参数优先级排序:(1)客户端代码中设置的值 > (2)ClassPath 下的用户自定义配置文件 > (3)然后是服务器的自定义配置(xxx-site.xml) > (4)服务器的默认配置(xxx-default.xml)
3.5 HDFS的存储
3.5.1 HDFS的存储原理(文件块)
分布式存储:每个服务器(节点)存储文件的一部分
问题:文件大小不一,不利于统一管理
解决办法:设定同一的管理单位,block块(HDFS最小存储单位,256MB,可以修改)
问题:如果丢失或损坏了某个block块
解决:通过多个副本(备份)解决,HDFS默认每个block块有2个(可修改)备份,每个副本都存储到其他服务器。(每台主机最多存一份文件,如果副本数设置数大于集群主机数,则只存与集群数相等的副本,若再增加节点,则会再自动创建对应的副本)
这个设置表示总共有3 个block,也就是有两个副本备份
3.5.2 NameNode 元数据
问题:大文件被分成多个block块,hadoop是如何记录和整理文件和block块之间的关系?
这个问题由 NameNode 节点基于一批 edits 文件和一个 fsimage 文件负责整个文件系统的管理和维护。
edits文件:是一个流水账文件,记录了hdfs中的每一次操作,以及本次操作影响的文件其对应的block。随着操作增加,为避免出现超大edits文件,会存在多个edits文件,保证检索性能。
fsimage 文件:对于同一文件的多次操作会进行合并,得到最终结果。将全部edits文件合并后即可得到一个FSImage文件。fsimage 文件记录的是某个时间点下整个文件系统的状态。
元数据的合并是由 SecondaryNameNode 做的,它通过http从NameNode拉取数据,合并完成后在发回NameNode。
查看 fsimage 文件:
查看 edits 文件:
3.5.3 HDFS数据的读写流程
副本存储节点选择(以三个副本为例):
第一个副本在Client所处的节点上。如果客户端在集群外,随机选一个。
第二个副本在另一个机架的随机一个节点
第三个副本在第二个副本所在机架的随机节点
3.5.4 DataNode 的工作机制
一个数据块在 DataNode 上以文件形式存储在磁盘上,包括两个文件,一个是数据本身,一个是元数据(包括数据块的长度,块数据的校验和,以及时间戳)。
3.5.5 数据完整性