接上一章《大数据之------VWare、Ubuntu、CentOs、Hadoop安装配置》,上一篇讲了怎么安装虚拟机、在虚拟机安装Linux系统、以及在Linux系统下安装Hadoop
这一章就开始Hadoop里的三大组件:【HDFS、YARN、MapReduce】
一、Hadoop内部三大组件
既然跟着我们上一章安装配置好了hadoop的话,就可以使用hadoop的HDFS、YARN和MapReduce了,没有安装配置的话请前往这里进行安装配置:大数据之------VWare、Ubuntu、CentOs、Hadoop安装配置_vmware大数据hadoop-CSDN博客 (我暂时只写了单机和伪分布式的Hadoop配置,分布式集群的配置方法以后会更新)
(Hadoop是啥也懒得写了,我上一篇提过,简单看看吧)
二、HDFS是啥
HDFS全称------Hadoop Distributed File System,既【Hadoop分布式文件系统】
那么顾名思义,HDFS就是Hadoop内专门用于处理【数据存储】问题的,是大数据最开始要面对的问题------大量数据如何存储。
前面的文章我也讲到过,大数据最需要解决的两大问题【存储】和【计算分析】,HDFS专门适用于离线数据的存储
下面我放多个图来通俗理解HDFS:
首先HDFS一共三大组件:【NameNode】、【DataNode】、【Secondary NameNode】(也叫2NN)
(专业结构图)
那么这三玩意是干啥的?简单来说:
- 【NameNode】是HDFS的主角色,负责管理整个HDFS系统、以及DataNode
- 【DataNode】是HDFS从角色,负责存储数据
- 【Secondary NameNode】是NameNode的辅助,负责辅助NameNode工作
【NameNode】:你想想假设你现在1个服务器节点有几亿个条岛国视频的数据,通过HDFS分布在几万个【DataNode】上,那每一个【DataNode】里的数据还不同步,你现在想找其中一个《岛国高等数学之导数》不得找到死?
;
那这时就需要用【NameNode】来作为一个【目录】,统一管理【DataNode】并帮你快速找到你要的数据。
;
然后【Secondary NameNode】(又叫2NN),就是一个"备用NameNode",一个"秘书",当【NameNode】崩了,它还能备份【NameNode】的数据,代替它工作。
另外,【NameNode】、【DataNode】、【Secondary NameNode】都是独立进程,互相独立在自己的进程工作。
三、YARN是啥
全称叫:Yet Another Resouce Nigotiator,简称"另一种资源管理器"、"另一种资源协调者",就说Hadoop一种新的资源管理器
------从Hadoop宏观上看:
前面不是说了Hadoop是用来【存储】、【调度】、【计算】数据的嘛,【HDFS】是专门【存储】数据的
那么**【YARN】就是负责【调度】的**,调度啥?为上层服务而调度机器的硬件资源------------【内存】、【CPU】
;
通俗说:上层说"我要啥",YARN就"给啥"
(【磁盘】这个硬件资源是HDFS管理的,不是YARN噢)
------那么从微观来看:
YARN的内部结构由------------【ResourceManager (RM)】、【NodeManager (NM)】、【ApplicationMaster (AM)】、【Container】组成
【ResourceManager (RM)】、【NodeManager (NM)】就有点像HDFS里的【NameNode】和【DataNode】,只不过YARN管理的不是数据,而是【资源的调度】
'
【NodeManager (NM)】管理单个节点的资源(比如4G内存和2个CPU)
;
【ResourceManager (RM)】管理所有节点的资源分配(假如有三个节点【NodeManager (NM)】,每个节点都是4G内存和2个CPU,那他就管理12G内存和6个CPU)
另外再讲一下【ApplicationMaster (AM)】、【Container】
【ApplicationMaster (AM)】就是单个节点【任务】的老大,而【Container容器】就是【ApplicationMaster (AM)】执行的"工作室"。
;
打个比方:一个客户端client需要用Hadoop做点什么事,那YARN就会在其中一个节点生成一个【Container容器】,然后【ApplicationMaster (AM)】在里面执行一些任务
;
还是有人不懂,我们到底需要【Container】干什么?既然一个【NodeManager (NM)】节点里有内存跟CPU了,那就足够支撑一个程序运行了啊,【ApplicationMaster (AM)】直接在【NodeManager (NM)】节点里运行不行吗?
;
这又涉及到一个知识,阿里云的云服务器是如何实现的?阿里云只有那么些有限的服务器机器,是怎么做到能为全世界开发者提供无穷无尽的【云服务器】的?------------>>就是在物理硬件服务器的基础上,通过虚拟技术虚拟出无穷多个【云服务器】,云服务器里有虚拟出来的供程序运行的CPU、内存......
;
那么【Container】就是这么个玩意,他也相当于又一个独立服务器,里面有供【ApplicationMaster (AM)】运行的内存、CPU,当然这些资源也是单个节点内靠【NodeManager (NM)】分配的。
四、MapReduce是啥?
前面说了
Hadoop里的HDFS 是负责**【存储】**
Hadoop里的YARN 是负责**【任务资源调度】**
那么Hadoop里的MapReduce就是负责**【计算】**
MapReduce有两个过程阶段:【Map】和【Reduce】
【Map】阶段就是将海量大数据拆分成若干份小数据,多个程序同时并行计算出自己的结果
【Reduce】阶段就是将【Map】阶段求得的所有结果汇总,最终得到想要的数据结果
上面的解释可能还是比较模糊难懂,我一个人理解举一个通俗的例子:
假设有一个搜索引擎网站希望统计近段时间用户搜索的关键词权重,那不可能放一个服务器里一个程序去计算吧?每天有几千亿条搜索数据呢!
;
那就把他们分散到多个服务器来分别统计,然后各个服务器统计出自己的结果(将数据分解成键值对),然后全部汇总到一个服务器,这部就能得出各个搜索关键词的权重了吗
;
kimi的举例解释:
【总结】
如何看他们的关系?
首先HDFS将【NameNode】部署到一个节点先,分出多个【DataNode】分布到各个节点上,里面分别存储了将总的海量数据分散了的【子数据】,最后还要有一个节点有【Secondary NameNode】来备份【NameNode】的数据
;
接着一个客户端client发布一个任务,比如想从海量数据中找到 "ss1505_wuma.avi" 这个文件数据,这是YARN就开始通过【ResourceManger】分配资源调度,它在每个节点都设置一个【NodeManager】,用来分配管理每个节点的资源调度;然后接到任务后,先在其中一个节点生成一个【Container容器】,里面的【Application Master】就来决定需要多少资源来完成这个任务,然后【ResourceManger】收到【Application Master】的 "诉求",安排小弟【NodeManager】去开辟一块资源(cpu、内存)来给这个任务完成
;
现在MapReduce就开始把海量数据通过【Map阶段】让各个节点来统计计算,有没有这个 "ss1505_wuma.avi" 这个文件数据,最后把所有节点的结果在【Reduce阶段】汇总,得到了这个 "ss1505_wuma.avi" 文件数据,那不仅要在其中一个节点的DataNode保存,还要在【Secondary NameNode】来备份一份。
五、使用HDFS的Shell命令
1、简述"文件系统"是啥
我们的数据存储在计算机里从物理层去看的话,是非常复杂的
(这还是抽象化了的图)
那么【计算机操作系统】中有的一个核心组件叫------------【文件系统】,用于管理计算机中的文件和文件夹。**文件系统是一种用于存储和组织计算机数据的系统,它使得数据的访问和查找变得容易。**
文件系统使用文件和树形目录的抽象逻辑概念代替了硬盘和光盘等物理设备使用数据块的概念。用户使用文件系统来保存数据,不需要关心数据实际保存在硬盘或光盘的哪个地址的数据块上,只需要记住文件的所属目录和文件名。(简单来说就是平时我们在那点击文件夹、点击运行程序、复制粘贴这些操作就是用的【文件系统】)
2、HDFS Shell CLI系统
那么HDFS我们前面讲了,它是Hadoop中用来【存储】数据的
那么文件系统也分很多种,比如Linux系统中的本地文件系统是【file:///】、分布式文件系统是【hdfs://nn:8020】、谷歌文件系统【gfs://nn:8020】、还有什么阿里云文件系统......等等,对于不同的文件系统,是不是也应该有一个统一的系统来统一操控管理呢?
HDFS的HDFS Shell CLI系统就支持多种文件系统的操作(CLI全称command-line interface,中文翻译:命令行界面、命令行接口)
3、开始上手HDFS的Shell命令
1)解决HDFS命令可能出现的问题
HDFS的基本命令有两个:【hadoop fs 具体命令】和【hdfs dfs 具体命令】
那么我们可以测试一下先输入一下【hadoop fs】或【hdfs dfs】看看有没有正确结果
我当时在做我自己学校的实验作业的时候要用【hdfs dfs -mkdir /user/hadoop/testFile】这个命令想在[/user/hadoop/]新建一个[testFile]这么一个文件夹时就报了这么一个错误:
如果出现下面这种"Command 'hdfs' not found"的错误通常意味着:
- 1、Hadoop的客户端工具没有正确安装
- 2、或者Hadoop的可执行文件路径没有添加到系统的PATH环境变量中。
那前面我已经明确自己已经安装了hadoop,那就说明只能是Hadoop的bin目录没有添加到系统的PATH环境变量中。
我们可以通过以下步骤添加:
执行下面命令,用vi编辑器打开你的【~/.bashrc文件】:
vi ~/.bashrc
在文件末尾添加以下行,假设Hadoop安装在/usr/local/hadoop:
export PATH=$PATH:/usr/local/hadoop/bin:/usr/local/hadoop/sbin
使更改生效:
source ~/.bashrc
最后再执行【hadoop fs】或【hdfs dfs】看看有没有正确结果
如果这里步骤还有出错,那就是之前的hadoop的安装配置有问题,另外我虽然用的是Ubuntu,但是CentOs也差不多的,反正都是Linux系统嘛
2)基础语法
【hadoop fs 具体命令】和【hdfs dfs 具体命令】这两语法是等价的
前面我让大家试一下【hadoop fs】或【hdfs dfs】,可以看到结果是一模一样的
【hadoop fs】或【hdfs dfs】的意思就是列出【hadoop fs 具体命令】和【hdfs dfs 具体命令 】这个后面可以拼接上的【具体命令】有哪些
那么在执行这些具体命令之前,一定要确保hadoop已经启动
启动的方式就是先进入【/usr/local/hadoop】路径
;
然后后执行【./sbin/start-dfs.sh】(因为这里我们只执行hdfs,要执行YARN的话就再加个【./sbin/start-yarn.sh】,或者直接一开始就输入【./sbin/start-all.sh】就能两个一起启动)
cd /usr/local/hadoop ./sbin/start-dfs.sh
3)新建文件夹
【hadoop fs -mkdir [在hadoop的文件路径地址/文件夹名]】或【hdfs dfs -mkdir [在hadoop的文件路径地址/文件夹名]】
hadoop fs -mkdir [在hadoop的文件路径地址/文件夹名]
hdfs dfs -mkdir [在hadoop的文件路径地址/文件夹名]
注意这里的[hadoop路径]是针对于HDFS系统的,我们在Linux的文件夹那是看不到的,把hadoop服务启动好之后,我们点开火狐浏览器输入这个网址就能进入到hadoop程序【http://localhost:50070】
;
然后找到【Utilities】的【Browse the file system】
;
然后就可以看到Hadoop的HDFS的文件路径了
;
在输入框输入路径就能看到该路径下的所有文件以及目录
然后我们刚刚命令里【hadoop fs -mkdir [在hadoop的文件路径地址/文件夹名]】,举个例子,假设我现在想在HDFS的根目录下创建一个叫【newFolder】的文件夹,那么就是
hadoop fs -mkdir /newFolder
hdfs dfs -mkdir /newFolder
回到【http://localhost:50070】刷新,就能看到根目录下有一个【newFolder】文件夹了
4)上传
1、-moveFromLocal:从本地剪切粘贴到HDFS
先进入一个本地的路径,用vim编辑器创建一个【.txt文件】,假设我这里就到home目录下的Documents这里新建一个叫 "test.txt" 的文件
然后现在假设我要把本地的这个 "test.txt" 文件,上传到HDFS根目录下的一个 "newFolder" 目录下(刚刚我已经创建好的),那么就执行下面的命令
【hadoop fs -moveFromLocal [文件的路径] [要移动到HDFS哪个路径下]】
hadoop fs -moveFromLocal ./test.txt /newFolder
成功,但是注意,这个命令是【剪切】,本地那边就没这个文件了
2、-copyFromLocal:从本地文件系统中拷贝文件到HDFS路径去(少用了,后面会提)
还是一样的操作,本地新建一个文件
然后用【hadoop fs -copyFromLocal [文件的路径] [要移动到HDFS哪个路径下]】
hadoop fs -copyFromLocal ./test2.txt /newFolder
3、-put等同于-copyFromLocal
那么人们更常用的一般是【-put】来复制拷贝文件,其实它是等于【-copyFromLocal】的
另外
4、-appendToFile:这是在已有的文件基础上追加新的内容
相当于合并两个文件,上一个文件 "test3.txt" 里面我写了这么一段内容
然后我再新建一个叫 "appendToTest3.txt" 文件,然后里面写一段新的内容,用
【hdfs fs -appendToFile [文件路径] [要追加到的文件的路径]】
;
执行追加命令:
hdfs fs -appendToFile ./appendToTest3.txt /newFolder/test3.txt
;
然后刷新,点开test3.txt,并下载下来看一眼里面的内容(hadoop2的界面)
(hadoop3可以直接点右上角【Tail the file】查看内容)
;
追加成功
5)下载
【-copyToLocal】 或**【-get】**(常用这个)
拿刚刚的例子,我们假设把刚刚上传到HDFS的【/newFolder】目录下的【test.txt、text2.txt】分别用**【-copyToLocal】** 或**【-get】**下载到【home目录的Downloads】下
;
【另外】
6)直接操作
因为跟Linux差不多,就不做过多演示,无非就是要在Linux基础上加一个【-】,而且要拼接上【hadoop fs [命令]】或【hdfs dfs [命令]】
【-ls】查看目录下文件
【-cat】查看文件内容
【-chgrp、-chmod、-chown】Limux文件系统中的用法一样,修改文件所属权限
【cp】从HDFS的一个路径拷贝到HDES的另一个路径
【-mv】在HDFS目录中移动文件
【-tail】显示一个文件的末尾(少用,但是偶尔会看一下日志最新的内容会用到)
【-rm】删除1个文件或文件夹
【-rm -r】递归删除目录及目录里面内容,是删这整个文件夹!
【-du】统计文件夹的大小信息
【-du -s -h】看总目录大小
【-du -h】看细分文件大小
【-setrep ?】设置备份几份(你有将来有几个分布式或伪分布式节点,就分发几个数据到别的节点)
当然,这些操作在hadoop3里也可以直接在【localhost:50070】网址进行GUI图形化操作了,只不过人们还是习惯用命令行
暂时先这么多吧,后面的以后再说......