--1. 概念:
海量数据,数据种类多样化,增长速度块,无法使用常规分析管理工具进行管理的数据集合
--2. 特征(4V)
volume: 巨大的数据量
variety: 数据种类多样化
--结构化的数据
--半结构化的数据
--非结构和的数据:网页,视频,音频等,占现在数据量的90%
volecity: 增长速度块
value: 价值密度低
--1.应用案例
预测犯罪,城市规划,远程医疗,预测选举...
--2.发展前景
1)国家的支持
2)数据的价值
3)大数据的产业链
1. 数据采集 : sqoop,flume,datax,kettle
数据源----->采集工具------>存储系统
2. 数据存储:
hdfs,hbase,es等(大数据集的存储)
3. 数据清洗:(去重,去脏)
mapreduce,spark,hive
4. 数据分析:
mapreduce,spark,hive (分析后的数据可能存储到hdfs上,也可能存储mysql等关系型数据库中)
5. 数据展示
BI,webUI界面
数据量非常大所引出的问题
--1. 存储问题和技术瓶颈
--2. 硬件经常故障
--3. 读取数据的准确率
hadoop为了解决上述问题而被开发出来了。
--1. hadoop是apache基金会旗下的一款顶级项目
--2. 用于解决大数据集的存储和计算分析
--3. 是用java语言开发,具有跨平台性
--4. 开源的
--5. 运行在廉价机器(商用硬件,和专业硬件)上,认为机器故障时常态
--6. 利用集群的cpu的并发和计算能力,性能非常高。
--1. Common: hadoop框架的通用模块
--2. hdfs(hadoop distributed fileSystem),hadoop分布式存储文件系统,用于存储大数据集
--3. mapreduce: hadoop的分布式计算框架,提供了移动计算而非移动数据的思想,利用并发提高计算能力。
--4. yarn:hadoop的作业调度与资源管理框架(cpu,磁盘,内存)
--1.《GFS》,2003发表,阐述了大数据集如何存储的问题,引入了分布式思想(一个整体拆成多个子部分,之间提供接口进行调用)
--2.《Mapreduce》,2004发表,阐述了解决分布式文件系统上的大数据集如何快速的分析和计算的问题。
--3.《bigtable》,2006发表,阐述了如何解决非结构化的数据不适合存储在关系型数据库中,提供了另外一种存储思想,NoSQL(not only sql)的概念
--1. 起源于nutch项目,创始人道格·卡丁
--2. ndfs灵感来源于《GFS》
--3. Mapreduce灵感来源于《Mapreduce》
--4. 2006年ndfs和mapreduce单独抽出来形成Hadoop这个项目
------------------
版本:
--1. 社区版本
--2. CDH版本
--3. HDP版本
-- hadoop
-- spark
-- hbase
-- flink
-- zookeeper
-- hive
-- sqoop
-- flume
-- kafka
hdfs是hadoop的核心模块之一,是hadoop分布式文件系统,用于存储大数据集
安装模式:3种
--1. 本地模式: 没有使用分布式文件系统思想,使用的机器的本地文件系统。通常用于测试mr程序
--2. 伪分布式模式:
--与本地模式的相同点,就是都是使用一台机器
--采用分布式思想,相关的守护进程都是独立的,并且都有自己的jvm(内存不共享,各有各的)
--Namenode(名称节点,简称NN,也叫管理节点)
--Datanode(数据节点,简称DN,也叫工作节点)
--secondaryNamenode(辅助节点,简称SNN, 当namnenode宕机后不能充当namenode的决定)
--3. 完全分布式模式:
--与伪分布式模式的区别就是多台机器维护一个HDFS。
--相关的守护进程都是分布在不同的机器上的。
-- 只有一个Namenode
-- 多个Datanode
-- 一个secondaryNamenode
--1. 环境需求: CentOS7.7 JDK1.8+
--2. Hadoop版本: hadoop-2.7.6.tar.gz
--1. 上传,解压,并更名
[root@qianfeng01 ~]# tar -zxvf jdk-8u221-linux-x64.tar.gz -C /usr/local/
[root@qianfeng01 local]# mv jdk1.8.0_221/ jdk
--2. 配置环境变量
[root@qianfeng01 local]# vim /etc/profile
..........省略...........
ulimit -n 65535
#java environment
export JAVA_HOME=/usr/local/jdk
export PATH=$JAVA_HOME/bin:$JAVA_HOME/sbin:$PATH
--3. 重新加载
[root@qianfeng01 local]# source /etc/profile
--4. 验证
[root@qianfeng01 local]# java -version
--1. 上传,解压,并更名
[root@qianfeng01 ~]# tar -zxvf hadoop-2.7.6.tar.gz -C /usr/local/
[root@qianfeng01 local]# mv hadoop-2.7.6/ hadoop
--2. 配置环境变量
[root@qianfeng01 hadoop]# vim /etc/profile
..........省略...........
#HADOOP environment
export HADOOP_HOME=/usr/local/hadoop
export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
--3. 重新加载
[root@qianfeng01 hadoop]# source /etc/profile
--4. 验证
[root@qianfeng01 hadoop]# hadoop version
--1. 在~下创建一个目录:input
[root@qianfeng01 ~]# mkdir input
--2. 将hadoop的etc/hadoop/目录下的所有的xml文件拷贝的input目录下
[root@qianfeng01 ~]# cp /usr/local/hadoop/etc/hadoop/*.xml ./input
--3. 使用hadoop指令运行一个jar文件,测试里面的grep程序,检查xml文件中是否有符合指定正则表达式的字符串,如果有就打印到一个不存在的目录~/output中
[root@qianfeng01 output]# hadoop jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.6.jar grep ./input ./output 'dfs[a-z.]+'
--4.
[root@qianfeng01 ~]# cd output
[root@qianfeng01 output]# ll
-rw-r--r-- 1 root root 11 9月 21 16:08 part-r-00000
[root@qianfeng01 output]# cat part-r-00000
1 dfsadmin
--1. 防火墙确保是关闭的
--2. 网络是畅通的,静态IP,NAT模式
--3. 主机名,和域名映射文件必须配置
--4. 免密登录认证,确保是对localhost免密
--5. Jdk,hadoop的环境变量的配置
1)修改core-site.xml 位置位于:${HADOOP_HOME}/etc/hadoop/
[root@qianfeng01 ~]# vim ${HADOOP_HOME}/etc/hadoop/core-site.xml
<configuration>
<property>
<name>fs.defaultFSname>
<value>hdfs://qianfeng01:8020value>
property>
configuration>
2)修改hdfs-site.xml 位置位于:${HADOOP_HOME}/etc/hadoop/
[root@qianfeng01 ~]# vim ${HADOOP_HOME}/etc/hadoop/hdfs-site.xml
<configuration>
<property>
<name>dfs.replicationname>
<value>1value>
property>
configuration>
3)修改hadoop-env.sh
[root@qianfeng01 hadoop]# vim hadoop-env.sh
...........省略,大约在25行..........
# The java implementation to use.
export JAVA_HOME=/usr/local/jdk
1)使用 hdfs namenode -format格式化集群,使之生效
[root@qianfeng01 hadoop]# hdfs namenode -format
运行格式化指令后,产生了以下内容
--1. clusterID, 集群唯一标识符
--2. BlockPoolID, 块池id
--3. 映像文件的存储目录: ${hadoop.tmp.dir}/dfs/name
--4. 产生映射文件:fsimage
1)使用相关脚本来启动集群,比如start-dfs.sh ,start-all.sh
[root@qianfeng01 hadoop]# start-dfs.sh
第一次启动集群时,产生了以下内容
--1. datanode管理的数据块的存储位置:${hadoop.tmp.dir}/dfs/data
--2. 在${hadoop.tmp.dir}/dfs/name多了一个edits日志文件
--3. 在家里产生logs目录,用于存储当前机器上的相关守护进程的错误日志
注意:机器上的某一个进程不在,或者是死掉了,那么应该看本机的logs目录下的相关日志文件
2)校验hdfs是否启动成功
方式1: 输入jps指令
方式2: 在webui上输入ip:50070
3)上传linux系统上的文件到hdfs上
[root@qianfeng01 hadoop]# hdfs dfs -mkdir /input
[root@qianfeng01 hadoop]# hdfs dfs -put ~/a.txt /input
qianfeng01: namenode datanode nodemanager resourcemanager
qianfeng02: secondarynamenode datanode nodemanager
qianfeng03: datanode nodemanager
--1. 防火墙要关闭(firewalld, NetworkMananger,SELINUX)
--2. 网络配置(静态IP,域名映射/etc/hosts):
192.168.10.101 qianfeng01
192.168.10.102 qianfeng02
192.168.10.103 qianfeng03
--3. 免密登录认证要做好(三台机器)
--4. JDK和Hadoop环境变量的配置
--5. 三台机器的时间要一致(同步)
使用定时器,同步阿里云时间服务器,前提需要安装ntpdate指令
* * * * * /usr/sbin/ntpdate -u ntp1.aliyun.com
说明:
以下七个文件都要修改,位置位于:${HADOOP_HOME}/etc/hadoop/
1.4.1 core-site.xml的修改
[root@qianfeng01 ~]# cd $HADOOP_HOME/etc/hadoop/
[root@qianfeng01 hadoop]# vi core-site.xml
<configuration>
<property>
<name>fs.defaultFSname>
<value>hdfs://qianfeng01:8020value>
property>
<property>
<name>hadoop.tmp.dirname>
<value>/usr/local/hadoop/tmpvalue>
property>
configuration>
1.4.2 hdfs-site.xml的修改
[root@qianfeng01 hadoop]# vi hdfs-site.xml
<configuration>
<property>
<name>dfs.namenode.name.dirname>
<value>file://${hadoop.tmp.dir}/dfs/namevalue>
property>
<property>
<name>dfs.datanode.data.dirname>
<value>file://${hadoop.tmp.dir}/dfs/datavalue>
property>
<property>
<name>dfs.replicationname>
<value>3value>
property>
<property>
<name>dfs.blocksizename>
<value>134217728value>
property>
<property>
<name>dfs.namenode.secondary.http-addressname>
<value>qianfeng02:50090value>
property>
<property>
<name>dfs.namenode.http-addressname>
<value>qianfeng01:50070value>
property>
configuration>
1.4.3 mapred-site.xml的修改
[root@qianfeng01 hadoop]# cp mapred-site.xml.template mapred-site.xml
[root@qianfeng01 hadoop]# vi mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.namename>
<value>yarnvalue>
property>
<property>
<name>mapreduce.jobhistory.addressname>
<value>qianfeng01:10020value>
property>
<property>
<name>mapreduce.jobhistory.webapp.addressname>
<value>qianfeng01:19888value>
property>
configuration>
1.4.4 yarn-site.xml的修改
[root@qianfeng01 hadoop]# vi yarn-site.xml
<configuration>
<property>
<name>yarn.nodemanager.aux-servicesname>
<value>mapreduce_shufflevalue>
property>
<property>
<name>yarn.resourcemanager.hostnamename>
<value>qianfeng01value>
property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce_shuffle.classname>
<value>org.apache.hadoop.mapred.ShuffleHandlervalue>
property>
<property>
<name>yarn.resourcemanager.addressname>
<value>qianfeng01:8032value>
property>
<property>
<name>yarn.resourcemanager.scheduler.addressname>
<value>qianfeng01:8030value>
property>
<property>
<name>yarn.resourcemanager.resource-tracker.addressname>
<value>qianfeng01:8031value>
property>
<property>
<name>yarn.resourcemanager.admin.addressname>
<value>qianfeng01:8033value>
property>
<property>
<name>yarn.resourcemanager.webapp.addressname>
<value>qianfeng01:8088value>
property>
configuration>
1.4.5 hadoop-env.sh的修改
[root@qianfeng01 hadoop]# vi hadoop-env.sh
.........
# The java implementation to use.
export JAVA_HOME=/usr/local/jdk
.........
1.4.6 slaves文件的修改(格外重要)
slave单词是奴隶的意思,指的就是工作节点datanode的布局
[root@qianfeng01 hadoop]# vi slaves
qianfeng01
qianfeng02
qianfeng03
1.4.7 yarn-env.sh的修改
[root@qianfeng01 hadoop]# vi yarn-env.sh
.........
# some Java parameters
export JAVA_HOME=/usr/local/jdk
if [ "$JAVA_HOME" != "" ]; then
#echo "run java in $JAVA_HOME"
JAVA_HOME=$JAVA_HOME
fi
.........
如果另外两台机器提前搭建好了,需要使用scp指令进行远程拷贝。
如果没有,就可以使用克隆的方式,这种方式比较简单
1.5.1 修改主机名和ip地址
hostnamectl set-hostname [主机名]
vim /etc/sysconfig/network-scripts/ifcfg-ens33
1.5.2 要免密验证
ssh qianfeng02
ssh qianfeng03
目的:去掉第一次的询问操作,也就是输入yes
1.6.1 目的: 让管理节点生效
--1. clusterID, 集群唯一标识符
--2. BlockPoolID, 块池id
--3. 映像文件的存储目录: ${hadoop.tmp.dir}/dfs/name
--4. 产生映射文件:fsimage
1.6.2 如何格式化
在namenode所在的机器节点上进行格式化,格式化命令如下
[root@qianfeng01 ~]# hdfs namenode -format
1.7.1 第一次启动会产生的内容
第一次启动集群时,产生了以下内容
--1. datanode管理的数据块的存储位置:${hadoop.tmp.dir}/dfs/data
--2. 在${hadoop.tmp.dir}/dfs/name多了一个edits日志文件
--3. 在hadoop家里产生logs目录,用于存储当前机器上的相关守护进程的错误日志
1.7.2 启动脚本
[root@qianfeng01 ~]# start-dfs.sh
[root@qianfeng01 ~]# start-yarn.sh
[root@qianfeng01 ~]# start-all.sh
单个进程的脚本:
--hdfs的进程
hadoop-deamon.sh [start|stop] [namenode|datanode|secondarynamenode]
hadoop-deamons.sh [start|stop] [namenode|datanode|secondarynamenode]
--yarn的进程
yarn-deamon.sh [start|stop] [resourcemanager|nodemanager]
yarn-deamons.sh [start|stop] [resourcemanager|nodemanager]
1.7.3 webui验证
hdfs: qianfeng01:50070
yarn: qianfeng01:8088
1.7.4 关闭脚本
stop-dfs.sh
stop-yarn.sh
stop-all.sh
--步骤1:关闭hadoop所有的守护进程
--步骤2:删除所有节点上的tmp目录 (${hadoop.tmp.dir}属性对应的目录),和logs目录
--步骤3:重新在qianfeng01上格式化集群,产生新的集群ID。
## 工作中慎用
--1. 创建一个目录
[root@qianfeng01 ~]# hdfs dfs -mkdir /datasource
--2. 上传要统计的文件
[root@qianfeng01 ~]# hdfs dfs -put poe* /datasource
--3. 使用hadoop自带的wordcount程序进程统计
[root@qianfeng01 ~]# hadoop jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.6.jar wordcount /datasource /output
hadoop jar [filename] wordcount [inputpath] [outputpath]
jar:表示要运行一个jar包文件
filename: jar文件的具体路径
inputpath: 要进行单词频率统计的目录
outputpath: 统计结果输出目录, 注意,此目录不应该提前存在
在命令上输入hdfs dfs 或者是hadoop fs后,直接回车就会提示相关的参数的用法
Usage: hadoop fs [generic options]
-- 创建目录指令
[-mkdir [-p] ...]
--文件的上传指令
[-copyFromLocal [-f] [-p] [-l] ... ]
[-put [-f] [-p] [-l] ... ]
[-moveFromLocal ... ]
--文件的下载指令
[-copyToLocal [-p] [-ignoreCrc] [-crc] ... ]
[-moveToLocal ]
[-get [-p] [-ignoreCrc] [-crc] ... ]
--文件的查看指令
[-cat [-ignoreCrc] ...]
[-tail [-f] ]
[-ls [-d] [-h] [-R] [ ...]]
--文件内容追加指令
[-appendToFile ... ]
--文件的权限管理制定
[-chgrp [-R] GROUP PATH...]
[-chmod [-R] PATH...]
[-chown [-R] [OWNER][:[GROUP]] PATH...]
--hdfs系统的查看指令
[-df [-h] [ ...]]
[-du [-s] [-h] ...]
--文件的删除指令
[-rm [-f] [-r|-R] [-skipTrash] ...]
[-rmdir [--ignore-fail-on-non-empty] ...]
传统文件系统中的块 没有规定块的大小是统一的,因此有以下缺点
-- 1. 负载不均衡: 每台机器上存储的文件大小非常不均匀,有的机器只存储很小的文件,有的机器存储很大的文件。
-- 2. 网络瓶颈问题: 网络带宽本来就稀缺,用户在使用时,集中到某几台机器上读取文件,因此本来就已经很稀缺的网络带宽有被稀释了。
-- hdfs的块大小统一,固定的。
-- hdfs的块大小可以自定义
默认情况:hadoo2.x ---->128M
hadoo1.x ---->64M
hadoo3.x ---->256M
-- 块是hdfs的最小存储单元
-- 块使用了副本的概念(提高数据的安全性,可靠性)
-- 块的多个副本一定是布局到不同的机器上的(一个机器不可能有一个块的两个副本)
-- 文件的最后一个块,通常是小于128M,实际大小是多少,就占磁盘多少空间。
注意:块的数量 和块的个数要区别开。
--1. 块不能太大, 原因是网络带宽稀缺,下载时间长,带宽被稀释的就越多
--2. 块不能太小:
##1. 最小化寻址开销时间
寻址时间在大约在5ms~15ms左右,平均是10ms。如果块大小,那么传输这个块的时间就非常小,比如是10ms,那么传输时间和寻址时间的比例就是1:1的关系,寻址时间不能被忽略,相对来说,占用了整个作业时间的比例比较大。应该让寻址时间的比例越小越好,小到忽略不计。而开发人员认为1:100的比例是最优的。
因此选择了10ms:1000ms的比例,也就是选择1000ms能传输的数据大小。
在2010年左右, 磁盘每1s传入的数据大小是100M左右,选择2的幂次数,因此选择128M.
在hadoop1.x版本时,磁盘速率在50M左右,选择2的幂次数,因此选择64M.
在hadoop3.x版本时,磁盘速率在300M左右,选择2的幂次数,因此选择256M.
##2. namenode内存的利用率:
无论块是多大,对应的元数据都是150字节左右。 假如namenode的内存是20G,能存储块的数量为1.4亿左右。
如果块大小为1M。那么这个集群大约存储133TB的数据,那么集群的存储能力非常低
如果块大小为128M,那么这个集群大约存储16PB的数据
如果块大小为512M,那么这个集群大约存储64PB的数据
--3.扩展:怎么提高集群的存储能力
(1). 在namenode内存是固定的情况下,提高块的大小
(2). 在namenode内存充足的情况下,横向扩展集群的datanode个数。
--1. dfs.blocksize:
块的大小对应的参数
--2. dfs.namenode.fs-limits.min-block-size:
块大小的最小值,默认是1M
--3. dfs.namenode.fs-limits.max-blocks-per-file:
每个文件的块的最大数量,默认是1048576个。
--4. 块的存储位置:
由dfs.datanode.data.dir参数决定: 默认值${hadoop.tmp.dir}/dfs/data
##1. 优点:
1. 高容错性(硬件故障是常态,高可靠性):数据自动保存多个副本,副本丢失后,会自动恢复
2. 适合大数据集:GB、TB、甚至PB级数据、千万规模以上的文件数量,1000以上节点规模。
3. 数据访问: 一次性写入,多次读取;保证数据一致性,安全性
4. 构建成本低:可以构建在廉价机器上。
5. 多种软硬件平台中的可移植性
6. 高效性:Hadoop能够在节点之间动态地移动数据,并保证各个节点的动态平衡,因此处理速度非常快。
##2. 缺点
1. 不适合做低延迟数据访问:
HDFS的设计目标有一点是:处理大型数据集,高吞吐率。这一点势必要以高延迟为代价的。因此HDFS不适合处理用户要求的毫秒级的低延迟应用请求
2. 不适合小文件存取:
一个是大量小文件需要消耗大量的寻址时间,违反了HDFS的尽可能减少寻址时间比例的设计目标。第二个是内存有限,一个block元数据大内存消耗大约为150个字节,存储一亿个block和存储一亿个小文件都会消耗20G内存。因此相对来说,大文件更省内存
3. 不适合并发写入,文件随机修改:
HDFS上的文件只能拥有一个写者,仅仅支持append操作。不支持多用户对同一个文件的写操作,以及在文件任意位置进行修改
1. hdfs是一个主从(master/slaves)架构, 由四个部分组成,分别是一个namenode充当管理节点,多个datanode是工作节点,一个secondarynamenode是辅助节点,还提供了客户端API接口
2. namnode的作用
3. datanode的作用
4. secodnarynamenode的作用
5. client的作用
重点在于理解元数据是什么
## 第一步:
加载name目录下最新的那个fsimage_xxx019文件,将里面存储的元数据(目录树结构)维护到内存中,但是还不是关机前的状态
## 第二步:
将关机前的最后使用的edits_inprogress_xxxx0160进行重命名
edits_0000000000000000160-0000000000000000169操作,然后生成一个最新的edits_inprogress_xxx170文件,并修改seen_txid里的值为170.
将从xxx020~xxx169的这个范围内的所有的edit日志文件加载到内存中,重演里面的操作,从而维护成关机前的最新的目录树结构
## 第三步
如果触发了检查点条件,namenode就会自己做一个检查点。将内存中的最新状态持久化成一个新的fsimage文件,删除之前保留的两份中的最旧那个。 也就是说namenode会保留最近两次的fsimage.
## 安全模式:
从启动到结束,整个过程处于安全模式下。当namenode收到datanode的心跳反馈时,并且达到块数量的99.9%时,会退出安全模式。
注意:当集群第一次开机时,edit文件才生成,而且datanode上还没有块,因此不会出现安全模式。
扩展:为什么客户端的访问操作不直接存储到fsimage里
因为fsimage会随着时间会越来越大(相对而已,不是绝对的,因为有的时候会有删除操作)
直接将访问操作存入fsimage中,性能会非常差。
反而我们提供了edit文件,用于存储客户端的访问,edit文件最大是64M,当达到此值,会新生成一个edit文件来存储新的访问数据。
1.安全模式下不能在hdfs上上传,删除,重命名,追加等操作。只能读取文件。(对于普通用户来说,是只读模式)
2.相关命令
hdfs dfsadmin [-safemode <enter | leave | get | wait>]
hdfs dfsadmin -safemode enter: 进入安全模式
hdfs dfsadmin -safemode leave: 离开安全模式
hdfs dfsadmin -safemode get: 查看安全模式的状态
hdfs dfsadmin -safemode wait: 使安全模式处于等待状态
1. 概念: 集群在启动后,slave节点会向master节点进行周期性的汇报,汇报自己的健康状态以及其他信息,比如3秒一次,这种机制,我们称之为心跳机制(心跳反馈)
2. dfs的心跳机制:
--(1)namenode在启动的时候会先开IPC通信服务,等待datanode主动连接
--(2)datanode启动后,会主动连接IPC通信服务,并且每隔3秒连接一次,并携带自己的状态信息,如块的ID列表,主机名,磁盘剩余空间等。
-- (3) namenode收到datanode的汇报信息后,在内存中维护信息,并下达其他的相关指令给datanode。
3. namenode什么时候认为datanode宕机了?
两个参数和一个公式决定的:
属性:dfs.namenode.heartbeat.recheck-interval 的默认值为5分钟 #Recheck的时间单位为毫秒
属性:dfs.heartbeat.interval 的默认值时3秒 #heartbeat的时间单位为秒
计算公式:2*recheck+10*heartbeat
通过上述公式可知: 默认情况下10分钟30秒后,如果没有接收到某一个datanode的心跳反馈,则认为该datanode宕机。之后就不会再给该datanode分配任务。
4. 扩展:
大数据框架的master/slaves的这种主从架构,多数都是采用的心跳反馈机制。
比如yarn
zookeeper
hbase
##概念:
namenode会产生fsimage和一堆edit文件,secondarynamenode会定期的帮助namenode吧fsiamge和edit文件合并,生成最新的fsimage,这种机制称之为检查点机制。
##定期:
--属性1:
dfs.namenode.checkpoint.period :默认是3600s,也就是1小时
--属性2:
dfs.namenode.checkpoint.txns: 默认是100w次,指的是txid的值的变更
--属性3:
dfs.namenode.checkpoint.check.period: 默认是60s,表示60s一检查txid的值是什么
##检查点机制的流程:
1. SecondaryNamenode请求Namenode停止使用正在编辑的edit日志文件,Namenode会创建新的editlog文件(小了吧),同时更新seed_txid文件。
2. SecondaryNamenode通过HTTP协议获取Namenode上的fsimage和最近的没有合并过的所有editlog文件。
3. SecondaryNamenode将fsimage读进内存当中,并逐步分析editlog文件里的数据,进行合并操作,然后写入新文件fsimage_x.ckpt文件中。
4. SecondaryNamenode将新文件fsimage_x.ckpt通过HTTP协议发送回Namenode,secondarynamenode也会保留最近的两份
5. Namenode再进行更名操作,并删除最旧的那一个,
##1.网络拓扑就是用于计算服务器远近的
hdfs采用了两个服务器距离最近祖先的距离之和来表示带宽
距离有这四种情况:
Distance(/d1/r1/n1, /d1/r1/n1)=0(同一节点上的进程)
Distance(/d1/r1/n1, /d1/r1/n2)=2(同一机架上的不同节点)
Distance(/d1/r1/n1, /d1/r2/n3)=4(同一数据中心不同机架上的节点)
Distance(/d1/r1/n1, /d2/r3/n4)=6(不同数据中心的节点)
带宽依次递减。
##2. 机架感知(重点)
使用机架感知,必须配置相关属性,以及多台机器,否则所有机器都会被注册到同一个机器上,名字为/default-rack.如果使用了机架感知策略,那么文件块的副本是如何存储的?
--1.hadoop2.8.2版本之前的版本机架感知策略(副本冗余策略)如下:
(1)第一个副本,如果client在某一个datanode上,就存储在本地上,如果client不是datanode,就随机一个机架中的一个datanode进行存储
(2)第二个副本, 存储位置是与第一个副本同一个机架不同datanode上
(3)第三个副本,存储位置是不同机架上的任意一个datanode上
--2.hadoop2.8.2版本之后的版本机架感知策略(副本冗余策略)如下:
(1)第一个副本,如果client在某一个datanode上,就存储在本地上,如果client不是datanode,就随机一个机架中的一个datanode进行存储
(2)第二个副本, 存储位置是不同机架上的任意一个datanode上
(3)第三个副本,存储位置是与第二个副本同一机架上的不同datanode上
准备一台配置了jdk和hadoop的新主机qianfeng04。如果克隆的话,别忘记删除${hadoop.tmp.dir}指定的目录和logs目录
<property>
<name>dfs.hostsname>
<value>/usr/local/hadoop/etc/hadoop/includevalue>
property>
注意:include这个文件名,可以自定义。
[root@qianfeng01 hadoop]# vi /usr/local/hadoop/etc/hadoop/include
qianfeng01
qianfeng02
qianfeng03
qianfeng04 将要上线的主机名
注意:dfs.hosts指定的文件中必须存储所有的在线主机名
[root@qianfeng01 hadoop]# hadoop dfsadmin -refreshNodes。
通过hadoop dfsadmin -report 或者web界面,可以看到, 多了一个节点,但是此节点是dead状态
[root@qianfeng01 hadoop]# hadoop-daemon.sh start datanode.
可以通过hadoop dfsadmin -report 或者web界面,可以看到, 节点已经上线。
[root@qianfeng01 hadoop]# vi slaves
qianfeng01
qianfeng02
qianfeng03
qianfeng04
## 1. 添加属性
<property>
<name>dfs.hosts.exclude</name>
<value>/usr/local/hadoop/etc/hadoop/exclude</value>
</property>
## 2. 创建相关文件,添加要下线的主机名
[root@qianfeng01 hadoop]# vi /usr/local/hadoop/etc/hadoop/exclude
qianfeng01
## 3. 刷新节点: 让namenode识别要下线的机器,并做迁徙工作,迁徙工作完成后,相应的datanode会转为已退役装
[root@qianfeng01 hadoop]# hdfs dfsadmin -refreshNodes
## 4. 使用命令或者是脚本关闭已退役的datanode
[root@qianfeng01 hadoop]# hadoop-daemon.sh stop datanode
## 5. 要将slaves文件中的相应的主机名移除,为避免下一次重启还去启动这个机器。
注意:实际生产环境中,slaves文件,要同步到其他机器上。
api参考代码或者是文档
注意:获取文件状态信息的api是最重要的
1. 客户端获取DistributedFileSystem对象 ,调用open方法,准备读取一个文件
2. namenode收到读请求后,会校验是否有权限,读取文件路径是否存在等操作,如果通过检验,会返回一个输入流对象
以及文件的所有块的所有副本的位置信息
3. 客户端准备调用输入流的read方法读取数据,先将第一个块的三个位置由近及原的排序,选择最近的副本开始循环调用read方法读取数据
4. 当块读完后,会断开与该datanode的连接,继续寻找下一个块的最佳读取位置读取数据,直到整个文件读取完毕。
5. 调用输入流的close方法关闭流,以及向namenode汇报读取流程结束。
注意: 如果读取过程中,出现机器宕机,会选择该块的两外两个副本的最佳位置,开始重新读取该块的数据,并标记宕机的那个机器节点,防止其他的读取操作再次来到该节点(做无用功)。读取过程中,也会进行校验和确认数据是否完整,如果不完整,也会选择其他的副本重新读取。
1. 客户端获取DistributedFileSystem对象
2. 调用分布式文件系统对象的create方法,表示要创建文件路径
3. namenode会对客户端是否有权限,目录是否已经存在等进行校验,如果校验通过,则返回一个输出流对象,并返回第一个块的三个datanode的信息
4. 客户端先将三个datanode节点组成一个socket通信的pipeline。由近及远的顺序。
5. 客户端将本地数据读入内存,封装成多个chunk(512byte)和checksum(4byte),然后再将多个chunk和checksum封装成一个packet(64kb)。
6. 客户端调用输出流的write方法,将每一个packet写入管道的第一个节点的内存中,第一个节点再传入第二个节点内存,第二个节点再传入第三个节点内存。
三个节点都要进行向客户端进行ack应答,表示存储成功。
7. 客户端会源源不断的向管道书写packet,当累计到一个块大小128M时,会断开该管道,重新向namenode申请下一个块的三个datanode信息。重复上述操作。直到文件的最后一个块完成写出。调用close方法关闭输出流。再与namenode进行通信,表示上传成功。namenode重新维护元数据。
细节:
写流程涉及到两个队列和两个线程
dataqueue--->dataStreamer
dataqueue:用来存储客户端封装好的packet
dataStreamer:将dataqueue中的每一个头元素packet拷贝pipeline中,并移除到ackqueue队列
ackqueue---->responseStreamer
ackqueue: 用来记录正在管道中的所有的packet
responseStreamer:用来接收ack信息,如果三个节点都ack成功,就会将ackqueue中的该packet删除。
据是否完整,如果不完整,也会选择其他的副本重新读取。
### 3.2 写流程
细节:
写流程涉及到两个队列和两个线程
dataqueue—>dataStreamer
dataqueue:用来存储客户端封装好的packet
dataStreamer:将dataqueue中的每一个头元素packet拷贝pipeline中,并移除到ackqueue队列
ackqueue---->responseStreamer
ackqueue: 用来记录正在管道中的所有的packet
responseStreamer:用来接收ack信息,如果三个节点都ack成功,就会将ackqueue中的该packet删除。