那位先生

个人站

前世五百次回眸,才能换得今生的一次擦肩而过。


Hadoop01

1.Hadoop历史

1.Hadoop要解决的问题

1.问题:1台内存只有1G的计算机,如何在1个1个1T的文件查找重复的两行?

解决办法:由于计算机内存不能放下全量数据,因此计算机每次处理1行,并求hash值,hash值相同则说明两行相同。 求hash半小时,排序半小时。
改进1:每次处理1万行(假设1万行的总大小还是小于1G),并求hash。假设每次处理时间为2秒,则总的处理时间为 2*(1T/1万行的文件大小)(相比前面减少IO次数)。
改进2-大数据的处理方法:使用一个(1T/1万行的文件大小)分布式集群进行处理,则耗时为2秒,时间大大减少。

2.总结

问题中涉及到的技术包括:1.并行-提升速度的关键。2.分布式。3.计算和数据在同一台机器。4.文件的切割管理。
Hadoop所要解决的就是:分布式文件管理、分布式计算、将算法向数据移动(相比要处理的数据,算法要小的多)、管理和规范化操作。

2.Hadoop存储模型

Hadoop的存储模型:字节。
Hadoop将文件线性的切割成块(block),block分散存储在不同的集群节点中,并通过偏移量(offset)即索引下标计算文件的位置。
特点:一个文件切割成的block块大小要相同(除最后一块外),不同的文件切割成的block块大小可以不一样。
block可以设置副本数,副本无序散列在不同的节点中(设置副本主要是为了安全,比如某个服务器挂了又不设置副本,就会造成在这个 节点上的block会永久的丢失)。注意副本数不要超过节点数量,原因:一个节点上放两个相同的block无意义。
文件上传可以设置block大小(系统默认1M~128M)和副本数)和副本数;已经上传的文件block副本数可以调整,但是 大小不能改变,大小改变会造成所有的索引都会变。
只支持一次写入多次读取,同一时刻只有一个写入者。
可以append追加数据。
设计思想

3.hadoop架构模型-主从架构

文件元数据MetaData:文件数据本身的信息。
主节点:NameNode节点保存文件元数据(文件名、文件大小、偏移量等):单节点、posix等。
从节点:DataNode节点保存文件Block数据(具体的数据):多节点存储。
DataNode与NameNode保持心跳,DataNode向NameNode提交Block列表。
HdfsClient与NameNode交互元数据信息(数据在什么地方,数据大小等)。
HdfsClient与DataNode交互文件Block数据(cs模式)。
DataNode利用服务器本地文件系统存储数据块。
架构图

4.hadoop持久化

1.NameNode(NN)

NameNode是基于内存的存储(不会和磁盘发生交换(这里的交换是指双向的交换)),只存在于内存中。因此他需要进行持久化操作(和Redis类似)否则服务器 发生故障就会造成数据丢失。

2.NameNode主要功能

接收客户端的读写信息;收集DataNode汇报的Block列表信息(metadata信息),包括:文件owership、permissions、文件大小、时间、 Block列表:Block偏移量),位置信息(持久化不存,因为存了之后如果第一个发生变化会导致其它的都会发生变化, 持久化到内存的数据信息就不是准确的)、Block每副本位置(持久化不存,由DataNode上报)。

3.NameNode持久化过程

NameNode的metadata信息在启动后会加载到内存,metadata存储到磁盘文件名为”fsimage”(时点备份)即磁盘镜像文件,注意:Block的位置信息不会保存到fsimage 同时,edits文件记录用户对metadata的操作日志。具体是:当edits文件达到一定大小(fs.checkpoint.size,可配,默认64M) 或者达到一定间隔时间(fs.checkpoint.period,可配,默认3600秒)后,在SecondaryNameNode的帮助下合并fsimage和edits log。从而 达到减少NameNode的启动时间的作用。(相比加载edits log并执行,系统加载磁盘镜像文件会更快,因为磁盘镜像文件经过序列化处理。fsimage恢复快,edit log 写的快)
SNN合并流程

4.DataNode

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

5.hdfs优缺点

1.优点

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

2.缺点

不支持低延迟数据访问:比如毫秒级(它的处理时间都是以秒为单位)、不支持低延迟与高吞吐率。
小文件存取:出现占用NameNode大量内存(NN要记录小文件的metadata)、小文件多寻道时间超过读取时间。
不支持并发写入、文件随机修改:一个文件只能有一个写者;仅支持append。

6.Block的副本放置策略

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

7.hadoop的读写流程

1.写流程

