Hadoop实战笔记

一、基础知识(里面的内容包含大部分的Hadoop的内容,耐心的看完,肯定有收获,如有不同可留言或者上某度)

1、Hadoop生态系统介绍

(1)HBase

Nosql 数据库,key-value存储

最大化利用内存

(2)HDFS

简介:Hadoop distribute file system 分布式文件系统

  最大化利用磁盘

HDFS的设计原则:

文件以块(block)方式存储,默认块(64M)(如果一个文件没有64M,仍然占用一个block,但是物理内存可能没有没有64M),也可以自定义

通过副本机提高可靠度和读取吞吐量

每个区块至少分到三台DataNode上

单一master(NameNode)来协调存储元数据(metadata)单点故障? 一般是standby nameNode 或者采用NFS服务避免单点故障

客户端对文件没有缓存机制(No data caching)

NameNode主要功能提供名称查询服务,它是一个jetty服务器

NameNode保存metadata信息包括

(I)文件owership 和Permissions

(II)文件包含哪些块

(III)Block保存在哪个DataNode(由DataNode启动时上报)

NameNode的metadata信息在启动后会加载到内存

metadata存储在磁盘文件名为"fsimage" 和Block 的位置信息不会保存到fsimage中(hdfs/namenode/current fsimage)

DataNode(DN):保存block,启动DataNode线程的时候会向NN(NameNode)汇报block信息

通过向NN发送心跳保持与其联系(3秒一次),如果NN 10分钟没有收到DN(DataNode)的心跳,则认为其已经lost,则copy其他的block 过来

Block的副本放置策略:

一般情况是保存三份:

第一份副本:放置在上传文件的DN,如果是集群外提交,则随机挑选一台磁盘不太满,CPU不太忙的节点

第二份副本:放置在于第一个副本不同的机架的节点上

第三份副本:放置在和第二份副本同一个机架的另一个节点上(ps:一个NameNode带动4000节点)

Block大小和副本数由Client端上传文件HDFS时设置,其中副本数可以变更,Block是不可以再上传后变更的

数据损坏处理(可靠性):

当DN读取block的时候,它会计算checksum,如果计算后的checksum与block创建时值不一样,说明该block已经损坏的

Client读取其它DN上的block;NN标记该块已经损坏,然后复制block达到预期设置的文件备份数

DN在其文件创建后三周验证其checksum

SecondNameNode(SNN):(企业内很少使用,可以了解原理)(重点是fsimage和edits的机制)

将本地fsimage导入

是namenode的冷备份(无法做到自动的切换)

修改cluster所有的DN的NameNode地址

修改client端NameNode地址

or修改SNN IP为原NNIP

它的工作时帮助NN合并edits log  减少NN启动的时间

fsimage和edits(面试经常问到的问题):

当edits文件很大的时候,NameNode在启动的时候需要逐一每条的执行这些edits文件,这就严重影响到了整个HDFS的启动时间,这问题在SecondaryNameNode机制将edits文件合并到fsimage中,使其得到解决,SecondaryNameNode的工作流程(fsimage和edits log):

1、SNN在一个checkpoint时间点和NameNode进行通信,请求NameNode停止使用edits文件记录相关操作而是暂时将新的writes操作写到新的文件edit.new来

2、SNN从NN上copy fsimage and edits ,通过HTTP Get的方式从NameNode中将fsimage和edits文件下载回来本地目录中

3、SNN中合并edits和fsimage,SNN将从NameNode中下载回来的fsimage加载到内存中,然后逐条执行edits文件中的各个操作项,使得加载到内存中的fsimage中包含edites中的操作,这个过程就是所谓的合并了。

4、在SNN中合并完fsimage和edites文件后,需要将新的fsimage回传到NameNode上,这个是通过HTTP Post方式进行的

5、NameNode将从SNN接受到的新的fsimage替换掉旧的fsimage,了,同时edites.new文件转换了通常的edites文件,这样edites文件的大小就得到了减少,SNN整个合并以及和NameNode

安全模式:

NameNode启动的时候,首先将映像文件(fsimage)载入内存,并执行编辑日志(edits)中的各项操作

一旦在内存中成功建立文件系统元数据的映射,则创建一个新的fsimage文件,这个操作不需要secondaryNameNode和一个空的编辑日志

NameNode开始监听RPC和Http请求

此刻namenode运行在安全模式,即namenode的文件系统对于客户端来说是只读的

系统中数据块位置并不是有namenode维护的,而是以块列表形式存储在datanode中

查看namenode处于哪个状态

Hadoop dfsadmin -safemode get

进入到安全模式(Hadoop)启动的时候是在安全模式

hadoop dfsadmin -safemode enter

退出安全模式;

