hadoop

hadoop

Hadoop简介

​ 名字来源于Doug Cutting儿子的玩具大象。
​ 2003-2004年,Google公开了部分GFS和Mapreduce思想的细节,以此为基础Doug Cutting等人用了2年业余时间实现了DFS和Mapreduce机制,一个微缩版:Nutch
​ Hadoop 于 2005 年秋天作为 Lucene的子项目 Nutch的一部分正式引入Apache基金会。2006 年 3 月份,Map-Reduce 和 Nutch Distributed File System (NDFS) 分别被纳入称为 Hadoop 的项目

​ 网址:http://hadoop.apache.org

分布式存储系统HDFS (Hadoop Distributed File System )POSIX

  • 分布式存储系统
  • 提供了 高可靠性、高扩展性和高吞吐率的数据存储服务

分布式计算框架MapReduce

  • 分布式计算框架(计算向数据移动)
  • 具有 易于编程、高容错性和高扩展性等优点。

分布式资源管理框架YARN(Yet Another Resource Management)

  • 负责集群资源的管理和调度

存储模型:字节
​ 文件线性切割成块(Block):偏移量 offset (byte)
​ Block分散存储在集群节点中
​ 单一文件Block大小一致,文件与文件可以不一致
​ Block可以设置副本数,副本分散在不同节点中
​ 副本数不要超过节点数量
​ 文件上传可以设置Block大小和副本数
​ 已上传的文件Block副本数可以调整,大小不变
​ 只支持一次写入多次读取,同一时刻只有一个写入者
​ 可以append追加数据

架构模型
​ 文件元数据MetaData,文件数据
​ 元数据
​ 数据本身
​ (主)NameNode节点保存文件元数据:单节点 posix
​ (从)DataNode节点保存文件Block数据:多节点
​ DataNode与NameNode保持心跳,提交Block列表
​ HdfsClient与NameNode交互元数据信息
​ HdfsClient与DataNode交互文件Block数据