hadoop的写流程
0)切分文件Block;按Block线性和NN获取DN列表(副本数)。
1)客户端通过Distributed FileSystem模块向namenode请求上传文件,namenode检查目标文件是否已存在,父目录是否存在。
2)namenode返回是否可以上传。
3)客户端请求第一个 block上传到哪几个datanode服务器上。
4)namenode返回3个datanode节点,分别为dn1、dn2、dn3。
5)客户端通过FSDataOutputStream模块请求dn1上传数据,dn1收到请求会继续调用dn2,然后dn2调用dn3,将这个通信管道建立完成。
6)dn1、dn2、dn3逐级应答客户端。
7)客户端开始往dn1上传第一个block(先从磁盘读取数据放到一个本地内存缓存),以packet为单位(大小为64k),dn1收到一个packet就会传给dn2,dn2传给dn3;dn1每传一个packet会放入一个应答队列等待应答。
8)当一个block传输完成之后,客户端再次请求namenode上传第二个block的服务器。(重复执行3-7步)。
。。。。。。
最终Client汇报完成。
NN会在写流程更新文件状态。

2.读流程

hadoop的读流程
1)客户端通过Distributed FileSystem向namenode请求下载文件,namenode通过查询元数据,找到文件块所在的datanode地址。
2)挑选一台datanode(就近原则,然后随机)服务器,请求读取数据。
3)线性和DN获取Block,最终合并为一个文件。
4)MD5验证数据完整性。

8.hadoop的文件权限

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

9.hadoop的安全模式

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

8.hadoop伪分布式的安装

1.jdk的安装

1.安装jdk
jdk的安装
2.配置jdk环境变量
jdk环境变量配置
jdk环境变量配置
jdk环境变量配置

2.免秘钥登录配置

配置目的:避免访问节点时每次都需要输入账号密码。
免秘钥配置
免秘钥配置
配置成功后会在.ssh目录下多一个公钥的文件。
免秘钥配置

3.hadoop环境变量配置

hadoop环境变量配置

4.hadoop的jdk环境变量

修改hadoop-env.sh、mapred-env.sh、yarn-env.sh的jdk配置,不用它默认的。
hadoop的jdk环境变量

5.配置主节点

在core-site.xml配置主节点。
配置主节点

6.配置副本数

在hdfs-site.xml中配置副本数,因为是伪分布式安装,所以副本只有一个。
配置副本数

7.配置从节点

在slaves文件中配置从节点,因为伪分布式安装,所以从节点也是服务器自己。
配置从节点

8.配置secondaryNameNode

在hdfs-site.xml中配置。
配置secondaryNameNode

9.配置临时目录

在core-site.xml中配置临时目录,用来存放nameNode,dataNode和nameSecondary的文件。如nameNode中存放edit_log,fsimage等;dataNode存放上传的文件等。
配置临时目录

10.格式化生成fsimage

格式化生成fsimage
格式化成功后会在临时目录下生成dfs目录和其子目录name的子目录中生成fsimage文件。
格式化生成fsimage

11.启动集群

会先后启动nameNode、dataNode、secondaryNameNode。
启动集群

12.可视化界面

登录地址:http://192.168.146.132:50070(登录不上,关闭Linux的防火墙试试)。
可视化界面

13.文件上传hadoop

创建文件上传的路径。
文件上传的路径
上传文件:hdfs dfs -put 上传文件
上传过程中,可视化界面的显示如下:
上传过程中
上传完成可以看到,可视化界面中有两个block,因为系统默认一个block的大小是128M,而我上传的文件是170M,所以分成了两块。
上传完成

9.配置的代码

1.免秘钥配置

ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys

2.core-site.xml

    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://ip(或者别名):9000</value>
    </property>
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/var/myfile/hadoop/local</value>
    </property>

3.hdfs-site.xml

    <property>
        <name>dfs.replication</name>
        <value>1</value>
    </property>
    <property>
        <name>dfs.namenode.secondary.http-address</name>
        <value>ip(或者别名):50090</value>
    </property>

10.hadoop全分布式的安装

1.安装前的准备

1.同步所有服务器的时间
同步所有服务器时间
2.所有节点安装jdk
所有节点安装jdk
3.关闭所有服务器防火墙 关闭所有服务器防火墙
4确认home目录下有没有没有.ssh文件,没有要登录
home下没有.ssh要登录

2.主节点免秘钥登录配置

1.主节点配置免秘钥
主节点配置免秘钥
2.分发主节点公钥给从节点
分发主节点公钥给从节点
3.从节点追加主节点公钥到认证文件 从节点追加主节点公钥到认证文件

3.环境配置

1.修改hadoop的jdk环境变量 修改hadoop的jdk环境变量
2.配置主节点和临时文件
配置主节点和临时文件
3.配置副本数和secNode
配置副本数和secNode
4.指定从节点
指定从节点

4.其它节点配置

1.将配置好的hadoop包分发到其它节点
将配置好的hadoop包分发到其它节点
2.配置所有的hadoop环境变量
配置所有的hadoop环境变量

5.启动

1.格式化主节点
格式化主节点
2.启动主节点的hadoop
启动主节点的hadoop

6.启动失败,重配

1.配置别名 配置别名
配置别名
配置别名
2.重新分发公钥 重新分发公钥
3.重新格式化,要删除所有节点的临时文件再格式化,否则versionID不一样
删除所有节点的临时文件
4.设置根目录
设置根目录
5.启动成功 启动成功

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码支持
你说多少就多少

比五毛钱特效专业哦