hadoop dfsadmin -safemode leave

HDFS的读写过程(Hadoop 学习的精髓部分,编程开发必备前提知识,没有理由,必须学好^_^!):

(1)客户端(client)用FileSystem的open()函数打开文件

(2)DisbutedFileSystem用RPC调用元数据节点,得到文件的数据块信息

(3)对于每一个数据块,元数据节点返回保存数据块的数据节点的地址

(4)DistributedFileSystem返回FSDataInputStream给客户端,用来读取数据

(5)客户端调用Stream的read()函数开始读取数据

(6)DFSInputStream 连接保存此文件第一个数据块的最近的数据节点

(7)Data从数据节点读取到客户端(client)

(8)当此数据块读取完毕时,DFSInputStream关闭和此数据节点的链接,然后连接此文件下一个数据最近的节点

(9)当客户端读取完毕数据的时候,调用FSDataInputStream的close函数

(10)在读取数据的过程中,如果客户端在于数据节点通信出现错误,则尝试连接包含此数据库的下一个数据节点

失败的数据节点将被记录,以后不再连接

写文件的过程:

(1)客户端调用creat()来创建文件

(2)DistributedFileSystem用RPC调用元数据节点,在文件系统的命名空间中创建一个新的文件

(3)元数据节点首先确定文件原来不存在,并且客户端有创建文件的权限,然后创建新文件

(4)DistributedFileSystem返回DFSOutStream,客户端用于写数据

(5)客户端开始写入数据,DFSOutStream 将数据分成块,写入data queue

(6)Data Stream 将数据块写入pipeline中的第一个数据节点,第一个数据节点将数据块发送给第二个数据节点,第二个数据节点将数据发送给第三个数据节点

(7)DFSOutStream为发出去的数据块保存了ack queue,等待pipeline中的数据节点告知数据已经写入

如果数据节点在写入的过程中失败:

关闭pipeline,将ack queue中的数据块放入data queue的开始

当前的数据块在已经写入的数据节点中被元数据节点赋予新的标示,则错误节点重启后能够察觉其数据块已经过时

,会被删除

失败的数据节点从pipeline中移除,另外的数据块则写入pipeline中的另外两个数据节点

元数据节点则被通知此数据块是复制块数不足,将来会再创建第三份备份

当客户端结束写入数据,则调用stream的close函数,此操作将所有的数据块写入pipeline中的数据节点,并等待ack queue返回成功。最后通知元数据节点写入完毕。

HDFS开发常用的命令(类shell语言):

创建一个文件夹:

Hadoop fs -mkdir 文件夹

eg:Hadoop fs -mkdir /usr/hadoop/myfile

(文件夹)

上传一个文件:

Hadoop fs -put 文件 Hadoop的文件夹

eg:Hadoop fs -put /wordcount.jar /usr/hadoop/myfile

删除文件

Hadoop fs -rm 文件

查看一个文件夹里面有哪些内容文件?

Hadoop fs -ls 文件

查看文件的内容

Hadoop fs -text/ 文件

Hadoop管理员常用命令:

Hadoop job -list 列出正在运行的job

hadoop job -kill<job_id> kill job

Hadoop fsck 检查HDFS块状态,是否损坏

Hadoop dfsadmin -report 检查HDFS块状态,包括DN信息

Hadoop distcp hsfs:/// hdfs:// 并行拷贝

(3)MapReduce

(1)编程模型,主要用来做数据的分析

(2)最大化利用CPU

时间: 2024-10-10 13:18:56

Hadoop实战笔记的相关文章

Hadoop学习笔记(8) ——实战 做个倒排索引

Hadoop学习笔记(8) ——实战 做个倒排索引 倒排索引是文档检索系统中最常用数据结构.根据单词反过来查在文档中出现的频率,而不是根据文档来,所以称倒排索引(Inverted Index).结构如下: 这张索引表中, 每个单词都对应着一系列的出现该单词的文档,权表示该单词在该文档中出现的次数.现在我们假定输入的是以下的文件清单: T1 : hello world hello china T2 : hello hadoop T3 : bye world bye hadoop bye bye 输

Hadoop阅读笔记(四)——一幅图看透MapReduce机制

时至今日,已然看到第十章,似乎越是焦躁什么时候能翻完这本圣经的时候也让自己变得更加浮躁,想想后面还有一半的行程没走,我觉得这样“有口无心”的学习方式是不奏效的,或者是收效甚微的.如果有幸能有大牛路过,请指教如何能以效率较高的方式学习Hadoop. 我已经记不清圣经<hadoop 实战2>在我手中停留了多久,但是每一页每一章的翻过去,还是在脑壳里留下了点什么. 一段时间以来,我还是通过这本书加深以及纠正了我对于MapReduce.HDFS乃至Hadoop的新的认识.本篇主要介绍MapReduce

