良いプログラマビッグデータ学習ルート共有 HDFSの研究の概要、 HDFSの導入
HDFS(Hadoopの分散ファイルシステム)分散ファイルシステムでは、あるHadoopのコアサブプロジェクト。
設計:分散サーバの多数に格納されている大規模なファイル、ドキュメントの大量、分割統治の形態を取る大規模なデータ操作を分析するためです。
HDFS 重要な特性
1. HDFSのファイルを物理的** ブロックストレージ**(ブロック)、ブロック・サイズはパラメータ設定することができます(dfs.blocksize)に指定され、デフォルトのサイズのhadoop2.x あるバージョン128M 、古いバージョンそれは64M
2. HDFSのファイルシステムは、クライアントに提供します** 統一抽象ツリー** パスでファイルにアクセスするクライアントを
3. ** ディレクトリ構造とファイルブロック情報(メタデータ)** によって管理名前ノード負担ノード
4. 各ファイルブロックストレージ管理のデータノード媒介ノード
5. HDFSは、シーンの多くを読んで、一回の書き込みに対応するように設計されており、ファイルの変更をサポートしていません。
HDFSの利点
1. 高い信頼性
Hadoopの強いビット・データ記憶及び処理能力によって
2. 高いスケーラビリティ
Hadoopのは、計算タスクに利用可能なコンピュータクラスタを完了するために、データを割り当てられ、
3. 効率
Hadoopのは、動的にノード間でデータを移動させることができ、各ノードは動的バランスを確保するため
4. 高い耐障害性
Hadoopが自動的に複数のコピーを保存することができ、かつ自動的にタスクが失敗します再割り当てすることができます
HDFSの欠点
1. 低遅延アクセスに適していない、すぐにアクセスすることはできません
HDFSは単一であるマスター、それを通過するファイルに対するすべての要求、ときに長い時間のための要求は、確かにそこに延期されます。これは、一定時間内に大量のデータを書き込んで、高スループットのシナリオに適しています
2. 効率的に小さなファイルを大量に保存することができません
小さなファイルの多くを保存、それはかかります名前ノード、ファイルを保存するために多くのメモリをディレクトリ、情報を遮断する(メタデータ)
3. オンライトマルチユーザ任意の修正されたファイルをサポートしていません。
データのみのサポートのappend(追加)、ファイルを変更する自由をサポートしていませんが
以下のための HDFSの可能な改善の欠点
1. 多Master设计,正在研发中的GFS II也要改为分布式多Master设计,还支持Master的Failover,而且Block大小改为1M,有意要调优处理小文件。(Alibaba DFS的设计,也是多Master设计,它把Metadata的映射存储和管理分开了,由多个Metadata存储节点和一个查询Master节点组成。)
2. 使用缓存或多master设计可以降低client的数据请求压力,以减少延时。
3. 横向扩展,一个Hadoop集群能管理的小文件有限,那就把几个Hadoop集群拖在一个虚拟服务器后面,形成一个大的Hadoop集群。google也是这么干过的。
HDFS的Shell命令
| **-help** 输出命令的手册 |
| :----------------------------------------------------------- |
| **-ls** 显示目录信息 `hadoop fs -ls hdfs://hadoop-server01:9000/` ps:这些参数中,所有的hdfs**路径都可以简写 -->`hadoop fs -ls /` 等同于上一条命令的效果 |
| **-put** 向HDSF上传文件 `hdfs dfs -put 本地文件路径 HDFS文件系统路径` *<易错:记 源路径→目的路径>* |
| **-get** 将HDFS文件系统中的文件下载回来 `hdfs dfs -get HDFS文件系统路径 本地文件系统路径` *<易错>* ps:HDFS有一个和put和get类似的而方法 copyFromlocal 相当于put 和 copyTolocal 相当于 get |
| **-cat** 查看HDFS文件系统中的文件内容 `hdfs dfs -cat HDFS文件系统中文件的路径` ps:不要查看非文件 |
| **-cp** HDFS文件系统中进行复制操作 `hdfs dfs -cp 源HDFS文件系统中的文件路径 目标HDFS文件系统中的路径` |
| **-mv** HDFS文件系统中的文件进行移动操作 `hdfs dfs -mv 源HDFS文件系统中的文件路径 目标HDFS文件系统中的路径` ps: 将源文件移动目标路径,这个命令可允许有多个源路径,此时目标路径必须是一个文件夹(目录)不允许不同的文件系统互相移动文件 |
| **-du** 查看HDFS文件系统中文件的大小 `hdfs dfs -du HDFS文件系统中路径中的一个文件` |
| **-mkdir** 在HDSF系统中创建文件夹 mkdir 创建文件夹 ps:递归创建+`-p` |
| **-rm** 删除HDFS文件系统中的目录或文件 `hdfs dfs -rm HDFS文件系统路径` `hdfs dfs -rm -r HDFS文件系统路径` ps: 只能是单个文件 或 空目录,若参数文件夹中有多个文件 加 -r |
| **-chmod** 更改文件的权限 `hdfs dfs -chmod -R 权限值 HDFS文件系统路径下的文件夹` ps: 所有每三位可以作为一个八进制处理 777是满权限 rwx ,+R之后, 文件夹下的所有子文件和文件夹都会被修改 |
| **-appendTofile** 追加一个文件到已经存在文件的末尾 `hadoop fs -appendTofile ./hello.txt /hello.txt` |
| **-getmerge** 合并下载多个文件 `hadoop fs -getmerge /aaa/log.* ./log.sum` |
| **-df** 统计文件系统的可用空间信息 `hadoop fs -df -h /` |
| |
HDFS的工作机制
在了解工作机制之前,我们先来看看几个重要角色:
NameNode
1. master,它是一个管理者,维护着整个文件系统的文件目录树
2. 储存数据库(Block)映射信息,保存元数据信息包括:文件的所属权,文件的权限,文件大小,时间(Block列表,Block偏移量),位置信息
3. 主要职责:处理客户端读写请求,收集DateNode汇报的Block列表信息<*不会保存到本地系统中*>
**DateNode**
1. Slave,它是一个从节点,简单理解就是NameNode的奴隶
2. 存储用户的文件块数据
3. 主要职责:定期向NameNode汇报自身所持有的block信息(心跳机制),执行数据块的读/写操作
Secondary NameNode
1. 检查点节点,表面上看SecondaryNameNode是NameNode的备份,实际上SecondaryNameNode的主要作用并不是备份
2. 主要职责:定期合并fsimage和edit log ,并推送给NameNode
问题引入:一个已经 运行十年的集群,最近的fsimage(镜像)是NameNode十年前格式化产生,这么多年的操作日志被edit log(日志)记录已达几百T。那么问题来了,如果我要重启这个集群,这么大日志文件,必定要重启很久,我们的时间并不充裕该 如何解决这个问题?
*<问题提取:只要NameNode不格式化或重新启动,fsimage将保持原始状态,edits会不断的增加 >*
此时我们引入Secondary NameNode, 把PN中的edit log 和fsimage在SN中merge,此时PN还会继续产生新的日志,记录合并和合并期间的操作,合并之后新fsimage会拷贝回PN中,循环上面的操作.以此能保持edit log文件处于比较小的状态,fsimage的时间点也不会太久远
**fsimage是如何产生的呢?**
HDFS系统要开始运行的时候需要先对NameNode进行一次格式化,那么第一次格式化就会产生一个fsimage文件,但是这个文件是个空文件,NameNode启动的时候会加载fsimage 然后执行edit log加载到内存中,然后立刻向磁盘中写一个新的fsimage文件,这个fsimage就是一个最新的储存信息
**紧急情况时,可以辅助恢复NameNode**
namenode和secondary namenode的工作目录存储结构完全相同,所以,当namenode故障退出需要重新恢复时,可以从secondary namenode的工作目录中将fsimage拷贝到namenode的工作目录,以恢复namenode的元数据
HDFS读写数据流程
HDFS读数据流程
简单版本
客户端将要读取的文件路径发送给namenode,namenode获取文件的元信息(主要是block的存放位置信息)返回给客户端,客户端根据返回的信息找到相应datanode逐个获取文件的block并在客户端本地进行数据追加合并从而获得整个文件