Hadoop 的思想之源:Google 第一遇到大数据计算问题的公司
Openstack :NASA
面对的数据和计算难题
- 大量的网页怎么存储
- 搜索算法
带给我们的关键技术和思想(Google三大理论)
- GFS 文件存储
- Map-Reduce 计算
- Bigtable
创始人:Doug cutting
Hadoop简介:http://hadoop.apache.org
分布式存储系统HDFS (Hadoop Distributed File System )POSIX
分布式存储系统
提供了 高可靠性、高扩展性和高吞吐率的数据存储服务
分布式计算框架MapReduce
分布式计算框架(计算向数据移动)
具有 易于编程、高容错性和高扩展性等优点。
分布式资源管理框架YARN(Yet Another Resource Management)
负责集群资源的管理和调度
版本:1.x,2.x,3.x
存储模型:字节
文件线性切割成块(Block):偏移量 offset (byte, 中文)
block分散存储存储在集群节点中
单一文件Block大小一致,文件与文件可以不一致
Block可以设置副本数,副本无序分散在不同节点中(默认是3个)
副本数不要超过节点数量
文件上传可以设置Block大小和副本数(资源不够开辟的进程)
已上传的文件Block副本数可以调整,大小不变
2.x 128MB Block 默认Block为128M,可以人为设置,最小1M,
只支持一次写入多次读取,同一时刻只有一个写入者
可以append追加数据
文件元数据MetaData, 文件数据
元数据:metedata size offset
主节点负责管理元数据
从节点负责处理具体的文件数据,即块文件
NameNode 主节点保存文件元数据:单节点posix
DataNode 从节点保存文件Block数,多数据
DataNode 与NameNode1报错心跳, DataNode向NameNode提交Block列表
HdfsClient与NameNode交互元数据信息
HdfsClient与DataNode交互文件Block数据(cs架构)
DataNode利用服务器本地文件系统存储数据块
NameNode(NN)
基于内存存储:不会和磁盘发生交换(双向)
- 值存在内存中
- 持久化 单向 => 写入磁盘
NameNode主要功能:
- 接受客户端的读写服务
- 收集DataNode汇报的Block列表信息
NameNode保存metadata信息包括
- 文件owership和 permissions
- 文件大小,时间
- (Block列表:Block偏移量), 位置信息(持久化不存)
- Block每个副本位置(有DataNode上报)
NameNode持久化的两种方式 fsimage 和 edits
fsimage 写入磁盘时慢,从磁盘恢复到内存中快
- NameNode的metadata信息在启动后会加载到内存中
- 磁盘镜像快照 内存—》序列化 — 》 二进制文件
- metadata 存储到磁盘文件名 “fsimage”(时点备份 )
- 从二进制文件反序列化成对象恢复到内存中
- Block的位置信息不回保存到fsimage
edits 写入磁盘时快,从磁盘恢复时慢
- edits记录对metadata的操作日志 .存储所有操作记录
- 按照操作记录重新执行一遍从而变成内存中数据
所以二者需要结合使用
在系统第一次搭建完成后此时还没有跑起来时会格式化, 就会产生第一 fsimage 文件, 空的fsimage文件,启动hadoop时读取空的fsimage文件时会产生一个空的edits_log文件,此时edits和fsimage会进行合并生成一个新的fsimage文件,以后不管重启多少次fsimage文件将不会再改变,只是对edits文件增长,但是不能任由edits文件增长,此时需要在达到一定条件后再对edits和fsimage文件做合并,生成新的fsimage,充分发挥两者优势
此时需要SecondaryNameNode(SNN) Hadoop1.0
它不是NN的备份(但可以做备份), 它的主要工作就是帮助NN合并editslog,减少NN启动时间
SNN执行合并时机:
- 根据配置文件设置的时间间隔fs.checkpoint.period 默认是3600s
- 根据配置文件设置editslog的大小,fs.checkpoint.size 规定edits文件的最大值, 默认是64MB
DataNode(DN)
- 本地磁盘目录存储数据(Block),文件形式
- 同时存储Block的元数据信息文件(此处的元数据是指存储数据Block的md5值,确保文件的正确性完整性,如果不正确,则去另外的DN去寻找这个文件的备份)
- 启动DN时回想NN汇报block信息
- 通过向NN发送心跳保持与其联系(3s一次),如果NN10分钟没有收到DN的心跳,则认为其已经lost, 并copy其上的block到其他DN上,恢复到默认的副本数
为啥是10分钟?
DN数据较大,给10分钟有可能进行恢复工作,避免进行频繁的拷贝
HDFS优点
HDFS缺点
第一个副本:放置在上传文件的DN;如果是集群外提交,则随机挑选一台磁盘不太满,CPU不太忙的节点。
第二个副本:放置在于第一个副本不同的 机架的节点上。
第三个副本:与第二个副本相同机架的其他节点。
更多副本:随机节点
HDFS文件权限 POSIX标准(可移植操作系统接口)
安全模式
namenode启动的时候,首先将映像文件(fsimage)载入内存,并执行编辑日志(edits)中的各项操作。
一旦在内存中成功建立文件系统元数据的映射,则创建一个新的fsimage文件(这个操作不需要SecondaryNameNode)和一个空的编辑日志。
此刻namenode运行在安全模式。即namenode的文件系统对于客服端来说是只读的。(显示目录,显示文件内容等。写、删除、重命名都会失败,尚未获取动态信息)。
在此阶段Namenode收集各个datanode的报告,当数据块达到最小副本数以上时,会被认为是“安全”的, 在一定比例(可设置)的数据块被确定为“安全”后,再过若干时间,安全模式结束
当检测到副本数不足的数据块时,该块会被复制直到达到最小副本数,系统中数据块的位置并不是由namenode维护的,而是以块列表形式存储在datanode中。
集群
角色==进程
可以通过官网查看安装细节
Hadoop
vi + /etc/profile
export JAVA_HOME=/usr/java/jdk1.7.0_67
PATH=$PATH:$JAVA_HOME/bin
保存退出
source /etc/profile
cd到用户目录
ll -a 查看隐藏目录
如果没有 ./ssh文件夹
则输入 ssh localhost
输入密码后 再输入exit退出ssh
此时在输入 ll -a 就会看到 ./ssh文件夹
如果在输入 ssh localhost后无法免密,此时输入
ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
此时会在ssh文件夹中生成两个文件 id_dsa,和id_dsa.pub
然后执行
cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
验证:ssh localhost ,此时不需要输入密码就可以联接
安装jdk、配置环境变量,测试
免秘钥
ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
hadoop包安装并配置环变:hadoop-2.6.5.tar.gz
Hadoop的第二次JAVA_HOME 环境变量配置
vi hadoop-env.sh
vi mapred-env.sh
vi yarn-env.sh
配置core-site.xml
vi core-site.xml
fs.defaultFS
hdfs://node001:9000
hadoop.tmp.dir
/var/test/hadoop/local
配置hdfs-site.xml
dfs.replication
1
dfs.namenode.secondary.http-address
node001:50090
配置slaves文件
vi slaves node06
格式化hdfs
hdfs namenode -format (只能格式化一次,再次启动集群不要执行)
启动集群
start-dfs.sh
角色进程查看:jps
帮助: hdfs
hdfs dfs
查看web UI: IP:50070
创建目录:hdfs dfs -mkdir -p /user/root
查看目录: hdfs dfs -ls /
上传文件: hdfs dfs -put hadoop-2.6.5.tar.gz /user/root
停止集群:stop-dfs.sh
全分布安装
---------------------------------------------
前期准备:
jdk
hostname
hosts
date
安全机制
firewall
windows 域名映射
节点: node001/003/003/04
全分布分配方案:
NN SNN DN
NODE06 *
NODE07 * *
NODE08 *
NODE09 *
节点状态:
node001: 伪分布
node002/003/004 : ip配置完成
建立各节点通讯(hosts)
设置时间同步:date -s “xxxx-x-xx xx:xx:xx”
秘钥分发:
在每个节点上登录一下自己:产生.ssh目录
从node001向node002/node003/node004分发公钥 (公钥的名称要变化)
scp id_dsa.pub node002:`pwd`/node001.pub
各节点把node001的公钥追加到认证文件里:
cat ~/node001.pub >> ~/.ssh/authorized_keys
node002/node003/node004安装jdk环境,node001分发profile给其他节点,并重读配置文件
分发hadoop部署程序2.6.5 到其他节点
copy node001 下的 hadoop 为 hadoop-local (管理脚本只会读取hadoop目录)
[root@node001 etc]# cp -r hadoop hadoop-local
配置core-site.xml
配置hdfs-site.xml
配置slaves
分发副本到其他002,003,004节点
格式化集群:hdfs namenode -format
启动集群:start-dfs.sh
Jps 查看各节点进程启动情况