-
Nutch
- Hadoop最早起源于Nutch。
- Nutch的设计目标是构建一个大型的全网搜索引擎,包括网页抓取、索引、查询等功能
- 但随着抓取网页数量的增加,遇到了严重的可扩展性问题——如何解决数十亿网页的存储和索
引问题。
-
Google
- 2003年、2004年谷歌发表的两篇论文为该问题提供了可行的解决方案。
- GFS : Google File System
- MapReduce :数据计算的方法
-
Doug cutting 花费了自己的两年业余时间,将论文实现了出来
- 2008年1月,HADOOP成为Apache顶级项目
-
Hadoop
狭义上来说,hadoop就是单独指代hadoop这个软件,
- 广义上来说,hadoop指代大数据的一个生态圈,包括很多其他的软件
- 广义上来说,hadoop指代大数据的一个生态圈,包括很多其他的软件
http://hadoop.apache.org/
Hadoop Model- Hadoop Common 基础型功能
- Hadoop Distributed File System 负责存放数据
- Hadoop YARN 负责资源的调配
- Hadoop MapReduce 大数据的计算框架
- Hadoop Ozone 数据存放到仓库
- Hadoop Submarine 机器学习引擎
- FS File System
- 文件系统是基于硬盘之上的一个文件管理系统的工具
- 我们用户 *** 作文件系统可以和硬盘进行解耦
- DFS Distributed FileSyetem
- 分布式文件系统
- 管理网络中跨多台计算机存储的文件系统称为分布式文件系统
- 将我们的数据存放在多台电脑上存储
- 分布式文件系统有很多,HDFS(Hadoop Distributed FileSyetem)是Hadoop自带的分布式文件系统
- HDFS是Map Reduce计算的基础
- 文件存放在一个磁盘上存在的问题
- 读取效率低
- 如果文件特别大会超出单机的存储范围
- 数据存储的原理
- 不管文件的大小,所有的文件都是由字节数组构成
- 如果我们要切分文件,就是将一个字节数组分成多份
- 我们将切分后的数据拼接到一起,数据还可以继续使用
- 我们需要根据数据的偏移量将他们重新拼接到一起
- 字节数组
- 文件在磁盘真实存储文件的抽象概念
- 数组可以进行拆分和组装,源文件不会收到影响
- 切分数据
- 对字节数组进行切分
- 拼接数据
- 按照数组的偏移量将数据连接到一起,也就是将字节数组连接到一起
- 偏移量
- 当前数据在数组中的相对位置,可以理解为下标
- 数组都有对应的索引,可以快速定位数据
-
数据块Block
- 磁盘进行数据 读/写的最小单位
- 在Hadoop 1默认大小为64M,在Hadoop 2及其之后默认大小为128M
- 块这么大是为了最小化寻址开销
- 同一个文件中,每个数据块的大小要一致除了最后一个节点外
- 不同文件中,块的大小可以不一致
- 文件大小不同可以设置不同的块的数量
- HDFS中小于一个块的大小的文件不会占据整个块的空间
- 真实情况下,会根据文件大小和集群节点的数量综合考虑块的大小
- 数据块的个数=Ceil(文件大小/每个块的大小)
-
拆分的数据块需要等大
- 数据计算的时候简化问题的复杂度(否则进行分布式算法设计的时候会因为数据量不一很难设计)
- 数据拉取的时候时间相对一致
- 通过偏移量就知道这个块的位置
- 相同文件分成的数据块大小应该相等
-
注意事项
- 只要有任意一个块丢失,整个数据文件被损坏
- HDFS中一旦文件被存储,数据不允许被修改
- 修改会影响偏移量
- 修改会导致数据倾斜
- 修改数据会导致蝴蝶效应
- 但是可以被追加(一般不推荐)
- 追加设置需要手动打开
- 一般HDFS存储的都是历史数据.所以将来Map Reduce都用来进行离线数据的处理
- 块的大小一旦文件上传之后就不允许被修改
- 128M-512M
- 只要有任意一个块丢失,整个数据文件被损坏
- 肯定要对存储数据做备份
- HDFS是直接对原始数据进行备份的,这样能保证回复效率和读取效率
- 备份的数据肯定不能存放在一个节点上,使用数据的时候可以就近获取数据
- 备份的数量要小于等于节点的数量
- 每个数据块默认会有三个副本,相同副本是不会存放在同一个节点上
- 副本的数量可以变更
- 可能近期数据被分析的可能性很大,副本数可以多设置几个
- 后期数据很少被分析,可以减少副本数
- 需要专门给节点进行分工
- 存储 DataNode
- 记录 NameNode
- 日志 Secondary NameNode
- 优点
- 1)高容错性
- 保存多个副本,并且提供容错机制.
- 副本丢失或宕机自动恢复,默认存3份
- 2)运行在廉价的机器上(商用机)
- 通过副本提高可靠性
- 提供了容错和恢复机制
- 3)适合批量处理
- 移动计算而非数据
- 数据位置暴漏给计算框架,NameNode上有位置
- 4)适合大数据的处理
- TB,甚至PB级数据
- 百万规模以上的文件数量
- 10K+的节点规模
- 5)流式数据访问
- 一次写入,多次读取,高吞吐量所以可以同时处理大量数据
- 1)高容错性
- 缺点
- 1)不擅长低延迟数据访问;比如毫秒级
- 2)不擅长小文件的分区
- 占用NameNode大量内存
- 磁盘寻道时间超过读取时间
- 3)不擅长并发写入,文件随机修改
- 一个文件只能有一个写入者
- 仅支持append也就是追加(有组件实现删等)
[root@node01 ~]# tar -zxvf hadoop-3.1.2.tar.gz [root@node01 ~]# mv hadoop-3.1.2 /opt/yjx/修改集群环境
[root@node01 ~]# cd /opt/yjx/hadoop-3.1.2/etc/hadoop/ [root@node01 hadoop]# vim hadoop-env.sh
##直接在文件的最后添加 export JAVA_HOME=/usr/java/jdk1.8.0_231-amd64 export HDFS_NAMENODE_USER=root export HDFS_DATANODE_USER=root export HDFS_SECONDARYNAMENODE_USER=root修改配置文件
-
[root@node01 ~]# cd /opt/yjx/hadoop-3.1.2/etc/hadoop/ [root@node01 hadoop]# vim core-site.xml
fs.defaultFS hdfs://node01:9000 hadoop.tmp.dir /var/yjx/hadoop/full -
[root@node01 hadoop]# vim hdfs-site.xml
dfs.namenode.secondary.http-address node02:50090 dfs.namenode.secondary.https-address node02:50091 dfs.replication 2 -
[root@node01 hadoop]# vim workers
node01 node02 node03
将配置好的软件发到其他两台主机
[root@node02 ~]# scp -r root@node01:/opt/yjx/hadoop-3.1.2 /opt/yjx/ [root@node03 ~]# scp -r root@node01:/opt/yjx/hadoop-3.1.2 /opt/yjx/修改环境变量
-
[123]# vim /etc/profile 三台主机都需要修改
export HADOOP_HOME=/opt/yjx/hadoop-3.1.2 export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
-
重新加载三台主机的环境变量[123]# source /etc/profile
-
[root@node01 yjx]# hdfs namenode -format
-
启动[root@node01 yjx]# start-dfs.sh
Starting namenodes on [node01]Last login: Fri Oct 30 21:32:11 CST 2020 from 192.168.58.1 on pts/0node01: Warning: Permanently added 'node01,192.168.58.101' (ECDSA) to the list of known hosts.Starting datanodesLast login: Fri Oct 30 22:06:12 CST 2020 on pts/0node03: Warning: Permanently added 'node03,192.168.58.103' (ECDSA) to the list of known hosts.node02: Warning: Permanently added 'node02,192.168.58.102' (ECDSA) to the list of known hosts.node01: Warning: Permanently added 'node01,192.168.58.101' (ECDSA) to the list of known hosts.node03: WARNING: /opt/yjx/hadoop-3.1.2/logs does not exist. Creating.node02: WARNING: /opt/yjx/hadoop-3.1.2/logs does not exist. Creating.Starting secondary namenodes [node02]Last login: Fri Oct 30 22:06:14 CST 2020 on pts/0node02: Warning: Permanently added 'node02,192.168.58.102' (ECDSA) to the list of known hosts.
-
访问http://node01:9870 node01替换成IP地址
-
如果出以下下页面代表成功
-
[root@node01 ~]# stop-dfs.sh
Stopping namenodes on [node01]Last login: Fri Oct 30 22:06:20 CST 2020 on pts/0node01: Warning: Permanently added 'node01,192.168.58.101' (ECDSA) to the list of known hosts.Stopping datanodesLast login: Fri Oct 30 22:16:34 CST 2020 on pts/0node03: Warning: Permanently added 'node03,192.168.58.103' (ECDSA) to the list of known hosts.node02: Warning: Permanently added 'node02,192.168.58.102' (ECDSA) to the list of known hosts.node01: Warning: Permanently added 'node01,192.168.58.101' (ECDSA) to the list of known hosts.Stopping secondary namenodes [node02]Last login: Fri Oct 30 22:16:35 CST 2020 on pts/0node02: Warning: Permanently added 'node02,192.168.58.102' (ECDSA) to the list of known hosts.
-
关机拍摄快照
-
元数据
-
stat命令,查看元数据信息(描述文件的属性)
-
File 文件名 Size 文件大小(字节) Blocks 文件使用的数据块总数 IO Block 数据块的大小 regular file:文件类型(常规文件) Device 设备编号 Inode 文件所在的Inode links 硬链接次数 Access 权限 Uid 属主id/用户 Gid 属组id/组名 Access Time:简写为atime,表示文件的访问时间。当文件内容被访问时,更新这个时间 Modify Time:简写为mtime,表示文件内容的修改时间,当文件的数据内容被修改时,更新这个 时间。 Change Time:简写为ctime,表示文件的状态时间,当文件的状态被修改时,更新这个时间,例 如文件的链接数,大小,权限,Blocks数。
-
-
文件数据
- 文件的真实数据,文件真正存放的内容,这个数据就是存储在硬盘上的二进制数据
- 接受客户端的读写服务
- NameNode存放文件与Block的映射关系
- NameNode会记录Block与DateNode的映射关系,但是不会持久化
- 保存文件的元数据信息
- 文件的归属
- 文件的权限
- 文件的大小时间
- Block信息,但是Block的位置信息不会持久化,需要每次开启集群的时候DataNode上报
- 收集Block的信息
- 系统启动时
- NameNode关机的时候式不会存储任意的Block与DataNode的映射信息
- DataNode启动的时候,会将自己节点上存储的Block信息汇报给NameNode
- NameNode接受请求之后重新生成新的映射关系
- 如果某个数据块的副本数小于设置数,那么NameNode会将这个副本拷贝到其他节点
- 集群运行中
- NameNode与DataNode保持心跳机制,三秒钟发送一次
- 如果客户端需要读取或者上传数据的时候,NameNode可以知道DataNode的健康情况
- 可以让客户端读取存活的DataNode节点
- 系统启动时
- 当集群关机时
- 元数据,文件与块的映射会被实例化到硬盘上,但是Block与DataNode的映射不会存放到硬盘
- 为了保证每个Block对应的DataNode都是有效的,所以每次集群启动的时候,DataNode会向NameNode汇报当前节点所拥有的有效节点
- 如果DataNode超过三秒没有心跳,就认为DataNode出现异常
- 不会让新的数据读写到DataNode
- 客户访问的时候不提供异常节点的地址
- 如果DataNode超过10分钟+30秒没有心跳,那么NameNode会将当前DataNode存储的数据转存到其他节点
- 超时时长的计算公式为: timeout = 2 * heartbeat.recheck.interval + 10 *
dfs.heartbeat.interval。 而默认的heartbeat.recheck.interval 大小为5分钟,
dfs.heartbeat.interval默认为3秒。
- 超时时长的计算公式为: timeout = 2 * heartbeat.recheck.interval + 10 *
- NameNode为了效率,将所有的 *** 作都在内存中完成
- NameNode不会和磁盘进行任何的数据交换
- NameNode不会和磁盘进行任何的数据交换
- 存放的是文件的数据信息和验证文件完整性的校验信息
- 数据会存放在硬盘上
- 1m=1条元数据;1G=1条元数据
- NameNode非常排斥存储小文件,一般小文件在存储之前需要进行压缩
- 汇报
- 启动时
- 汇报之前先验证Block文件是否被损坏
- 向NameNode汇报当前DataNode上Block的信息
- 运行中
- 向NameNode保持心跳机制
- 客户可以向DataNode读写数据
- 启动时
- 当客户端读写数据的时候,首先去NameNode查询file与Block与DataNode的映射
- 然后客户端直接与DataNode建立连接,然后读写数据
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)