Hadoop简介
是Apache的顶级项目,是一个可靠的、可扩展的、支持分布式计算的开源
项目。
起源
创始人:Doug Cutting 和Mike
2004 Doug和Mike创建了Nutch - 利用通用爬虫爬取了互联网上的所有数
据,获取了10亿个网页数据 - 10亿个网页数据是非结构化数据,就意味
着这些数据是无法存储到数据库中
Doug发现了Google在2003年发表的一篇论文:《Google File System》,设计
了NDFS - Nutch Distributed File System解决了Nutch的存储问题
Doug发现了Google在2003年发表的另一篇论文:《Google MapReduce》,
这篇论文讲述了Google分布式系统的中的计算问题,Doug根据这篇论文设
计了MapReduce
后来,从Nutch0.8版本开始,就将NDFS和MapReduce模块独立出来成为了
Hadoop,并且将NDFS更名为HDFS
Doug带着Hadoop去了Yahoo,在Yahoo期间,设计了Pig, Hive, HBase等框架
Yahoo将Hadoop等框架贡献给了Apache
Hadoop:Doug在命名的时候希望用一些无意义的单词,就是为了防止重
名
Hadoop的版本
- Hadoop1.0:HDFS和MapReduce
- Hadoop2.0:完全重构的一套系统,不兼容1.0。包含了
HDFS、MapReduce和Yarn - Hadoop3.0:包含了HDFS、MapReduce、Yarn以及Ozone
Hadoop的模块
- Hadoop Common:基本模块
- Hadoop Distributed File System:HDFS。进行数据的分布式存储
- Hadoop YARN:进行任务调度和节点资源管理
- Hadoop MapReduce:基于Yarn对海量数据进行并行处理
- Hadoop Ozone:基于HDFS进行对象的存储
Hadoop的伪分布式安装
Hadoop的安装方式
- 单机安装。除了MapReduce模块以外,其他的都不能使用
- 伪分布式安装。利用一台主机模拟Hadoop的运行环境,可以使用
Hadoop的所有模块 - 全分布式安装。在真正的集群上去安装Hadoop。
伪分布式的安装
- 关闭防火墙 service iptables stop
vim /etc/sysnconfig/network
更改HOSTNAME,例如
HOSTNAME=hadoop01
source /etc/sysconfig/network - 修改主机名。在Hadoop集群中,主机名中不允许出现_以及-,如果出现
会导致找不到这台主机。
vim /etc/hosts
添加 ip 主机名 ,例如
192.168.60.132 hadoop01 - 更改hosts文件
- 配置免密互通
ssh-keygen
ssh-copy-id 用户名@主机地址,例如
ssh-copy-id root@hadoop01 - 重启计算机 reboot
- 安装jdk
- 解压Hadoop的安装包 tar -xvf hadoop-2.7.1_64bit.tar.gz
- 进入安装目录下的子目录etc下的子目录hadoop cd
hadoop-2.7.1/etc/hadoop - 编辑hadoop-env.sh vim hadoop-env.sh
- 将JAVA_HOME替换为具体的jdk安装目录, 例如
export JAVA_HOME=/home/preSoftware/jdk1.8 - 将HADOOP_CONF_DIR替换为具体的Hadoop的配置目录。例如
export HADOOP_CONF_DIR=/home/software/hadoop-2.7.1/etc/hadoop - 重新生效 source hadoop-env.sh
- 编辑core-site.xml vim core-site.xml
- 添加内容
<!-- 指定HDFS中的管理节点 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop01:9000</value>
</property>
<!-- 指定存储位置 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/home/software/hadoop-2.7.1/tmp</value>
</property>
- 编辑hdfs-site.xml vim hdfs-site.xml
- 添加内容
<!-- hdfs中的复本数量 -->
<!-- 在伪分布式中,复本数量必须为1 -->
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
- 将mapred-site.xml.template复制为mapred-site.xml cp mapred-
site.xml.template mapred-site.xml - 编辑mapred-site.xml vim mapred-site.xml
- 添加内容:
<!-- 在Hadoop的2.0版本中,MapReduce是基于Yarn运行 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
- 配置yarn-site.xml vim yarn-site.xml
- 添加内容
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop01</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
- Hadoop本身是主从结构,配置slaves指定从节点
vim slaves
添加从节点的地址 - 配置环境变量
vim /etc/profile
添加:
export HADOOP_HOME=/home/software/hadoop-2.7.1
export PATH= P A T H : PATH: PATH:HADOOP_HOME/bin:$HADOOP_HOME/sbin
重新生效
source /etc/profile - 格式化数据目录 hadoop namenode -format
- 启动hadoop start-all.sh
- 如果启动成功,可以在浏览器中输入地址:50070访问hadoop的页面
HDFS
本身是用于存储数据的
- 存储数据的节点 - datanode, 管理数据的节点 - namenode
- HDFS存储数据的时候会将文件进行切块,并且给每一个文件块分配
一个递增的编号 - HDFS存储数据的时候会对数据进行备份,每一个备份称之为是一个
复本。在伪分布式下,复本设置为1,但是在全分布式下,复本默认
是3个 - 3个复本是放到不同的datanode中。复本的放置策略 - 机架感知策
略:- 第一个复本:客户端连接的是哪一个datanode,复本就放到哪一
个datanode上 - 第二个复本:要放到另一个机架的datanode上
- 第三个复本:放到和第二个复本同机架的另一个datanode上
- 如果有更多的复本数量,其他的复本随机放到其他的datanode
- 第一个复本:客户端连接的是哪一个datanode,复本就放到哪一
- 如果某一个datanode宕机,那么这个时候namenode就会将这个
datanode上所存放的复本进行复制,保证整个hdfs中有指定的复本数量 - namenode需要管理datanode,namenode中存储管理信息 — 元数据 -
metadata — FileName replicas block-Ids id2host:- 记录文件存储位置 /node01/a.txt
- 记录文件切的块数
- 文件块存储的datanode的地址
/test/a.log,3,{b1,b2},[{b1:[h0,h1,h3]},{b2:[h0,h2,h4]}] — 存储的文件
时a.log文件,存储在/test路径下,复本数量为3,切了2块,编号
为b1,b2,b1存放在h0,h1,h3节点下,b2存放在h0,h2,h4节点下
- datanode主动向namenode发送心跳,保持namenode对datanode的管
理。心跳信息包含:1.节点状态 2.节点存储的数据 - 如果超过10min中,namenode没有收到datanode的心跳,那么就认
为这个datanode已经lost,那么namenode就会将这个lost的datanode
中的数据进行备份
优点
- 支持超大文件:将文件进行切块分别放到不同的节点上
- 检测和快速应对硬件故障:心跳机制
- 流式数据访问
- 简化的一致性模型:只要一个文件块写好,那么这个文件块就不允许
在进行改动,只能读取 - 高容错性:多复本。
- 可构建在廉价机器上:HDFS具有较好的扩展性。
缺点
- 高延迟数据访问:不适合于交互式,也就意味着Hadoop不适合做实
时分析,而是做的离线分析 - 大量的小文件:文件的存储要经过namenode,namenode中要记录元
数据,元数据是存储在内存中。大量的小文件会产生大量的元数据,导
致内存被大量占用,降低namenode的处理效率 - 多用户写入文件、修改文件:在hadoop2.0版本中,不支持修改,但
是支持追加 - 不支持超强的事务
技术细节
Block
HDFS在存储数据的时候是将数据进行切块,分别存储到不同的节点上。
在Hadoop1.0版本中,每一个block默认是64M大小,在Hadoop2.0版本
中,每一个block默认是128M大小
400M - 4 - 其中前3块,每一块是128M,第4块是16M
100M - 1 - 文件块按照实际大小100M存储
好处:
- 利于大文件的存储
- 方便传输
- 便于计算
NameNode
负责datanode的管理以及存储元数据。
元数据存在内存(快速查询)和磁盘(崩溃恢复)中
HDFS的结构中,namenode存在单点问题
fsimage - 存储元数据。但是注意fsimage中的元数据和内存中并不一致,
也就意味着fsimage中的数据并不是实时数据
edits - 存储HDFS的操作
fstime - 记录上一次的更新时间
触发更新的条件:
- 文件大小 — 根据配置文件设置的edits log大小 fs.checkpoint.size 默认
64MB - 定时更新 — 根据配置文件设置的时间间隔:fs.checkpoint.period 默
认3600秒 - 重启hdfs的时候也会触发更新 — 在合并过程中,HDFS不对外提供
写服务,只提供读服务 — 重启hdfs的时候进行的更新阶段 — 安
全模式
安全模式:
- 只能读不能写
- 检查复本数量以及总量 — 导致伪分布式环境下,复本数量必须设
置为1
安全模式:
如果重启hdfs,处于安全模式,等待一会儿,检查完数据都没有问题,
自动退出安全模式
在学习期间,重启hdfs之后如果长期处于安全模式中,说明数据有损
坏: - 强制退出安全模式 hadoop dfsadmin -safemode leave
- 关闭HDFS
- 删除dfs、nm-local-dir、logs
- 重新格式化 hadoop namenode -format
SecondaryNameNode
不是namenode的热备份,而是进行fsimage和edits的合并的
hdfs体系结构
hdfs读取数据
#hdfs写入数据
mr原理
ssn合并流程
上一篇 4.大数据学习之旅——Avro