文章目录
- 前言
- HDFS:Hadoop分布式文件系统
-
- 一、硬件软件准备
- 二、主要内容
- 三、主要目标
- 四、知识要点
- 五、拓展点、未来计划、行业趋势
- 六、总结
- 七、作业
- 总结
前言
HDFS:Hadoop分布式文件系统
一、硬件软件准备
- 安装VMware虚拟化软件
- 安装CentOS 7虚拟机3个
- 安装3节点的hadoop集群
- windows或mac安装IDEA
- windows做好hadoop环境配置
二、主要内容
- hadoop发展历史
- hadoop版本介绍及选择
- hadoop模块简介
- hadoop运行模式
- hadoop架构模块介绍
- hdfs功能详解
三、主要目标
- 理解分布式文件系统
- 理解hdfs架构
- 熟练hdfs基本命令使用
- 掌握hdfs编程
- 理解namenode及secondarynamenode交互
四、知识要点
1. hadoop的起源
-
Apache Lucene是一个文本搜索系统库
-
Apache Nutch作为前者的一部分;Hadoop最早起源于Nutch。
-
Nutch的设计目标是构建一个大型的全网搜索引擎
-
主要包括web爬虫抓取网页、全文检索、查询;
-
但随着抓取网页数量的增加,遇到了严重的可扩展性问题——如何解决数十亿网页的存储和索引问题。
-
-
2003年、2004年谷歌发表的两篇论文为该问题提供了可行的解决方案。
——分布式文件系统(GFS),可用于处理海量网页的存储
——分布式计算框架MAPREDUCE,可用于处理海量网页的索引计算问题。
-
Nutch的开发人员完成了相应的开源实现HDFS(04年)和MAPREDUCE(05年),并从Nutch中剥离成为独立项目HADOOP
-
到2008年1月,HADOOP成为Apache顶级项目(同年,cloudera公司成立),迎来了它的快速发展期。
-
Hadoop作者Doug Cutting
-
狭义上来说,hadoop就是单独指代hadoop这个软件
-
广义上来说,hadoop指代大数据的一个生态圈,包括很多其他的软件
2. hadoop的发展版本介绍
-
0.x系列版本:hadoop当中最早的一个开源版本,在此基础上演变而来的1.x以及2.x的版本
-
1.x版本系列:hadoop版本当中的第二代开源版本,主要修复0.x版本的一些bug等
-
2.x版本系列:架构产生重大变化,引入了yarn平台等许多新特性,也是现在生产环境当中使用最多的版本
-
3.x版本系列:在2.x版本的基础上,引入了一些hdfs的新特性等,且已经发型了稳定版本,未来公司的使用趋势
3. hadoop生产环境版本选择
-
Hadoop三大发行版本:Apache、Cloudera、Hortonworks。
- Apache版本最原始(最基础)的版本,对于入门学习最好。
- Cloudera在大型互联网企业中用的较多。
- Hortonworks文档较好。
-
mapr
-
Apache Hadoop
官网地址:http://hadoop.apache.org/releases.html
下载地址:https://archive.apache.org/dist/hadoop/common/
-
Cloudera Hadoop
官网地址:https://www.cloudera.com
下载地址:http://archive.cloudera.com/cdh5/cdh/5/
- 2008年成立的Cloudera是最早将Hadoop商用的公司,为合作伙伴提供Hadoop的商用解决方案,主要是包括支持、咨询服务、培训。
- 2009年Hadoop的创始人Doug Cutting也加盟Cloudera公司。Cloudera产品主要为CDH,Cloudera Manager,Cloudera Support
- CDH是Cloudera的Hadoop发行版,完全开源,比Apache Hadoop在兼容性,安全性,稳定性上有所增强。
- Cloudera Manager是集群的软件分发及管理监控平台,可以在几个小时内部署好一个Hadoop集群,并对集群的节点及服务进行实时监控。Cloudera Support即是对Hadoop的技术支持。
- Cloudera的标价为每年每个节点4000美元。
- Cloudera开发并贡献了可实时处理大数据的==Impala项目==。
-
Hortonworks Hadoop
官网地址:https://www.cloudera.com
- 现cloudera与hortonworks已合并。
- 2011年成立的Hortonworks是雅虎与硅谷风投公司Benchmark Capital合资组建。
- 公司成立之初就吸纳了大约25名至30名专门研究Hadoop的雅虎工程师,上述工程师均在2005年开始协助雅虎开发Hadoop,贡献了Hadoop80%的代码。
- 雅虎工程副总裁、雅虎Hadoop开发团队负责人Eric Baldeschwieler出任Hortonworks的首席执行官。
- Hortonworks的主打产品是Hortonworks Data Platform(HDP),也同样是100%开源的产品,HDP除常见的项目外还包括了==Ambari==,一款开源的安装和管理系统。
- HCatalog,一个元数据管理系统,HCatalog现已集成到Facebook开源的Hive中。Hortonworks的Stinger开创性的极大的优化了Hive项目。Hortonworks为入门提供了一个非常好的,易于使用的沙盒。
- Hortonworks开发了很多增强特性并提交至核心主干,这使得Apache Hadoop能够在包括Window Server和Windows Azure在内的Microsoft Windows平台上本地运行。定价以集群为基础,每10个节点每年为12500美元。
注意:Hortonworks已经与Cloudera公司合并
4. hadoop的运行模式
1. 本地运行模式
- 无需任何守护进程,所有的程序都运行在同一个JVM上执行。在独立模式下调试MR程序非常高效方便。所以一般该模式主要是在学习或者开发阶段调试使用
2. 伪分布式运行模式
- Hadoop守护进程运行在本地机器上,模拟一个小规模的集群,换句话说,可以配置一台机器的Hadoop集群
- 伪分布式是完全分布式的一个特例。
3. 完全分布式运行模式(开发重点)
- Hadoop守护进程运行在一个集群上,需要使用多台机器来实现完全分布式服务的安装
HDFS进程:
NameNode
SecondaryNameNode
DataNode
YARN进程:
NodeManager
1.完全分布式运行模式:H-A架构,将功能分布到不同节点
2.伪分布式运行模式:在一台机器上,再虚拟化出多个机器,实现集群
3.本地运行模式:同一个JVM中
5. hadoop的架构介绍
- Hadoop由三个模块组成:
- 分布式存储HDFS
- 分布式计算MapReduce
- 资源调度引擎Yarn
-
关键词:
- 分布式
- 主从架构
-
HDFS模块主从架构:
-
namenode:主节点,主要负责集群的管理以及元数据信息管理
-
datanode:从节点,主要负责存储用户数据
-
secondaryNameNode:辅助namenode管理元数据信息,以及元数据信息的冷备份
-
-
Yarn模块:
- ResourceManager:主节点,主要负责资源分配
- NodeManager:从节点,主要负责执行任务
6. 分布式文件系统的理解
- 最直观的理解便是三个臭皮匠,顶个诸葛亮。
- 很多的磁盘加一起就可以装下天下所有的avi
- 类似于你出五毛,我出五毛,我们一起凑一块的效果
- block块
7. hdfs的架构详细剖析
1. 分块存储&机架感知&3副本
问:
上边的文件有几个块,分别是多大?
-
1、分块存储
-
保存文件到HDFS时,会先默认按128M的单位对文件进行切分成一个个block块
-
数据以block块的形式存在HDFS文件系统中
- 在hadoop1当中,文件的block块默认大小是64M
- hadoop2当中,文件的block块大小默认是128M,block块的大小可以通过hdfs-site.xml当中的配置文件进行指定
cd /kkb/install/hadoop-3.1.4/etc/hadoop/
vim hdfs-site.xml
/block
</property> <property> <name>dfs.blocksize</name> <value>134217728</value> </property>
<property> <name>dfs.blocksize</name> <value>块大小 以字节为单位</value><!-- 只写数值就可以 --> </property>
-
hdfs-default.xml参考默认属性
-
面试题:
如果有一个文件大小为1KB,它有几个块?每个块是多大?
类似于有一个水桶可以装128斤的水,但是我只装了1斤的水,那么我的水桶里面水的重量就是1斤,而不是128斤
-
block元数据:
- 每个block块的元数据大小大概为150字节
- 一个1k大小的block与一个128M大小的block的元数据基本相等
- 所以在namenode内存有限的情况下,存储大文件更划算
- hdfs适合存储大文件,不适合存储小文件
-
-
2、3副本存储
- 为了保证block块的安全性,也就是数据的安全性,在hadoop2当中,采用文件默认保存三个副本,我们可以更改副本数以提高数据的安全性
- 在hdfs-site.xml当中修改以下配置属性,即可更改文件的副本数
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
- 3、扩展:机架感知
- 副本存放策略,不同版本稍有区别Replica Placement: The First Baby Steps:
- 比如apache hadoop 2.7.7
- Replica Placement: The First Baby Steps
- 比如apache hadoop 2.8.5
2. 抽象成数据块的好处
-
文件可能大于集群中任意一个磁盘
10T*3/128 = xxx块 10T 文件方式存—–>多个block块,这些block块属于一个文件 -
使用块抽象而不是文件可以简化存储子系统
hdfs将所有的文件全部抽象成为block块来进行存储,不管文件大小,全部一视同仁都是以block块的形式进行存储,方便我们的分布式文件系统对文件的管理
-
块非常适合用于数据备份;进而提供数据容错能力和可用性
3. HDFS架构
-
HDFS集群包括,NameNode和DataNode以及Secondary Namenode。
- NameNode负责管理整个文件系统的元数据,以及每一个路径(文件)所对应的数据块信息。
- DataNode 负责管理用户的文件数据块,每一个数据块都可以在多个datanode上存储多个副本。
- Secondary NameNode用来监控HDFS状态的辅助后台程序,每隔一段时间获取HDFS元数据的快照。最主要作用是辅助namenode管理元数据信息
-
NameNode与Datanode的总结概述
- heartbeat、balancing、replication
4. 扩展
- 块缓存
-
通常DataNode从磁盘中读取块,但对于访问频繁的文件,其对应的块可能被显示的缓存在DataNode的内存中,以堆外块缓存的形式存在。
-
默认情况下,一个块仅缓存在一个DataNode的内存中,当然可以针对每个文件配置DataNode的数量。作业调度器通过在缓存块的DataNode上运行任务,可以利用块缓存的优势提高读操作的性能。
例如:
连接(join)操作中使用的一个小的查询表就是块缓存的一个很好的候选。
用户或应用通过在缓存池中增加一个cache directive来告诉namenode需要缓存哪些文件及存多久。缓存池(cache pool)是一个拥有管理缓存权限和资源使用的管理性分组
- hdfs的文件权限验证
-
hdfs的文件权限机制与linux系统的文件权限机制类似
r:read w:write x:execute 权限x对于文件表示忽略,对于文件夹表示是否有权限访问其内容
如果linux系统用户zhangsan使用hadoop命令创建一个文件,那么这个文件在HDFS当中的owner就是zhangsan
HDFS文件权限的目的,防止好人做错事,而不是阻止坏人做坏事。HDFS相信你告诉我你是谁,你就是谁
hdfs 权限-》kerberos、ranger来做
tree
hdfs 的用户是hadoop,hadoop用户可以上传信息,其它不是hdfs的用户就不能
这样可以防止好人作坏事
[hadoop@localhost install]$ who am I
root pts/1 2021-04-12 09:19 (192.168.153.1)
[hadoop@localhost install]$ ls
apache-zookeeper-3.6.2-bin file1.txt hadoop-3.1.4 jdk1.8.0_141
[hadoop@localhost install]$ hdfs dfs -put file1.txt /
但是如果非hdfs的用户,告诉了hdfs,我是hadoop用户,那么hdfs就无法防止坏人作坏事了,就得限制权限范围
8. hdfs的shell命令操作
- HDFS命令有两种风格:
hadoop fs
开头的hdfs dfs
开头的- 两种命令均可使用,效果相同
1. hdfs常用命令
- 如何查看hdfs或hadoop子命令的帮助信息,如ls子命令
hdfs dfs -help ls
hadoop fs -help ls #两个命令等价
- 查看hdfs文件系统中指定目录的文件列表。对比linux命令ls
hdfs dfs -ls /
hadoop fs -ls /
hdfs dfs -ls -R /
- 在hdfs文件系统中创建文件
hdfs dfs -touchz /edits.txt
- 向HDFS文件中追加内容
hadoop fs -appendToFile edit1.xml /edits.txt #将本地磁盘当前目录的edit1.xml内容追加到HDFS根目录 的edits.txt文件
- 查看HDFS文件内容
hdfs dfs -cat /edits.txt
- 从本地路径上传文件至HDFS
#用法:hdfs dfs -put /本地路径 /hdfs路径
hdfs dfs -put /linux本地磁盘文件 /hdfs路径文件
hdfs dfs -copyFromLocal /linux本地磁盘文件 /hdfs路径文件 #跟put作用一样
hdfs dfs -moveFromLocal /linux本地磁盘文件 /hdfs路径文件 #跟put作用一样,只不过,源文件被拷贝成功后,会被删除
- 在hdfs文件系统中下载文件
hdfs dfs -get /hdfs路径 /本地路径
hdfs dfs -copyToLocal /hdfs路径 /本地路径 #根get作用一样
hdfs dfs -ls /
hdfs dfs -get /edits.txt .
- 在hdfs文件系统中创建目录
hdfs dfs -mkdir /shell
- 在hdfs文件系统中删除文件
hdfs dfs -rm /edits.txt
将文件彻底删除(被删除文件不放到hdfs的垃圾桶里)
how?
hdfs dfs -rm -skipTrash /xcall
- 在hdfs文件系统中修改文件名称(也可以用来移动文件到目录)
hdfs dfs -mv /xcall.sh /call.sh
hdfs dfs -mv /call.sh /shell
- 在hdfs中拷贝文件到目录
hdfs dfs -cp /xrsync.sh /shell
- 递归删除目录
hdfs dfs -rm -r /shell
- 列出本地文件的内容(默认是hdfs文件系统)
hdfs dfs -ls file:///home/hadoop/
- 查找文件
# linux find命令
find . -name 'edit*'
# HDFS find命令
hadoop fs -find / -name part-r-00000 # 在HDFS根目录中,查找part-r-00000文件
- 总结
- 输入hadoop fs 或hdfs dfs,回车,查看所有的HDFS命令
- 许多命令与linux命令有很大的相似性,学会举一反三
- 有用的help,如查看ls命令的使用说明:hadoop fs -help ls
- 绝大多数的大数据框架的命令,也有类似的help信息
2. hdfs的shell命令补充
hdfs
1. hdfs与getconf结合使用
- 获取NameNode的节点名称(可能有多个)
hdfs getconf -namenodes
[hadoop@node01 ~]$ hdfs getconf -namenodes
node01
hdfs getconf -confkey fs.defaultFS
- 获取hdfs最小块信息
hdfs getconf -confKey dfs.namenode.fs-limits.min-block-size
[hadoop@node01 ~]$ hdfs getconf -confKey dfs.namenode.fs-limits.min-block-size
1048576
用相同命令可获取其他的属性值
- 查找hdfs的NameNode的RPC地址
hdfs getconf -nnRpcAddresses
[hadoop@node01 ~]$ hdfs getconf -nnRpcAddresses
node01:8020
2. hdfs与dfsadmin结合使用
- 查看hdfs dfsadmin的帮助信息
hdfs dfsadmin
- 同样要学会借助help查看具体命令的帮助信息
hdfs dfsadmin -help safemode
- 查看当前的模式
hdfs dfsadmin -safemode get[hadoop@node01 ~]$ hdfs dfsadmin -safemode getSafe mode is OFF
- 进入/退出安全模式
hdfs dfsadmin -safemode enter # 进入安全模式 只能读,不能修改,也不能上传hdfs dfsadmin -safemode leave #退出安全模式
3. hdfs与fsck结合使用
fsck指令显示HDFS块信息
hdfs fsck /02-041-0029.mp4 -files -blocks -locations # 查看文件02-041-0029.mp4的块信息
[hadoop@node01 ~]$ hdfs fsck /edits.txt -files -blocks -locations
4. 其他命令
- 检查压缩库本地安装情况
hadoop checknative
- 格式化名称节点(慎用,一般只在初次搭建集群,使用一次;格式化成功后,不要再使用)
元数据->nameNode内存->format初次搭建,我们并没有将数据放入内存,所以初次格式化就没有问题但是如果后面将数据存入后,还进行格式化,那么内存的数据就会被清理掉,无法恢复了
hadoop namenode -format
- 执行自定义jar包
[hadoop@node01 common]$ cd /kkb/install/hadoop-3.1.4/share/hadoop/mapreduce/[hadoop@node01 mapreduce]$ lltotal 5604-rw-r--r-- 1 hadoop hadoop 622498 Jul 21 2020 hadoop-mapreduce-client-app-3.1.4.jar-rw-r--r-- 1 hadoop hadoop 803991 Jul 21 2020 hadoop-mapreduce-client-common-3.1.4.jar-rw-r--r-- 1 hadoop hadoop 1656561 Jul 21 2020 hadoop-mapreduce-client-core-3.1.4.jar-rw-r--r-- 1 hadoop hadoop 215337 Jul 21 2020 hadoop-mapreduce-client-hs-3.1.4.jar-rw-r--r-- 1 hadoop hadoop 45333 Jul 21 2020 hadoop-mapreduce-client-hs-plugins-3.1.4.jar-rw-r--r-- 1 hadoop hadoop 85398 Jul 21 2020 hadoop-mapreduce-client-jobclient-3.1.4.jar-rw-r--r-- 1 hadoop hadoop 1682286 Jul 21 2020 hadoop-mapreduce-client-jobclient-3.1.4-tests.jar-rw-r--r-- 1 hadoop hadoop 126144 Jul 21 2020 hadoop-mapreduce-client-nativetask-3.1.4.jar-rw-r--r-- 1 hadoop hadoop 97155 Jul 21 2020 hadoop-mapreduce-client-shuffle-3.1.4.jar-rw-r--r-- 1 hadoop hadoop 57652 Jul 21 2020 hadoop-mapreduce-client-uploader-3.1.4.jar-rw-r--r-- 1 hadoop hadoop 316383 Jul 21 2020 hadoop-mapreduce-examples-3.1.4.jardrwxr-xr-x 2 hadoop h