Hadoop历史:
2002年Apatch Nutch项目启动(Apatch
Lucene的创始人Dout Cutting负责),用于解决网页搜索问题
2003年谷歌发表论文,讲述了他们海量数据存储和网页搜索的解决思想,即GFS
2004年,受谷歌启发,Apatch Nutch分布式文件系统项目(NDFS)启动。同年,google用论文向世界介绍了他们的MapReduce
2005年,NDFS上也实现了Mapreduce,而且不仅仅适用与搜索环境。
2006年NDFS和MapReduce移出Nutch,形成Lucene的一个子项目,被称为为Hadoop。同年,Dout
Cutting进入雅虎,成立了专门的研究团队,把Hadoop发展成能进行web数据处理的系统。
2008年,Hadoop已经成为Apache的顶级项目
Hadoop分布式文件系统
HDFS设计思想
超大文件
专注大规模数据处理,Hadoop能存储PB级别的数据
流式数据访问,一次写,多次读
流式,指的是批量读取,而非随机读取。由于hadoop设计为做数据分析,所以并不需要修改。
硬件故障是常态,需要冗余。
集群化部署,量变引起质变,对单个节点硬件要求并不太高,不必考虑大型数据库级别的机器。
“数据就近与就远”原则
副本之间距离要远,读取数据时尽量从近的节点读取(机架策略)。
不适应在hadoop上运行的情况:
低延迟访问
Hadoop设计再与处理海量数据,并没有关注实时访问,可以考虑使用Hbase满足低延迟的需求。
大量小文件
因为每个文件都要在namenode内存中存储元数据,每个文件,目录和数据块大约占用150字节,如果小文件太多,势必影响namenode性能.
多用户写入和修改
Hadoop不支持多用户同时写入,也不支持修改。
HDFS概念
数据块:
HDFS中的文件被划分为多个块,独立存储
为了降低磁盘寻址开销时间,即一次读更多的块,可以适当调大块大小
由于map阶段一次读取一个块,如果这个块设置的过大,map任务较少,速度会变慢。
分块的好处:
1. 使一个文件可以存储在不同磁盘上
2. 简化管理,因为元数据由其他系统控制
3. 适用与容错处理和数据备份
列出磁盘中文件的块信息:
[~/hadoop/hadoop-1.2.1/conf]$hadoop fsck /user/huangxing/input files blocks
FSCK started by huangxing from /127.0.0.1
for path /user/huangxing/input at Thu Feb 27 23:40:14 CST 2014
.
/user/huangxing/input/README.html: Under replicated
blk_5326121453921514416_1014. Target Replicas is 3 but found 1 replica(s).
Status: HEALTHY
Total size:
114 B
Total dirs:
1
Total files:
1
Total blocks (validated): 1 (avg. block size 114 B)
Minimally replicated blocks: 1 (100.0 %)
Over-replicated blocks: 0 (0.0 %)
Under-replicated blocks: 1 (100.0 %)
Mis-replicated blocks: 0 (0.0 %)
Default replication factor: 1
Average block replication: 1.0
Corrupt blocks: 0
Missing replicas: 2 (200.0 %)
Number of data-nodes: 1
Number of racks: 1
FSCK ended at Thu Feb 27 23:40:14 CST 2014
in 4 milliseconds
The filesystem under path
'/user/huangxing/input' is HEALTHY
namenode和datanode
namenode和datanode是HDFS系统的两个重要概念
nodename节点管理系统命名空间,类似mongodb的配置服务器,维护系统文件和目录信息,所以连接namenode就可以查看整个目录树。注意,这些信息以一对文件保存在本地磁盘上:包括命名空间镜像文件和事务日志文件。Namenode还记录每个块的数据节点信息,但是不永久保存,这些信息在系统重启时候由datanode节点建立,然后传输给nodename节点。总结namenade作用:
(1) 管理文件系统的命名空间
(2) 记录每个文件数据块在各个Datanode上的位置和副本信息
(3) 协调客户端对文件的访问
(4) 记录命名空间内的改动或空间本身属性的改动
(5) amenode使用事务日志记录HDFS元数据的变化。使用映像文件存储文件系统的命名空间,包括文件映射,文件属性等
[~/hadoop/hadoop-1.2.1/name]$ls -lR
.:
总用量 12
drwxrwxr-x 2 huangxing huangxing 4096 3月 1 01:24 current
drwxrwxr-x 2 huangxing huangxing 4096 2月 27 01:12 image
-rw-rw-r-- 1 huangxing huangxing 0 3月 1 01:19 in_use.lock
drwxrwxr-x 2 huangxing huangxing 4096 2月 28 11:22
previous.checkpoint
./current:
总用量 1040
-rw-rw-r-- 1 huangxing huangxing
1048580 3月 1 01:29 edits
-rw-rw-r-- 1 huangxing huangxing 1501
3月 1 01:24 fsimage
-rw-rw-r-- 1 huangxing huangxing 8
3月 1 01:24 fstime
-rw-rw-r-- 1 huangxing huangxing 101
3月 1 01:24 VERSION
./image:
总用量 4
-rw-rw-r-- 1 huangxing huangxing 157 3月 1 01:24 fsimage
./previous.checkpoint:
总用量 1040
-rw-rw-r-- 1 huangxing huangxing
1048580 2月 28 11:29 edits
-rw-rw-r-- 1 huangxing huangxing 1501
2月 28 11:22 fsimage
-rw-rw-r-- 1 huangxing huangxing 8
2月 28 11:22 fstime
-rw-rw-r-- 1 huangxing huangxing 101
2月 28 11:22 VERSION
Fsimage就是映像文件,edit是事务日志
dataNode受客户端或者namenode调度,存储并检索数据块,并且定期向namenode发送他们存储的块的列表,datanode特性:
(1) 负责物理节点的存储管理,
(2) 一次写入,多次读取(不修改)
(3) 数据块组成,典型的块大小是64MB
(4) 据块尽量散布到各个节点
如果namenode节点崩溃,整个集群系统将不可用,hadoop提供两种容错策略:
1. 通过写入多个目的地,例如写入本地和NFS目录
2. 使用辅助namenode节点,定期编辑日志,合并命名空间,防止日志过大。由于他的状态总是落后namenode,所以一旦namenode失效,就会产生数据丢失。失效时,可以把nfs上的数据拷贝到辅助节点,使之以namenode运行。
Hadoop数据读取流程
(1) 客户端向namenode发出请求(集群中每个节点都知道namenode在哪里)
(2) Namenode收集datanode信息
(3) Namenode向客户端传送数据
(4) 客户端向datanode查询数据(就近原则读,利用带宽)
所以,namenode只是存储datanode元数据,但是他是放在内存里面的,定位效率较高
HDFS可用性
冗余副本策略
(1) 可以在hdfs-site.xml中设置复制因子指定副本数量
(2) 所有数据块都有副本
(3) Datanode启动时,遍历本地文件系统,产生一份hdfs数据块和本地文件的对应关系列
表(blockreport)汇报给namenode
机架策略
(1) 集群一般放在不同机架上,机架间带宽要比机架内带宽要小
(2) HDFS的“机架感知”
(3) 一般在本机架存放一个副本,在其它机架再存放别的副本,这样可以防止机架失效时
丢失数据,也可以提高带宽利用率,而且读取数据尽量不跨越机柜
心跳机制
(1) Namenode周期性从datanode接收心跳信号和块报告
(2) Namenode根据块报告验证元数据
(3) 按时发送心跳的datanode会被标记为宕机,不会再给它任何I/O请求(与impala类似)
(4) 如果datanode失效造成副本数量下降,并且低于预先设置的阈值,namenode会检测出这些数据块,并在合适的时机进行重新复制(讨论阈值)
(5) 引发重新复制的原因还包括数据副本本身损坏、磁盘错误,复制因子被增大等
安全模式
(1) node启动时会先经过一个“安全模式”阶段
安全模式阶段不会产生数据写,此阶段Namenode收集各个datanode的报告,当数据块达到最小副本数以上时,会被认为是“安全”的(否则不安全.
(2) 在一定比例(可设置)的数据块被确定为“安全”后,再过若干时间,安全模式结束。检测到副本数不足的数据块时,该块会被复制直到达到最小副本数。
校验和
校验和文件如下所示:
[~/hadoop/hadoop-1.2.1/data/current]$ls -lh
总用量 82M
-rw-rw-r-- 1 huangxing huangxing 138 2月 27 23:09
blk_-1148524011628330155
-rw-rw-r-- 1 huangxing huangxing 11 2月 27 23:09
blk_-1148524011628330155_1020.meta
-rw-rw-r-- 1 huangxing huangxing 64M 3月 1 01:29 blk_2941913032423535550
-rw-rw-r-- 1 huangxing huangxing 513K 3月 1 01:29 blk_2941913032423535550_2280.meta
-rw-rw-r-- 1 huangxing huangxing 4 3月 1 01:20 blk_3165250348914594670
-rw-rw-r-- 1 huangxing huangxing 11 3月 1 01:20 blk_3165250348914594670_1025.meta
-rw-rw-r-- 1 huangxing huangxing 114 2月 27 19:14
blk_5326121453921514416
-rw-rw-r-- 1 huangxing huangxing 11 2月 27 19:14
blk_5326121453921514416_1014.meta
-rw-rw-r-- 1 huangxing huangxing 9.1K 2月 28 11:18
blk_-7495815267218679520
-rw-rw-r-- 1 huangxing huangxing 83 2月 28 11:18
blk_-7495815267218679520_1023.meta
-rw-rw-r-- 1 huangxing huangxing 17M 3月 1 01:29 blk_-7878323630152692968
-rw-rw-r-- 1 huangxing huangxing 130K 3月 1 01:29 blk_-7878323630152692968_2280.meta
-rw-rw-r-- 1 huangxing huangxing 9.1K 2月 28 11:19
blk_-9178443108632575838
-rw-rw-r-- 1 huangxing huangxing 83 2月 28 11:19
blk_-9178443108632575838_1024.meta
-rw-rw-r-- 1 huangxing
huangxing 1.7K 3月 1 02:02
dncp_block_verification.log.curr
drwxrwxr-x 2 huangxing huangxing 4.0K 3月 1 01:25 subdir0
1. 在文件创立时,每个数据块都产生校验和
2. 校验和会作为单独一个隐藏文件保存在命名空间下
3. 客户端获取数据时可以检查校验和是否相同,从而发现数据块是否损坏
4. 如果正在读取的数据块损坏,则可以继续读取其它副本
回收站
(1) 删除文件时,其实是放入回收站/trash
(2) 回收站里的文件可以快速恢复
(3) 可以设置一个时间阈值,当回收站里文件的存放时间超过这个阈值,就被彻底删除,
(4) 并且释放占用的数据块
(5) 可以设置不需要回收站
元数据保护
十分核心的内容:
(1)
映像文件刚和事务日志是Namenode的核心数据。可以配置为拥有多个副本(类似oracle的控制文件多个复制)
(2) 副本会降低Namenode的处理速度,但增加安全性
(3) Namenode依然是单点,如果发生故障要手工切换
快照
类似oracle的回滚:
(1) 支持存储某个时间点的映像,需要时可以使数据重返这个时间点的状态
(2) Hadoop目前还不支持快照,已经列入开发计划
命令行接口
基本文件系统操作(fs)
查看帮助:
[root@hexel
/hadoop/hadoop-1.2.1/name]#hadoop fs –help
复制本地文件到hdfs:(或者put)
[~]$hadoop dfs -copyFromLocal ./notice.html
/user/huangxing/input
[~]$hadoop dfs -copyFromLocal ./notice.html
/user/huangxing/input/notice1.html
把文件复制到本地:(或者get命令)
[~]$hadoop dfs -copyToLocal
/user/huangxing/input/notice1.html ./
进行md5验证:
[~]$md5sum notice.html
a00d6f9ab542be7babc2d8b80d5d2a4c notice.html
[~]$hadoop dfs -copyToLocal
/user/huangxing/input/notice1.html ./
[~]$md5sum notice1.html
a00d6f9ab542be7babc2d8b80d5d2a4c notice1.html
[~]$
显示hdfs文件:
[~]$hadoop dfs -ls /user/huangxing/input
Found 3 items
-rw-r--r--
3 huangxing supergroup 114
2014-02-27 19:14 /user/huangxing/input/README.html
-rw-r--r--
1 huangxing supergroup 9230
2014-02-28 11:18 /user/huangxing/input/notice.html
-rw-r--r--
1 huangxing supergroup 9230
2014-02-28 11:19 /user/huangxing/input/notice1.html
第一列是权限信息,第二列表示副本数
查看统计信息
[~/hadoop/hadoop-1.2.1/data/current]$hadoop
dfsadmin -report
Configured Capacity: 19359907840 (18.03 GB)
Present Capacity: 13920987045 (12.96 GB)
DFS Remaining: 13920464896 (12.96 GB)
DFS Used: 522149 (509.91 KB)
DFS Used%: 0%
Under replicated blocks: 2
Blocks with corrupt replicas: 0
Missing blocks: 0
-------------------------------------------------
Datanodes available: 1 (1 total, 0 dead)
Name: 191.255.255.250:50010
Decommission Status : Normal
Configured Capacity: 19359907840 (18.03 GB)
DFS Used: 522149 (509.91 KB)
Non DFS Used: 5438924891 (5.07 GB)
DFS Remaining: 13920460800(12.96 GB)
DFS Used%: 0%
DFS Remaining%: 71.9%
Last contact: Sat Mar 01 02:12:12 CST 2014
进入和退出安全模式
Dananode启动时候发送数据块信息给namenode,块副本量达到阈值时,才会退出安全模式,接受读写。手动进入安全模式:
[~/hadoop/hadoop-1.2.1/data/current]$hadoop
dfsadmin -safemode enter
Safe mode is ON
Safemode下无法读写了!!
[~]$hadoop dfs -put ./notice.html
/user/huangxing/hxnotice.xml
put:
org.apache.hadoop.hdfs.server.namenode.SafeModeException: Cannot create
/user/huangxing/hxnotice.xml. Name node is in safe mode.
离开安全模式:
[~/hadoop/hadoop-1.2.1/data/current]$hadoop
dfsadmin -safemode leave
这个时候可以正常操作了。
添加节点
(1) 在新节点安装好hadoop(linux,hadoop,配置文件,java)
(2) 把namenode的有关配置文件复制到该节点
(3) 修改masters和slaves文件,增加该节点
(4) 设置ssh免密码进出该节点
(5) 单独启动该节点上的datanode和tasktracker(hadoop-daemon.sh start datanode/tasktracker)
(6) 运行start -balancer.sh进行数据负载均衡
负载均衡
作用:当节点出现故障,或新增加节点时,数据块分布可能不均匀,负载均衡可以重新平衡各个datanode上数据块的分布(比较耗时间)
API
需要熟练上传,删除,重命名文件相关java类和方法.
|