Hadoop阅读笔记(三)——深入MapReduce排序和单表连接

继上篇了解了使用MapReduce计算平均数以及去重后,我们再来一探MapReduce在排序以及单表关联上的处理方法.在MapReduce系列的第一篇就有说过,MapReduce不仅是一种分布式的计算方法,更是一种解决问题的新思维.新思路.将原先看似可以一条龙似的处理一刀切成两端,一端是Map.一端是Reduce,Map负责分,Reduce负责合. 1.MapReduce排序 问题模型: 给出多个数据文件输入如: sortfile1.txt 11 13 15 17 19 21 23 25 27

Hadoop阅读笔记(二)——利用MapReduce求平均数和去重

前言:圣诞节来了,我怎么能虚度光阴呢?!依稀记得,那一年,大家互赠贺卡,短短几行字,字字融化在心里:那一年,大家在水果市场,寻找那些最能代表自己心意的苹果香蕉梨,摸着冰冷的水果外皮,内心早已滚烫.这一年……我在博客园-_-#,希望用dt的代码燃烧脑细胞,温暖小心窝. 上篇<Hadoop阅读笔记(一)——强大的MapReduce>主要介绍了MapReduce的在大数据集上处理的优势以及运行机制,通过专利数据编写Demo加深了对于MapReduce中输入输出数据结构的细节理解.有了理论上的指导,仍

Hadoop阅读笔记(一)——强大的MapReduce

前言:来园子已经有8个月了,当初入园凭着满腔热血和一脑门子冲动,给自己起了个响亮的旗号“大数据 小世界”,顿时有了种世界都是我的,世界都在我手中的赶脚.可是......时光飞逝,岁月如梭~~~随手一翻自己的博客,可视化已经快占据了半壁江山,思来想去,还是觉得把一直挂在嘴头,放在心头的大数据拿出来说说,哦不,是拿过来学学.入园前期写了有关Nutch和Solr的自己的一些阅读体会和一些尝试,挂着大数据的旗号做着爬虫的买卖.可是,时间在流失,对于大数据的憧憬从未改变,尤其是Hadoop一直让我魂牵梦绕

Hadoop阅读笔记(七)——代理模式

关于Hadoop已经小记了六篇,<Hadoop实战>也已经翻完7章.仔细想想,这么好的一个框架,不能只是流于应用层面,跑跑数据排序.单表链接等,想得其精髓,还需深入内部. 按照<Hadoop阅读笔记(五)——重返Hadoop目录结构>中介绍的hadoop目录结构,前面已经介绍了MapReduce的内部运行机制,今天准备入手Hadoop RPC,它是hadoop一种通信机制. RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络

shell 脚本实战笔记(4)--linux磁盘分区重新挂载

背景: Hadoop的HDFS文件系统的挂载, 默认指定的文件目录是/mnt/disk{N}. 当运维人员, 不小心把磁盘挂载于其他目录, 比如/mnt/data, /mnt/disk01, /mnt/diska时, HDFS会选择根分区, 当往HDFS里灌数据时, 导致的结果往往是根分区被快速的消耗尽, 而其他分区未见使用. 在CDH版本中, HDFS的配置如下所示: dfs.datanode.data.dir => /mnt/disk{N}/dfs/dn dfs.datanode.data.

shell 脚本实战笔记(9)--linux自动批量添加用户

前言: 添加linux用户帐号,这个相对简单, 在面对集群, 许多机器的时候, 我们该如何去做和实现? 这篇短文, 简单讲解一些思路, 尽可能地涉及周边的一些知识点. 不光是运维人员会面临这个问题, 对一个基于linux平台的集群服务或软件(比如hadoop集群), 有时也会涉及到这块. 应用场景: 是以centos 6.4作为演示的系统, 其他的系统有类同, 也有差异, 且以实战演练, 一步步的讲述下流程. *) 实战演练 查阅useradd的使用和参数选项useradd --help -d,

Hadoop实战视频教程完整版 完整的Hadoop大数据视频教程

分享一套迪伦老师的完整的Hadoop实战视频教程,教程从学习Hadoop需要的数据库.Java和Linux基础讲起,非常适合零基础的学员,课程最后结合了实战项目演练,理论结合实战,深入浅出,绝对是当前最为完整.实战的Hadoop教程. <Hadoop大数据零基础高端实战培训系列配文本挖掘项目(七大亮点.十大目标)> 课程讲师:迪伦 课程分类:大数据 适合人群:初级 课时数量:230课时 用到技术:部署Hadoop集群 涉及项目:京东商城.百度.阿里巴巴 咨询QQ:1337192913(小公子)