​ Hadoop实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS。HDFS有高容错性的特点,并且设计用来部署在低廉的(low-cost)硬件上;而且它提供高吞吐量(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。HDFS放宽了(relax)POSIX的要求,可以以流的形式访问(streaming access)文件系统中的数据。

​ Hadoop的框架最核心的设计就是:HDFS和MapReduce。HDFS为海量的数据提供了存储,而MapReduce则为海量的数据提供了计算。

优点

​ Hadoop是一个能够对大量数据进行分布式处理软件框架。 Hadoop 以一种可靠、高效、可伸缩的方式进行数据处理。

​ Hadoop 是可靠的,因为它假设计算元素和存储会失败,因此它维护多个工作数据副本,确保能够针对失败的节点重新分布处理

​ Hadoop 是高效的,因为它以并行的方式工作,通过并行处理加快处理速度。

​ Hadoop 还是可伸缩的,能够处理 PB 级数据。

​ 此外,Hadoop 依赖于社区服务,因此它的成本比较低,任何人都可以使用。

​ Hadoop是一个能够让用户轻松架构和使用的分布式计算平台。用户可以轻松地在Hadoop上开发和运行处理海量数据的应用程序

它主要有以下几个优点:

高容错性
​ 数据自动保存多个副本
​ 副本丢失后,自动恢复
适合批处理
​ 移动计算而非数据
​ 数据位置暴露给计算框架(Block偏移量)
适合大数据处理
​ GB 、TB 、甚至PB 级数据
​ 百万规模以上的文件数量
​ 10K+ 节点
可构建在廉价机器上
​ 通过多副本提高可靠性
​ 提供了容错和恢复 机制

缺点

​ 低延迟数据访问
​ 比如毫秒级
​ 低延迟与高吞吐率
​ 小文件存取
​ 占用NameNode 大量内存
​ 寻道时间超过读取时间
​ 并发写入、文件随机修改
​ 一个文件只能有一个写者
​ 仅支持append

hadoop大数据处理的意义

​ Hadoop得以在大数据处理应用中广泛应用得益于其自身在数据提取、变形和加载(ETL)方面上的天然优势。Hadoop的分布式架构,将大数据处理引擎尽可能的靠近存储,对例如像ETL这样的批处理操作相对合适,因为类似这样操作的批处理结果可以直接走向存储。Hadoop的MapReduce功能实现了将单个任务打碎,并将碎片任务(Map)发送到多个节点上,之后再以单个数据集的形式加载(Reduce)到数据仓库里。

HDFS

​ 对外部客户机而言,HDFS就像一个传统的分级文件系统。可以创建、删除、移动或重命名文件,等等。但是 HDFS 的架构是基于一组特定的节点构建的(参见图 1),这是由它自身的特点决定的。这些节点包括 NameNode(仅一个),它在 HDFS 内部提供元数据服务;DataNode,它为 HDFS 提供存储块。由于仅存在一个 NameNode,因此这是 HDFS 的一个缺点(单点失败)。

​ 存储在 HDFS 中的文件被分成块,然后将这些块复制到多个计算机中(DataNode)。这与传统的 RAID 架构大不相同。块的大小(通常为 64MB)和复制的块数量在创建文件时由客户机决定。NameNode 可以控制所有文件操作。HDFS 内部的所有通信都基于标准的 TCP/IP 协议。

NameNode

​ NameNode 是一个通常在 HDFS 实例中的单独机器上运行的软件。它负责管理文件系统名称空间和控制外部客户机的访问。NameNode 决定是否将文件映射到 DataNode 上的复制块上。对于最常见的 3 个复制块,第一个复制块存储在同一机架的不同节点上,最后一个复制块存储在不同机架的某个节点上。注意,这里需要您了解集群架构。

​ 实际的 I/O事务并没有经过 NameNode,只有表示 DataNode 和块的文件映射的元数据经过 NameNode。当外部客户机发送请求要求创建文件时,NameNode 会以块标识和该块的第一个副本的 DataNode IP 地址作为响应。这个 NameNode 还会通知其他将要接收该块的副本的 DataNode。

​ NameNode 在一个称为 FsImage 的文件中存储所有关于文件系统名称空间的信息。这个文件和一个包含所有事务的记录文件(这里是 EditLog)将存储在 NameNode 的本地文件系统上。FsImage 和 EditLog 文件也需要复制副本,以防文件损坏或 NameNode 系统丢失。

​ NameNode本身不可避免地具有SPOF(Single Point Of Failure)单点失效的风险,主备模式并不能解决这个问题,通过Hadoop Non-stop namenode才能实现100% uptime可用时间。

NameNode(NN)
​ 基于内存存储 :不会和磁盘发生交换
​ 只存在内存中
​ 持久化
​ NameNode主要功能:
​ 接受客户端的读写服务
​ 收集DataNode汇报的Block列表信息
​ NameNode保存metadata信息包括
​ 文件owership和permissions
​ 文件大小,时间
​ (Block列表:Block偏移量),位置信息
​ Block每副本位置(由DataNode上报)

NameNode持久化
​ NameNode的metadate信息在启动后会加载到内存
​ metadata存储到磁盘文件名为”fsimage”
​ Block的位置信息不会保存到fsimage
​ edits记录对metadata的操作日志。。。redis

DataNode

​ DataNode 也是一个通常在 HDFS实例中的单独机器上运行的软件。Hadoop 集群包含一个 NameNode 和大量 DataNode。DataNode 通常以机架的形式组织,机架通过一个交换机将所有系统连接起来。Hadoop 的一个假设是:机架内部节点之间的传输速度快于机架间节点的传输速度。

​ DataNode 响应来自 HDFS 客户机的读写请求。它们还响应来自 NameNode 的创建、删除和复制块的命令。NameNode 依赖来自每个 DataNode 的定期心跳(heartbeat)消息。每条消息都包含一个块报告,NameNode 可以根据这个报告验证块映射和其他文件系统元数据。如果 DataNode 不能发送心跳消息,NameNode 将采取修复措施,重新复制在该节点上丢失的块。

DataNode(DN)
​ 本地磁盘目录存储数据(Block),文件形式
​ 同时存储Block的元数据信息文件
​ 启动DN时会向NN汇报block信息
​ 通过向NN发送心跳保持与其联系(3秒一次),如果NN 10分钟没有收到DN的心跳,则认为其已经lost,并copy其上的block到其它DN

SecondaryNameNode(SNN)

​ 它不是NN的备份(但可以做备份),它的主要工作是帮助NN合并edits log,减少NN启动时间。
​ SNN执行合并时机
​ 根据配置文件设置的时间间隔fs.checkpoint.period 默认3600秒
​ 根据配置文件设置edits log大小 fs.checkpoint.size 规定edits文件的最大值默认是64MB

Block的副本放置策略
​ 第一个副本:放置在上传文件的DN;如果是集群外提交,则随机挑选一台磁盘不太满,CPU不太忙的节点。
​ 第二个副本:放置在于第一个副本不同的 机架的节点上。
​ 第三个副本:与第二个副本相同机架的节点。
更多副本:随机节点

HDFS写流程

Client:
​ 切分文件Block
​ 按Block线性和NN获取DN列表(副本数)
​ 验证DN列表后以更小的单位流式传输数据
​ 各节点,两两通信确定可用
​ Block传输结束后:
​ DN向NN汇报Block信息
​ DN向Client汇报完成
​ Client向NN汇报完成
​ 获取下一个Block存放的DN列表
​ 。。。。。。
​ 最终Client汇报完成
​ NN会在写流程更新文件状态


​ 线性上传block
​ 先和NN通信,元数据,获取第一个block的节点信息(3副本,选择机制)
​ 和DN通信:pipeline:C和1stDN有socket,1stDN和2edDN有socket。。。。
​ 小片传输:4K,C给1stDN,1stDN同时本机缓存,瞬间放入下游socket中
​ 当block传输完毕:block自身的网络I/O时间,时间线重叠的艺术
​ DN会向NN汇报自己新增的block
​ C向NN汇报blockX传输完成给我下一个block节点信息
​ 全部传输完成,NN更新元数据状态可用

HDFS读流程

Client:
​ 和NN获取一部分Block副本位置列表
​ 线性和DN获取Block,最终合并为一个文件
​ 在Block副本列表中按距离择优选取


​ 线性读取block,不会有并发,只有一个网卡
​ 距离:择优选取同机架,同节点
​ NN每次只给一部分block信息

HDFS文件权限 POSIX

​ 与Linux文件权限类似
​ r: read; w:write; x:execute
​ 权限x对于文件忽略,对于文件夹表示是否允许访问其内容
​ 如果Linux系统用户zhangsan使用hadoop命令创建一个文件,那么这个文件在HDFS中owner就是zhangsan。
​ HDFS的权限目的:阻止好人错错事,而不是阻止坏人做坏事。HDFS相信,你告诉我你是谁,我就认为你是谁。

安全模式

​ namenode启动的时候,首先将映像文件(fsimage)载入内存,并执行编辑日志(edits)中的各项操作。
​ 一旦在内存中成功建立文件系统元数据的映射,则创建一个新的fsimage文件(这个操作不需要SecondaryNameNode)和一个空的编辑日志。
​ 此刻namenode运行在安全模式。即namenode的文件系统对于客服端来说是只读的。(显示目录,显示文件内容等。写、删除、重命名都会失败)。
​ 在此阶段Namenode收集各个datanode的报告,当数据块达到最小副本数以上时,会被认为是“安全”的, 在一定比例(可设置)的数据块被确定为“安全”后,再过若干时间,安全模式结束
​ 当检测到副本数不足的数据块时,该块会被复制直到达到最小副本数,系统中数据块的位置并不是由namenode维护的,而是以块列表形式存储在datanode中。

集群

角色==进程
​ namenode
​ 数据元数据
​ 内存存储,不会有磁盘交换
​ 持久化(fsimage,eidts log)
​ 不会持久化block的位置信息
​ block:偏移量,因为block不可以调整大小,hdfs,不支持修改文件
​ 偏移量不会改变
​ datanode
​ block块
​ 磁盘
​ 面向文件,大小一样,不能调整
​ 副本数,调整,(备份,高可用,容错/可以调整很多个,为了计算向数据移动)
SN
​ NN&DN
​ 心跳机制
​ DN向NN汇报block信息
​ 安全模式

操作系统环境

​ 依赖软件ssh,jdk
​ 环境的配置
​ java_home
​ 免密钥
​ 时间同步
​ hosts,hostname

hadoop部署

​ /opt/sxt/
​ 配置文件修改
​ java_home
​ 角色在哪里启动

1,jdk安装,配置环境变量
​ vi /etc/profile
2,ssh免密钥(本机)
​ ssh-keygen -t dsa -P ‘’ -f ~/.ssh/id_dsa
​ cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
3,上传hadoop.tar.gz到服务器
​ 解压,mv hadoop-2.6.5 /opt/sxt
​ vi /etc/profile
​ export JAVA_HOME=/usr/java/jdk1.7.0_67
​ export HADOOP_PREFIX=/opt/sxt/hadoop-2.6.5
​ exportPATH= P A T H : PATH: PATH:JAVA_HOME/bin: H A D O O P P R E F I X / b i n : HADOOP_PREFIX/bin: HADOOPPREFIX/bin:HADOOP_PREFIX/sbin
4,/opt/hadoop-2.6.5/etc/hadoop
​ *-env.sh
​ JAVA_HOME=/usr/java/jdk1.7.0_67

core-site.xml

​ fs.defaultFS
​ hdfs://node01:9000


​ hadoop.tmp.dir
​ /var/sxt/hadoop/local

hdfs-site.xml

​ dfs.replication
​ 1


​ dfs.namenode.secondary.http-address
​ node01:50090

slaves
​ node01

hdfs namenode -format
start-dfs.sh
​ jps
​ 28341 SecondaryNameNode
​ 28102 NameNode
​ 28207 DataNode
​ 28480 Jps
hdfs dfs -mkdir /user
hdfs dfs -ls /user
hdfs dfs -mkdir /user/root
hdfs dfs -D dfs.blocksize=1048576 -put hadoop-2.6.5.tar.gz

for i in seq 100000;do echo “hello sxt $i” >> test.txt;done
http://192.168.9.11:50070

1,每台服务器要:
安装jdk
配置环境变量
免密钥登陆
控制节点scp自己的id_dsa.pub分发到其他节点
cat ~/node1.pub >> ~/.ssh/authorized_keys
mkdir /opt/sxt
/etc/hosts
2,取一个节点:
配置Hadoop的配置文件:见第二页
3,分发部署包到其他节点
cd /opt/sxt
scp -r hadoop-2.6.5 node02:pwd
scp -r hadoop-2.6.5 node03:pwd
scp -r hadoop-2.6.5 node04:pwd

core-site.xml

​ fs.defaultFS
​ hdfs://node01:9000


​ hadoop.tmp.dir
​ /var/sxt/hadoop/full

hdfs-site.xml

​ dfs.replication
​ 3


​ dfs.namenode.secondary.http-address
​ node02:50090

slaves
​ node02
​ node03
​ node04

4,确认之前的hadoop进程是否停到了
jps
5,hdfs namenode -format (node01)
6,start-dfs.sh
7,每个节点jps验证,node01:50070

1,jdk安装
​ /etc/profile
​ ~/.bashrc
2,ssh:避免输入密码
​ ssh-keygen -t dsa -P ‘’ -f ~/.ssh/id_dsa
​ cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
​ scp ~/.ssh/id_dsa.pub root@node02:pwd/node01.pub
​ cat node01.pub >> ~/.ssh/authorized_keys

3,
for i in seq 4; do
cat k | sed “s/(node0)1(,192.168.9.1)1(.*)/\1KaTeX parse error: Expected 'EOF', got '\2' at position 2: i\̲2̲i\3/gi” >> known_hosts;
done

4,解压缩:
mkdir /opt/sxt/
tar xf hadoop*.tar.gz
5,hadoop/etc/hadoop
*-env.sh

文件操作

​ 可见,HDFS 并不是一个万能的文件系统。它的主要目的是支持以流的形式访问写入的大型文件。

​ 如果客户机想将文件写到 HDFS 上,首先需要将该文件缓存到本地的临时存储。如果缓存的数据大于所需的 HDFS 块大小,创建文件的请求将发送给 NameNode。NameNode 将以 DataNode 标识和目标块响应客户机。

​ 同时也通知将要保存文件块副本的 DataNode。当客户机开始将临时文件发送给第一个 DataNode 时,将立即通过管道方式将块内容转发给副本 DataNode。客户机也负责创建保存在相同 HDFS名称空间中的校验和(checksum)文件。

​ 在最后的文件块发送之后,NameNode 将文件创建提交到它的持久化元数据存储(在 EditLog 和 FsImage 文件)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值