Hadoop教案(小白学习超详细版大全)
1.什么是云计算?
大数据,虚拟化,nosql
为什么学习大数据(hive)
如何抓着用户,分析建康情况,GPS等很多终端产生数据,需要对数据进行分析。
互联网巨头越来越大,需要职位越来越多,入行越早越好,大公司都在使用hadoop。
Hbase hive(文件) mysql oracle
就业前景:搜智联招聘(数据开发)
缺口大,高大尚,几年能成为专家,2年左右。今天想来,明天还想来。智联找工作,北京
搜hadoop,1000多家招聘单位,腾讯,baidu啊里,软通动力都招hadoop.3年到5年
,金融,电信行业需要大数据。
2.hadoop logo名称来源,hadoop作者女儿给你一个吃饱大象起的名字。google也是一个小孩子起的。
3.hadoop是什么,是大数据这块
What Is Apache Hadoop? CDH_hadoop
The Apache? Hadoop? project develops open-source开源 software for reliable, scalable, distributed computing-分布式.CDH
解决问题:
海量数据的存储(HDFS)网盘-百度 360 HDFS -hadoop file system
海量数据的分析(MapReduce)分布式计算模型
资源管理调度(YARN)有了yarn可以运行各种计算模型,storm,spark,mapreduce可以运行在yarn上,原来只能运行mapreduce.
作者:DougCutting-lucene的作者(其介绍可以看hadoop之父)
CDH Cloudera公司开发的的项目,商业化包装(EJB->spring)
hadoop受Google三篇论文的启发(GFS-google file system 2002年、MapReduce 2004年、BigTable-2006年大表-发展成hbase) Hadoop(存储和计算:hive hbase ) ->spark(计算框架)
4.hadoop能干什么
实时计算
hadoop擅长离线日志日志分析-推荐用户,朋友的朋友,亲密度,一度人脉二度。
facebook就用Hive(mapreduce)来进行日志分析,2009年时facebook就有非编程人员的30%的人使用HiveQL进行数据分析;淘宝搜索中的自定义筛选也使用的Hive;
利用Pig还可以做高级的数据处理,包括Twitter、LinkedIn(国外的网站) 上用于发现您可能认识的人,可以实现类似Amazon.com(ya ma xun)的协同过滤的推荐效果。淘宝的商品推荐也是!在Yahoo!的40%的Hadoop作业是用pig运行的,包括垃圾邮件的识别和过滤,还有用户特征建模。
(2012年8月25新更新,天猫的推荐系统是hive(现在使用storm),少量尝试mahout!
5.有哪些公司使用hadoop呢
Hadoop被公认是一套行业大数据标准开源软件,在分布式环境下提供了海量数据的处理能力。几乎所有主流厂商都围绕Hadoop开发工具、开源软件、商业化工具和技术服务。
今年大型IT公司,如EMC、Microsoft、Intel、Teradata、Cisco都明显增加了Hadoop方面的投入(现在很多公司都围绕着hadoop提供硬件支持,开源支持,国内华为,bat都在
用hadoop)。
hadoop在淘宝使用情况
从09年开始,用于对海量数据的离线处理,例如对日志的分析,交易记录的分析等
规模从当初的3~4百台节点,增加到现在的一个集群有3000个节点,淘宝现在已经有2~3个这样的集群
在支付宝的集群规模也有700台节点,使用Hbase对用户的消费记录可以实现毫秒级查询
示例,可以看淘宝资料(分区)
淘宝的数据魔方架构:myfox指mysql集群 ,prom指 hbase集群
(生意参谋,现在是生意参谋)
6.hadoop生态圈
ie等浏览器-用于收集信息来源地 -hive用于统计 -mapreduce用于计算 hbase用于存储 zookeeper动物管理员
Linux:
文件系统结构
Window系统结构
pwd 查看当前目录是谁
ls 查看当目录有哪些文件目录
ls /root作用显示/root目录下的文件和目录名
cd /root 切换/root的目录
vi的作用编辑文件内容 摁i键 退出ESC shift:wq enter 退出保存
tar命令作用:创建tar归档文件
centos系统目录:/etc/ /usr /local
ll cd vim
常用命令:
vim 编辑文件
tar -zxvf apache-storm-1.0.3.tar.gz -C /root/
cd
pwd
mkdir
more 翻页显示数据 ctr+c
tail –f 表示从末尾读取新内容tail -f -n 2 install.log -f监视
ls ll jps which ifconfig
rm删除
cp source dest
scp –r
scp -r jdk-7u65-linux-i586.tar.gz yuhui2:/root 把文件拷贝到 yuhui2主机root文件夹下
7.安装版本
下载
Apache官方版本(2.5.2) 帮助大家理解原理,自已安装
为了进一步理解hadoop架构
hadoop2.5.2伪分布式搭建.txt(本地模式,伪分布式,分布式(集群模式))
hadoop目录含义:
bin:Hadoop最基本的管理脚本和使用脚本的目录,这些脚本是sbin目录下管理脚本的基础实现,用户可以直接使用这些脚本管理和使用Hadoop。hdfs
etc:Hadoop配置文件所在的目录,包括core-site,xml、hdfs-site.xml、mapred-site.xml等从Hadoop1.0继承而来的配置文件和yarn-site.xml等Hadoop2.0新增的配置文件。
include:对外提供的编程库头文件(具体动态库和静态库在lib目录中),这些头文件均是用C++定义的,通常用于C++程序访问HDFS或者编写MapReduce程序。
lib:该目录包含了Hadoop对外提供的编程动态库和静态库,与include目录中的头文件结合使用。
libexec:各个服务对用的shell配置文件所在的目录,可用于配置日志输出、启动参数(比如JVM参数)等基本信息。
sbin:Hadoop管理脚本所在的目录,主要包含HDFS和YARN中各类服务的启动/关闭脚本。
share:Hadoop各个模块编译后的jar包所在的目录
免登录
8.hadoop核心
HDFS: Hadoop Distributed File System 分布式文件系统
mapreduce:并行计算模型
YARN: Yet Another Resource Negotiator (管理运算任务的程序)
资源管理调度系统(ResourceManager)
9.hadoop 1.0与2.0以上版本比较
2.0以后采用yarn(它可以运行spark,flink)运行管理,可以运行各种框架,当初只能运行mapreduce(jobtracker:resourcemanager,tasktracker:nodemanager)
10.yarn产生背景(yarn即能运java程序又能运行spark)
很多框架各自为战,storm, spark内存计算框架,有yarn可以统一运行。难以支持mapreduce之外的计算。
11.怎样解决海量数据存储
NFS分布式文件系统飞秋 a b等很多用户分享 其它用户能下载
主从结构
主节点,只有一个: namenode 2.0以后,可以有多个namenode
从节点,有很多个: datanode
namenode负责:负责管理
接收用户操作请求
维护文件系统的目录结构:hadoop只维护逻辑结构,并没真正文件夹
管理文件与block之间关系,block与datanode之间关系
datanode负责:负责存储
存储文件
文件被分成block存储在磁盘上
为保证数据安全,文件会有多个副本
Secondarynamenode:
start-dfs.sh
stop-dfs.sh
13.怎样解决海量数据的计算
如:求和 1+2+3+4+5+6+7
map1(1+2+3)map2(4+5) map3(6+7)
reduce进行汇总以上结果
如果有9亿个数,对于人或机算机来说,就不行了,如果采用hadoop就很好了。
可以很多运算切分成一个个小任务每个小任务有一个map对象运算,交给无数个机器并行计算,最后汇总。
14.hadoop集群物理分布
看截图,Rack表示机架,服务器,扁平的,可抽出来。switch交换机。
15.单点物理结构
主节点:服务器上,裸机,安装linux,在上面jvm,运行一些进程 3个进程,还有浏览器及hadoop的一些程序
从节点:
16.hadoop的布署方式
本地模式:eclipse时调试用。起一个map一个reduce(在哪提交在哪运行)
为分布模式:一台机器模拟多台机器,运行时不能提交给生产环境,可以在为模式下运行。
集群模式:
利用java操作hadoop,上传文件,下载文件,删除文件,查看
17.JavaAPI操作hdfs(复制hadoop fs下hdfs,common jar)
18.块概念(分块原因:存储的角度,分布式存储,计算角度:生产环境中,4G)
19.自已设计一个分布式存储系统,namenode负责管理,datanode负责存储数据。
把一个两百M的一个日志写到hdfs中,是怎样的一过程?
namenode相当于一个仓库管理员,维护一个账本。
datanode相当于仓库
client相当于提货人
client想把200M数据送到仓库中,是不能直接保存到namenode中,namenode只有一台电脑或两台,所以,只能保存到datanode里
client与namenode通信采用RPC方式。
TCP/IP
客户端的数据上传到hadoop文件系统的步骤:
1、客户端获取文件系统实例FileSyStem,并通过其create()方法获取文件系统输出流outputStream;
1.1、首先会联系名字节点NameNode,通过ClientProtocol.create()RPC调用,在名字节点上创建文件元数据,并获取文件状态FileStatus;
1.2、通过文件状态FileStatus构造文件系统输出流outputStream;
2、通过文件系统输出流outputStream写入数据;
2.1、首次写入会首先向名字节点申请数据块,名字节点能够掌握集群DataNode整体状况,分配数据块后,连同DataNode列表信息返回给客户端;
2.2、客户端采用流式管道的方式写入数据节点列表中的第一个DataNode,并由列表中的前一个DataNode将数据转发给后面一个DataNode;
2.3、确认数据包由DataNode经过管道依次返回给上游DataNode和客户端;
2.4、写满一个数据块后,向名字节点提交一个数据;
2.5、再次重复2.1-2.4过程;
hadoop fs –text和hadoop fs –copyFromLocal 命令的作用:
hadoop text text检测文件的编码,并尽可能将其解码为纯文本
hadoop fs –copyFromLocal 把linux文件系统下的文件上传到hadoop文件系统下。
hive与关系型数据库的区别:
Hive定位主要用在数据分析,善于查询;
关系型数据库定位在业务数据增删改查
hadoop Java API流把D:/upload.txt上传到hdfs://192.168.38.101:9000/upload文件夹下:
//创建配置文件对象
Configuration conf=new Configuration();
try {
FileSystem sys=FileSystem.get(new URI("hdfs://192.168.38.101:9000"), conf);
FSDataOutputStream out=sys.create(new Path("hdfs://192.168.38.101:9000/upload/c.txt")); IOUtils.copyBytes(new FileInputStream("d:/upload.txt"), out, conf,true);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
同样道理,读也一样。在块的分布上,当客户端,在某一台电脑上,那么,就会在当前电脑分布一个块,另外一块会在另外一机架上,第三块和第二块一样,第四块开时,就随机了,但能要保证不会在某个机架上过多。
读过程:
20.分布式文件系统
数据量越来越多,在一个操作系统管辖的范围存不下了,那么就分配到更多的操作系统管理的磁盘中,但是不方便管理和维护,因此迫切需要一种系统来管理多台机器上的文件,这就是分布式文件管理系统。
是一种允许文件通过网络在多台主机上分享的文件系统,可让多机器上的多用户分享文件和存储空间。
通透性。让实际上是通过网络来访问文件的动作,由程序与用户看来,就像是访问本地的磁盘一般。
容错。即使系统中有某些节点脱机,整体来说系统仍然可以持续运作而不会有数据损失。
分布式文件管理系统很多,hdfs只是其中一种。适用于一次写入多次查询的情况,不支持并发写情况(写数据时,只能一块一块写,不能同时向多块写数据),小文件不合适。hdfs只能进行写进去和多次读(统计时),不支持修改。
常见分布式系统:GFS,HDFS,LUSTRE,CEPH,GridFs-mogodb,TFS-淘宝
21.hdfs shell
hdfs是建立在linux基础上的一个文件系统,所以 hdfs也提供了一些操作命令。
hadoop fs 回车可以看到很多操作 regist username userpwd
-put 上传
hadoop fs –put xx / 把linux文件系统下的文件上传到hadoop文件系统的/下
hadoop fs -ls / 查询hdfs上文件列表
-rw-r--r--1 root supergroup 13 2017-03-22 04:29 /aa.txt
权限 份数 所属用户 组 大小 上传时间 文件名
[-appendToFile <localsrc> ... <dst>] 将一个文件追加到另一个文件上
hadoop fs -appendToFile /root/words.txt /aaa.txt
[-cat [-ignoreCrc] <src> ...]
[-checksum <src> ...]用少 hadoop fs -checksum /my.txt
[-chgrp [-R] GROUP PATH...] 改变组 hadoop fs -chgrp root /xxx 把原来组改成root
[-chmod [-R] <MODE[,MODE]... | OCTALMODE> PATH...] 改变权限
hadoop fs -chmod +x /aa.txt 改变hadoop文件系统中文件或目录读写执行权限
hadoop fs -chmod a+x /aa.txt
hadoop fs -chmod o+rwx /aa.txt
[-chown [-R] [OWNER][:[GROUP]] PATH...] 改变所属用户权限 hadoop fs -chown oracle /xxx 改成oracle
[-copyFromLocal [-f] [-p] <localsrc> ... <dst>] 把linux本地文件上传至hdfs
hadoop fs -copyFromLocal /root/aa.txt /
[-copyToLocal [-p] [-ignoreCrc] [-crc] <src> ... <localdst>]
[-count [-q] <path> ...]
hadoop fs -copyFromLocal /root/aa.txt /
hadoop fs -count /
10 8 122333
10个文件夹 8个文件 大小
[-cp [-f] [-p | -p[top hdfs文件 到 hdfs 另外一个地方
hadoop fs -cp /aaa.txt /stu
[-createSnapshot <snapshotDir> [<snapshotName>]]
[-deleteSnapshot <snapshotDir> <snapshotName>]
[-df [-h] [<path> ...]]
[-du [-s] [-h] <path> ...]
[-expunge]
[-get [-p] [-ignoreCrc] [-crc] <src> ... <localdst>]
hadoop fs -get /aaa.txt /root/xd1 把hdfs 文件下载到本地文件
[-getfacl [-R] <path>]
[-getfattr [-R] {-n name | -d} [-e en] <path>]
[-getmerge [-nl] <src> <localdst>]
[-help [cmd ...]]
[-ls [-d] [-h] [-R] [<path> ...]]
-lsr /
r递归查询
5:12 /wcout/_SUCCESS 大小
hadoop fs –cat /hive/a.txt: 查看hadoop /hive下的a.txt文件文本内容
hadoop fs -mkdir /hadoop 在hadoop文件系统中创建/hadoop目录
hadoop fs –count /usr:统计hadoop文件系统/usr下的文件和目录情况
[-mkdir [-p] <path> ...]创建目录
Hadoop fs -mkdir /aa
[-moveFromLocal <localsrc> ... <dst>]从本地剪切文件并上传到hdfs
hadoop fs –moveFromLocal /root/xx.txt /
[-moveToLocal <src> <localdst>]
[-mv <src> ... <dst>] -
Hadoop -mv 把hadoop文件系统下的文件剪贴hadoop的文件系统中
[-put [-f] [-p] <localsrc> ... <dst>]
[-renameSnapshot <snapshotDir> <oldName> <newName>]
[-rm [-f] [-r|-R] [-skipTrash] <src> ...] 删除 -rm -r可以删除文件夹
Hadoop fs –rm -r -f /aa 把hadoop文件系统下的文件或目录递归删除
[-rmdir [--ignore-fail-on-non-empty] <dir> ...]删除空目录
[-setfacl [-R] [{-b|-k} {-m|-x <acl_spec>} <path>]|[--set <acl_spec> <path>]]
[-setfattr {-n name [-v value] | -x name} <path>]
[-setrep [-R] [-w] <rep> <path> ...]
[-stat [format] <path> ...]
[-tail [-f] <file>] 查看后面几行 -tail /
[-test -[defsz] <path>]
[-text [-ignoreCrc] <src> ...] 查看 内容 相当 于 cat
[-touchz <path> ...] 创建空文件
hadoop fs – touchz /out.txt
[-usage [cmd ...]]
-chmod a+x
前3位是u用户
中间3位是g组
后3位 o其它人
-chmod -R -x /wcount wcount下子文件和子文件夹都去掉权限 R表示递归
- chown supergroup /aa.txt 更改所属用户
-chgrp root /aa.txt 更改用户组
-chown -R supergruop:root /aa.txt 把aa.txt的所属用户改为supergroup 用户改为root R递归
hdfs dfs -ls /也可以 2.0新出
读、写、运行三项权限可以用数字表示,就是r=4,w=2,x=1。所以,上面的例子中的rw-r--r--用数字表示成644。
反过来说777就是rwxrwxrwx,意思是该登录用户(可以用命令id查看)、他所在的组和其他人都有最高权限。
配置hadoop的最小blocksize,必须是512的倍数。
-------------------------------------------
[hdfs-site.xml]
设置块大小
dfs.blocksize=134217728
67108864
write,进行校验,512进行一次校验。
使用oiv命令查询hadoop镜像文件
------------------------------
hdfs oiv -i fsimage -o a.xml -p XML //查看镜像文件。
Namenode对它操作:
Shell:命令put delete 接收datanode心跳
hdfs oev fsimage -o b.xml -p XML -i edits_inprogress_0000000000000000141
hdfs oiv fsimage -p XML -o c.xml -i fsimage_0000000000000000136
editsprogress进行滚动-edits:要么达到滚动时间(可配置:3600s ),当editsprogress达到时64M也会滚动,当第一次启动hadoop,1m后,也会滚动。
hdfs dfsadmin管理命令
----------------------
$>hdfs dfsadmin //查看帮助
$>hdfs dfsadmin -help rollEdits //查看指定命令的帮助
$>hdfs dfsadmin -rollEdits //滚动编辑日志
启动hdfs时,镜像文件编辑日志进行融合,编辑日志滚动。
查看hdfs是否在安全模式
------------------------
$>hdfs dfsadmin -safemode enter //进入
$>hdfs dfsadmin -safemode get //查看
$>hdfs dfsadmin -safemode leave //退出
$>hdfs dfsadmin -safemode wait //等待 可以等待到hdfs离开安全模式,就可以执行删除文件。
hadoop
--------------------
$>hadoop fs //hdfs dfs
$>hadoop checknative //检查压缩库本地安装情况
$>hadoop namenode -format //格式化名称
Hdfs namenode -format 干了什么事?创建了/usr/local/hadoop/tmp,大家不要多次格式化,每次格式化都会产生新的clusterid
1、安装yum依赖
yum install -y automake autoconf gcc-c++ cmake libedit libtool openssl-devel ncurses-devel
解压
tar -xvf snappy-1.1.3.tar.gz cdsnappy-1.1.3
./configure
make
make install
ll /usr/local/lib | grepsnappy
https://www.cnblogs.com/jancco/p/4447756.html 端口
hdfs管理命令
--------------------
hdfs dfsadmin //
保存名字空间,需要进入安全模式
--------------------------------
$>hdfs dfsadmin -saveNamespace //合并镜像和日志文件
hadoop启动命令
------------------
$>start-all.sh //start-dfs.sh + start-yarn.sh
$>start-dfs.sh //hadoop-daemon.sh start namenode
//hadoop-daemons.sh start datanode
$>start-yarn.sh //yarn-daemon.sh start resourcemanager
//yarn-daemons.sh start nodemanager
jps
kill -9 3054 杀死进程
配额管理(quota)
-------------------
[目录配额]
计算目录下的所有文件的总个数。如果1,表示空目录。
$>hdfs dfsadmin -setQuota 1 dir1 dir2 //设置目录配额
$>hdfs dfsadmin -clrQuota /dir1 /dir2 //清除配额管理
[空间配额]
计算目录下的所有文件的总大小.包括副本数.
空间配置至少消耗384M的空间大小(目录本身会占用384M的空间)。
128 1
$>hdfs dfsadmin -setSpaceQuota 3 /data
$>hdfs dfsadmin -clrSpaceQuota /dir1 //清除配额管理
$>echo -n a > k.txt
$>hdfs dfs -put k.txt data2
$>hdfs dfsadmin -clrSpaceQuota dir1 //清除配额管理
我们需要设置的空间配额不是文件本身的大小,而是block占用的磁盘的最大值,比如,上面实验中的文件大小是9748字节,即9.5k左右,hdfs-site.xml中配置的block大小是128MB,副本数是3,文件可以存储在1个block内,所以需占用的磁盘总量最大值(即block的size)是128*3=384MB!
---------------------
402653184
hadoop fs -count -q <directory>...<directory>
1. 名称配额总量(none代表没设定)
2. 名称配额剩余量(inf代表没设定)
3. 空间配额总量(none代表没设定)
4. 空间配额剩余量(inf代表没设定)
5. 目录数
6. 文件数
7. 内容占用空间
8. 目标地址
22.hdfs架构
NameNode负责管理节点
1)管理账本 2)负责监控集群文件状态(哪个块坏了,少了)并负载均衡3)接收客户端请求(删除文件,增加文件,修改文件,创建目录)
DataNode负责存储block ,另外一方法负责向namenode汇报自己的块 3.向namenode发送心跳
SecondaryNameNode负责助理帮助完成,备份fsimage和Edits
参考图hdfs架构
client想读取数据: 解释:首先client和namenode交互获取metadata,而namenoder的元数据信息保存namenode内存并且硬盘里面也保存一份元数据,元数据会序列化到磁
盘。当client获取到元数据信息之后,就去datanode依次以一块一块获取文件,client在去datanode读取数据时,因为块数据分布在不同电脑上,所以client会以就近原则去
读取数据(如果通过一次交换机就能把数据读完,就是比较近)。namenode 会给datanode一些信息进行水平复制。
meatadata细节信息
NameNode(FileName, replicas, block-ids,id2host...)namenode包括的信息
示例: md5 传输过程
/test/a.log, 3 ,{blk_1,blk_2}, [{blk_1:[h0,h1,h3]},{blk_2:[h0,h2,h4]}]
文件名 3份 两块 第一块 三台机ip 第二块 三台机ip
所以client只要得元数据,就能去下载数据了。client在读取数据时,如果一块坏了,就会到另一个电脑读取同块。如何判断某个块是否坏了呢?主要通过校验盒来实现的,
在上传文件时,元数据里,会根据文件内容,生成一个md5值,如果文件内容发生变化了,那么下载之后,再生成md5时,值是不一样的,所以就能判断是否坏了。不过,hdfs
校验合算法是采用crc32算法,md5慢
1)namenode
是整个文件系统的管理节点。它维护着整个文件系统的文件目录树(就是浏览文件时文件树,打开hdfs的文件目录),文件/目录的元信息和每个文件对应的数据块列表。接收用户的操作请求,接收client的请求,上传下载删除文件,namenode操作datanode,块的复制。
文件包括:
fsimage:元数据镜像文件。存储某一时段NameNode内存元数据信息,为访问安全,把内存元文件存到磁盘,存储位置有hdfs-site.xml中dfs.name.dir指定。
edits:操作日志文件。记录用对文件操作,如上传文件,删除文件
fsimage:保存最近一次checkpoint的时间.最近一次做还原点时间。像操作系统还原点。
以上这些文件是保存在linux的文件系统中,能在文件系统中找到。在tmp文件中,有三个文件夹data(保存有关datanode信息),name(保存namenode元数据,可以进入name文件
夹里能找edit及镜像文件) namesecondary(辅助同步元数据)
2)namenode工作特点:
Namenode始终在内存中保存metedata,用于处理“读请求”
到有“写请求”到来时,namenode会首先写editlog到磁盘(当写请求向namenode时,namenode会把元数据信息告诉client,client开始写,同时,namenode会向editor记录,
往磁盘写第一块写成功了,第二块写成功了..即元数据),即,向edits文件中写日志,成功返回后,才会修改内存(向内存写一条元数据),并且向客户端返回.
Hadoop会维护一个fsimage文件,也就是namenode中metedata的镜像,但是fsimage不会随时与namenode内存中的metedata保持一致,而是每隔一段时间通过合并edits文件来更
新内容(这是伪分布式的特点,集群会即时的)。Secondarynamenode就是用来合并fsimage和edits文件来更新NameNode的metedata的。
3)Secondarynamenode作用
HA的一个解决方案。但不支持热备。配置即可(fs.checkpoint.period 多久合并一次)edits_process
。
执行过程:从NameNode上下载元数据信息(fsimage,edits),然后把二者合并,生成新的fsimage,在本地保存,并将其推送到NameNode,替换旧的fsimage.
默认在安装在NameNode节点上,但这样...不安全(namenode坏了,seconderyname也坏了,所以不按全,如果分两个电脑就安全)!
工作流程:
fs.checkpoint.period 指定两次checkpoint的最大时间间隔,默认3600秒,设置secondarynamenode多久下载一次fsiamges。
fs.checkpoint.size??? 规定edits文件的最大值,一旦超过这个值则强制checkpoint,不管是否到达最大时间间隔。默认大小是64M
当seconderynamenode合并好edits和fsimage后,会推送给namenode,把namenode的旧fsimage替换掉,同时,把原来的edits fsimage删除掉。
切换edits的意思时,当secondarynamenode下载edits时,会产生一个新的edits_new,当再产生日志时,就写入新的edits_new,当fsimage被替换掉之后,edits_news被更新成edits
3)datanode
提供真实文件数据的存储服务。
文件块(block):最基本的存储单位。对于文件内容而言,一个文件的长度大小是size,那么从文件的0偏移开始,按照固定的大小,顺序对文件进行划分并编号,划分好的每一个块称一个Block。HDFS默认Block大小是128MB,以一个256MB文件,共有256/128=2个Block.
不同于普通文件系统的是,HDFS中,如果一个文件小于一个数据块的大小,并不占用整个数据块存储空间
Replication。多复本。默认是三个。
25.源码分析
当我们运行上面clientRPC.jar时, linux里发现多个进程,所一个进程就是一个类
当jps查看进程时,有NameNode,SecondarNameNode,DataNode进程,它们分别也是一个类,一般讲进程名与类名相同,所以我们可以搜索类时,能搜索到NameNode
在eclipse里 ctr+shift+t 能搜索到NameNode
通过读取源码发现三个关键地方。1)从配置文件获取FileSystem的实现类DisatrtibuteFileSystem对象。2)在初始化fs时,创建DFSClient,在DFSClient里创建代理对象,而这个代理对像就是NameNode的代理对象,从而获取文件的保存位置,利用DataInpustream从最近block里读取信息。
初始化FileSystem,然后客户端(client)用FileSystem的open()函数打开文件
FileSystem用RPC调用元数据节点,得到文件的数据块信息,对于每一个数据块,元数据节点返回保存数据块的数据节点的地址。
FileSystem返回FSDataInputStream给客户端,用来读取数据,客户端调用stream的read()函数开始读取数据。
DFSInputStream连接保存此文件第一个数据块的最近的数据节点,data从数据节点读到客户端(client)
当此数据块读取完毕时,DFSInputStream关闭和此数据节点的连接,然后连接此文件下一个数据块的最近的数据节点。
当客户端读取完毕数据的时候,调用FSDataInputStream的close函数。
在读取数据的过程中,如果客户端在与数据节点通信出现错误,则尝试连接包含此数据块的下一个数据节点。
失败的数据节点将被记录,以后不再连接。
快照
(1)防止用户的误操作
管理员可以通过滚动的方式来对重要的目录进行创建snapshot的操作,这样在系统中就存在针对某个目录的多个快照版本。当用户误删除掉某个文件时,可以通过最新的snapshot来进行相关的恢复操作。
(2)备份集群或者重要目录
管理员可以使用snapshot来进行整个集群,或者某些目录、文件的备份。管理员以某个时刻的snapshot做为备份的起始结点,然后通过比较不同备份之间差异性,来进行增量备份。
(3)在原始数据上进行测试或者实验
经常有业务部门需要在某些重要数据上不断的进行某些测试或者实验,某些程序的bug可能会直接将原始的数据破坏掉,所以为了防止这种情况的发生,管理员可以临时的为用户针对要操作的数据来创建一个snapshot,然后让用户在对应的snapshot上进行相关的实验和测试,从而避免对原始数据的破坏。
(4)灾难的备份
可以将集群某个时刻的snapshot拷贝到远程的备份集群,从而实现远程的灾难备份。
1、为某个目录打开snapshot的功能
hdfs dfsadmin –allowSnapshot /dir1
2、查看已经开启了snapshot的目录列表
hdfs lsSnapshottableDir
3、为开启了snapshot功能的目录创建一个snapshot
hdfs dfs -createSnapshot /dir1 one
4、对开启了snapshot功能的目录执行删除操作,会出现下面的错误提示,即不允许删除已经开启了snapshot功能的目录
hdfs dfs -rmr /tmp/important_dir
错误提示:
rmr: Failed to move to trash: hdfs://ptmind-cluster/tmp/important_dir: The directory /tmp/important_dir cannot be deleted since /tmp/important_dir is snapshottable and already has snapshots
5、删除开启了snapshot功能的目录下的文件
hdfs dfs -rm /tmp/important_dir/important_file.txt
文件被成功的删除掉,那如果是误删除了此文件呢?该如何进行恢复呢?
6、恢复已经被误删除的文件
查看.snapshot子目录下,是否包含已经被删除的文件?发现包含被误删除的文件。
hadoop fs -ls /tmp/important_dir/.snapshot/important_dir_snapshot
将误删除的文件从.snapshot子目录拷贝到之前的目录下
hadoop fs -cp /tmp/important_dir/.snapshot/important_dir_snapshot/important_file.txt /tmp/important_dir
hdfs dfs -cp /stu/.snapshot/kuaizhao /stu
至此,被误删除的文件被成功的恢复了
其他相关操作:
1、对snapshot进行重命名
hdfs dfs -renameSnapshot
hdfs dfs -renameSnapshot /quota1 quota quo
2、删除snapshot
hdfs dfs -deleteSnapshot
hdfs dfs –deleteSnapshot /quota1 quo
3、禁止某个目录的snapshot特性
hdfs dfsadmin –disallowSnapshot /quota1
start-balancer.sh -threshold 5
fsck:查看磁盘的健康状况
hadoop fsck-blocks /user 查询 user文件夹块的信息
hadoop fsck -blocks -locations -files /user //查看文件位置信息
hadoop fsck -delete 删除损坏的文件
-files:显示文件名、大小、块数、是否可用
-blocks:显示每个块在文件中的信息,一个块一行
-racks:显示每个块所在机架位置以及datanode位置
Minimally replicated blocks:100033最小副本数
over-replicated blocks: 0 (0.0 %) 副本数高出设定默认复制级别参数的数据块文件所占比率
Under-replicated blocks: 0 (0.0 %)
副本数低于设定默认复制级别参数的数据块文件所占比率
Mis-replicated blocks: 0 (0.0 %) 错误复制的块
Default replication factor: 2 副本份数
Average block replication: 2.658721 实际平均副本数
Corrupt blocks: 0 损坏的block数
Missing replicas: 0 (0.0 %) 缺失副本数
Number of data-nodes: 3 数据节点数
Number of racks: 1 机架数,如果没配置机架,默认都是1
节点的服役和退役(hdfs)
----------------------
[添加新节点]
1.在dfs.include文件中包含新节点名称,该文件在nn的本地目录。
[白名单]
[yuhui1:/usr/local/hadoop/etc/hadoop/dfs.include.txt]
yuhui2
yuhui3
yuhui4
scp yuhui2
2.在hdfs-site.xml文件中添加属性.(yuhui1,yuhui2)
<property>
<name>dfs.hosts</name>
<value>/usr/local/hadoop/etc/hadoop/dfs.include.txt</value>
</property>
3.在nn上刷新节点(namenode)
$>hdfs dfsadmin -refreshNodes
4.在slaves文件中添加新节点ip(主机名)(四个都发一下)
Yuhui1
Yuhui2
Yuhui3
Yuhui4 //新添加的
5.单独启动新的节点中的datanode
[yuhui4]
$>hadoop-daemon.sh start datanode
副本放置策略:
3 -1放到与客户端最近rack机架一份
[退役]
1.添加退役节点的ip到黑名单,不要更新白名单.
[/usr/local/hadoop/etc/hadoop/dfs.hosts.exclude.txt]
yuhui4
2.配置hdfs-site.xml(yuhui1,yuhui2)
<property>
<name>dfs.hosts.exclude</name>
<value>/usr/local/hadoop/etc/dfs.hosts.exclude.txt</value>
</property>
3.刷新nn节点
$>hdfs dfsadmin -refreshNodes
4.查看webui,节点状态在decommisstion in progress.
5.当所有的要退役的节点都报告为Decommissioned,数据转移工作已经完成。
6.从白名单删除节点,并刷新节点(yuhui1,yuhui2)
[yuhui1:/usr/local/hadoop/etc/hadoop/dfs.include.txt]
...
$>hdfs dfsadmin -refreshNodes
7.从slaves文件中删除退役节点
节点的服役和退役(yarn)
----------------------
[添加新节点]
1.在dfs.include文件中包含新节点名称,该文件在nn的本地目录。
[白名单]
[s201:/soft/hadoop/etc/dfs.include.txt]
s202
s203
s204
s205
2.在yarn-site.xml文件中添加属性.
<property>
<name>yarn.resourcemanager.nodes.include-path</name>
<value>/soft/hadoop/etc/dfs.include.txt</value>
</property>
3.在nn上刷新节点
$>yarn rmadmin -refreshNodes
4.在slaves文件中添加新节点ip(主机名)
s202
s203
s204
s205 //新添加的
5.单独启动新的节点中的nodemananger
[s205]
$>yarn-daemon.sh start nodemananger
[退役]
1.添加退役节点的ip到黑名单,不要更新白名单.
[/soft/hadoop/etc/dfs.hosts.exclude.txt]
s205
2.配置yarn-site.xml
<property>
<name>yarn.resourcemanager.nodes.exclude-path</name>
<value>/soft/hadoop/etc/dfs.hosts.exclude.txt</value>
</property>
3.刷新rm节点
$>yarn rmadmin -refreshNodes
4.查看webui,节点状态在decommisstion in progress.
5.当所有的要退役的节点都报告为Decommissioned,数据转移工作已经完成。
6.从白名单删除节点,并刷新节点
$>yarn rmadmin -refreshNodes
7.从slaves文件中删除退役节点