写在前面
大家好,这里是立志于在有生之年看到并参与通用人工智能开发工作的Nobody,由于最近在公司要经常性地接触大数据工具,所以打算开一个大专栏对大数据工具进行学习总结整理。之前我们过完了MySQL的基础部分和进阶部分,我们现在来到了大数据工具的Hadoop。由于最近有点忙,好久没更新了555。这段时间尽量两到三天更新一篇。
以下为该部分的前置博客
大数据闯关之Hadoop篇(一):大数据概述
一、Hadoop集群启动
- format(格式化操作):首次启动HDFS时,必须对其进行格式化操作,format本质上是初始化工作,进行HDFS清理和准备工作
hdfs namenode -format
- Hadoop集群启停命令:shell脚本一键启停,在node1上,使用软件自带的shell脚本一键启动
- HDFS集群:start-dfs.sh stop-dfs.sh
- YARN集群:start-yarn.sh stop-yarn.sh
- Hadoop集群:start-all.sh stop-all.sh
我们可以启动一下Hadoop集群,并且输入jps看一下进程是否正常开启

为了保证三台机器正常启动,node1、node2和node3的进程在启动后如下



- Hadoop启动日志路径:/export/server/hadoop-3.3.0/logs
- shell命令操作
- hadoop fs -mkdir /itcast:在hadoop中创建文件夹itcast
- hadoop fs -put zookeeper.out /itcast:上传文件
- hadoop fs -ls
- 执行Hadoop官方自带的Map Reduce案例,计算圆周率Π的值
cd /export/server/hadoop-3.3.0/share/hadoop/mapreduce/
hadoop jar hadoop-mapreduce-examples-3.3.0.jar pi 2 2

可以看到得到了一个结果,由于给的数字太小,计算不准确,但是能够成功运行了!
二、HDFS工作流程
- HDFS分布式文件系统基础
- 文件系统是一种存储和组织数据的方法,实现了数据的存储、分级组织、访问和获取等操作,使得用户对文件访问和查找变得容易
- 数据:指存储的内容本身,这些数据底层最终是存储在磁盘等存储介质上的
- 元数据(记录数据的数据):一般指文件大小、最后修改时间、底层存储位置、属性、所属用户、权限等信息
- 分布式存储系统核心属性
- 分布式存储:解决数据量大、单机存储遇到瓶颈的问题
- 元数据记录:解决文件分布在不同机器上不利于寻找的问题
- 分块存储:解决文件过大导致单机存不下,上传下载效率低的问题
- 副本:解决硬件故障数据丢失的问题
- HDFS:
- HDFS主要是解决大数据如何存储问题的。分布式意味着HDFS是横跨在多台计算机上的存储系统
- HDFS是一种能够在普通硬件上运行的分布式文件系统,它是高度容错的,适应于具有大数据的应用程序,它非常适合存储大型数据
- HDFS使用多台计算机存储文件,并且提供统一的访问接口。
- HDFS设计目标:
- HDFS可能有成百上千的服务器组成,每一个组件都有可能出现故障。因此故障检测和自动快速回复是HDFS的核心架构目标
- HDFS上的应用主要是以流式读取数据。相较于数据访问的反应时间,更注重数据访问的高吞吐量
- HDFS重要特性
错误!未指定文件名。
- 主从架构
- HDFS集群是标准的master/slave主从架构集群
- 一般一个HDFS集群是有一个Namenode和一定数目的Datanode组成
- Namenode是HDFS主节点,Datanode是HDFS从节点,两种角色各司其职,共同协调完成分布式的文件存储服务
- 分块存储
- HDFS中的文件在物理上是分块存储的,默认大小是128M
- 副本机制
- 文件的所有block都有副本
- 副本数默认是3,连同本身总共3份副本
- 元数据记录:记录数据的数据
- 文件自身属性信息:文件名称、权限、修改时间等
- 文件块位置映射信息:记录文件块和DataNode之间的映射信息
- 抽象统一的目录树结构
- 数据块存储
- 文件的各个block的具体存储管理由DataNode节点承担
- 每个block都可以在多个DataNode上存储
- 各角色职责介绍
- Namenode:HDFS分布式文件系统的核心,架构中的主角色。维护和管理文件系统元数据,包括名称空间目录树结构、文件和块的位置信息、访问权限等信息
- SecondaryNamenode:充当Namenode的辅助节点,主要是帮助主角色进行元数据文件的合并动作
- Datanode:HDFS的从角色,负责具体的数据块存储
- 写数据流程

* pipeline管道:HDFS上传文件写数据过程中采用的一种数据传输方式。客户端将数据块写入第一个数据节点,第一个数据节点保存数据之后再将块复制到第二个数据节点,再复制到第三个数据节点(如图4.2和4.3流程所示)。该方式可以充分利用每个机器的带宽,避免网络瓶颈和高延迟时的连接,最小化推送所有数据的延时
* ACK应答响应:ACK即确认字符,在数据通信中,接收方发给发送方的一种传输类控制字符,表示发来的数据已确认接收无误。在pipeline管道传输数据的过程中,传输的反方向会进行ACK校验(如图5.1和5.2所示)
* 默认3副本存储策略:
* 第一个副本:优先客户端本地,否则随机
* 第二块副本:不同于第一块副本的不同机架
* 第三块副本:第二块副本相同机架不同机器
- 写数据整体流程
- HDFS客户端创建对象实例,该对象中封装了与HDFS文件系统操作的相关方法
- 调用对象的create方法,通过RPC请求NameNode创建文件。NameNode执行各种检查判断,检查通过,NameNode就会为本次请求记下一条记录,返回输出流对象给客户端用于写数据
- 客户端通过输出流开始写入数据
- 客户端写入数据时,将数据分为一个个数据包,内部组件请求NameNode挑选出适合存储数据副本的一组DataNode地址。然后通过pipeline管道传输数据
- 在传输的反方向上,通过ACK机制校验数据包传输是否成功
- 客户端完成数据写入后,在输出流上调用close方法关闭
- 向NameNode告知其文件写入文件。因为NameNode已经知道文件由哪些块组成,因此仅需等待最小复制块即可成功返回
三、HDFS的shell操作
- 文件系统协议
- HDFS Shell CLI支持操作多种文件系统,包括本地文件系统、分布式文件系统等
- 具体操作的是什么文件系统取决于命令中文件路径URL中的前缀协议
- 如果没有指定前缀,则会读取环境变量中的fs.defaultFS属性,以该属性值作为默认文件系统
hadoop fs -ls file:/// # 操作本地文件系统
hadoop fs -ls hdfs://node1:8020/ # 操作HDFS分布式文件系统
hadoop fs -ls / # 直接根目录,没有指定协议
hadoop fs -mkdir [-p] <path> # -p会沿着路径创建父路径
hadoop fs -ls [-h] [-R] [<path>] # [-h] 人性化显示文件size [-R] 递归查看
hadoop fs -put [-f] [-p] <localsrc> ... <dst>
# -f 覆盖目标文件 -p 保留访问和修改时间,所有权和权限
# localsrc 本地文件系统,dst 目标文件系统
hadoop fs -cat <src>
hadoop fs -get [-f] [-p] <src> ... <localdst>
hadoop fs -cp [-f] <src> ... <localdst>
hadoop fs -appendToFile <localsrc> ... <dst>
hadoop fs -mv <src> ... <dst>