Hadoop HDFS分布式文件系统

     引言:我们维护hadoop系统的时候,必不可少需要对HDFS分布式文件系统做操作,例如拷贝一个文件/目录,查看HDFS文件系统目录下的内容,删除HDFS文件系统中的内容(文件/目录),还有HDFS管理信息,单独启动停止 namenode  datanode  jobtracker  tasktracker等等一系列的操作。大家跟着做一遍呢!就会对HDFS的体系架构有更加深入的理解,不多说我们开始吧。
环境
操作系统:centos 6.0
hadoop版本:0.20.2
部署目录:/home/grid/hadoop-0.20.2
名称节点元数据位置:/home/grid/hadoop-0.20.2/tmp
数据节点数据位置:/home/grid/hadoop-0.20.2/data
master节点:h1
slave节点:h2 h4
master 和 slave 节点进程状态 ,现在进程都在启动着
[grid@h1
bin]$ jps        
5182 Jps
4600 NameNode
4791 JobTracker
4728 SecondaryNameNode
[grid@h2 ~]$ jps
4471 Jps
3935 DataNode
4012 TaskTracker
[grid@h4 ~]$ jps
4001 TaskTracker
4508 Jps
3924 DataNode
[grid@h1 grid]$ mkdir input                                               linux命令,创建一个input目录
[grid@h1 grid]$ ll
总用量 44
drwxr-xr-x. 14 grid hadoop 4096  9月  2 20:29 hadoop-0.20.2
drwxr-xr-x.  2 grid hadoop 4096  9月 16 19:56 input
drwxr-xr-x.  7 grid hadoop 4096 10月 22 2009 vmware-tools-distrib
drwxr-xr-x.  2 grid hadoop 4096  9月  1 13:55 公共的
drwxr-xr-x.  2 grid hadoop 4096  9月  1 13:55 模板
drwxr-xr-x.  2 grid hadoop 4096  9月  1 13:55 视频
drwxr-xr-x.  2 grid hadoop 4096  9月  1 13:55 图片
drwxr-xr-x.  2 grid hadoop 4096  9月  1 13:55 文档
drwxr-xr-x.  2 grid hadoop 4096  9月  1 13:55 下载
drwxr-xr-x.  2 grid hadoop 4096  9月  1 13:55 音乐
drwxr-xr-x.  3 grid hadoop 4096  9月  2 18:50 桌面
[grid@h1 grid]$ cd input/                                                 linux命令,进入目录
[grid@h1 input]$ echo "hello leonarding" > test1.txt                      linux命令,把字符串"hello leonarding"重定向到test1.txt
[grid@h1 input]$ echo "hello world" > test2.txt                           linux命令,把字符串"hello world"重定向到test2.txt
[grid@h1 input]$ cat test1.txt                                            linux命令,查看test1.txt文件内容
hello leonarding
[grid@h1 input]$ cat test2.txt                                            linux命令,查看test2.txt文件内容
hello world
[grid@h1 input]$ cd ../hadoop-0.20.2/                                     linux命令,进入hadoop-0.20.2目录
[grid@h1 input]$ cd /usr/java/jdk1.6.0_25/bin
[grid@h1 bin]$ jps                                                        直接输入jps=java进程统计
28037 NameNode                 名称节点
32455 Jps
28220 SecondaryNameNode        辅助名称节点
28259 JobTracker               作业跟踪器

1.把linux操作系统的input目录拷贝到hadoop文件系统中重命名为in目录
[grid@h1 hadoop-0.20.2]$ bin/hadoop dfs -put ../input in           把linux操作系统的input目录拷贝到hadoop文件系统中重命名为in目录12/09/16 20:18:20 INFO hdfs.DFSClient: Exception in createBlockOutputStream java.io.IOException: Bad connect ack with firstBadLink 192.168.2.103:50010                                                没有关闭防火墙
12/09/16 20:18:20 INFO hdfs.DFSClient: Abandoning block blk_-2034091982680781464_102612/09/16 20:18:26 INFO hdfs.DFSClient: Exception in createBlockOutputStream java.io.IOException: Bad connect ack withfirstBadLink192.168.2.103:5001012/09/16 20:18:26 INFO hdfs.DFSClient: Abandoning block blk_-3493343259834508347_102612/09/16 20:18:32 INFO hdfs.DFSClient: Exception in createBlockOutputStream java.io.IOException: Bad connect ack with firstBadLink 192.168.2.103:50010
12/09/16 20:18:32 INFO hdfs.DFSClient: Abandoning block blk_4302532573839164645_1026
12/09/16 20:18:38 INFO hdfs.DFSClient: Exception in createBlockOutputStream java.net.NoRouteToHostException: No route to host12/09/16 20:18:38 INFO hdfs.DFSClient: Abandoning block blk_4602162403828631999_1026
12/09/16 20:18:44 WARN hdfs.DFSClient: DataStreamer Exception: java.io.IOException: Unable to create new block.at org.apache.hadoop.hdfs.DFSClient$DFSOutputStream.nextBlockOutputStream(DFSClient.java:2845) at org.apache.hadoop.hdfs.DFSClient$DFSOutputStream.access$2000(DFSClient.java:2102) at org.apache.hadoop.hdfs.DFSClient$DFSOutputStream$DataStreamer.run(DFSClient.java:2288)12/09/16 20:18:44 WARN hdfs.DFSClient: Error Recovery for block blk_4602162403828631999_1026 bad datanode[0] nodes == null12/09/16 20:18:44 WARN hdfs.DFSClient: Could not get block locations. Source file "/user/grid/in/input/test2.txt" - Aborting...
put: No route to host12/09/16 20:18:44 ERROR hdfs.DFSClient: Exception closing file /user/grid/in/input/test2.txt : java.net.NoRouteToHostException: No route to hostjava.net.NoRouteToHostException: No route to host at sun.nio.ch.SocketChannelImpl.checkConnect(Natve Method) at sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:567) at org.apache.hadoop.net.SocketIOWithTimeout.connect(SocketIOWithTimeout.java:206) at org.apache.hadoop.net.NetUtils.connect(NetUtils.java:404) at org.apache.hadoop.hdfs.DFSClient$DFSOutputStream.createBlockOutputStream(DFSClient.java:2870) at org.apache.hadoop.hdfs.DFSClient$DFSOutputStream.nextBlockOutputStream(DFSClient.java:2826) atorg.apache.hadoop.hdfs.DFSClient$DFSOutputStream.access$2000(DFSClient.java:2102) at org.apache.hadoop.hdfs.DFSClient$DFSOutputStream$DataStreamer.run(DFSClient.java:2288)
小结:这是没有关闭Linux防火墙造成的,使用 service iptables stop/start  临时关闭/开启  chkconfig iptables off/on  永久关闭/开启防火墙命令来控制防火墙,关闭之后就可以顺利的进行下面操作了。

[grid@h1 grid]$ hadoop dfs -put abc.txt abc                               把linux操作系统东西拷贝到hadoop文件系统中并重命名abc
[grid@h1 grid]$ hadoop dfs -ls                                            abc文件已经在hadoop文件系统根目录下了
Found 3 items
-rw-r--r--   2 grid supergroup         44 2012-09-18 19:12 /user/grid/abc 随机存放到某一个节点
drwxr-xr-x   - grid supergroup          0 2012-09-17 19:44 /user/grid/in
drwxr-xr-x   - grid supergroup          0 2012-09-17 20:41 /user/grid/out

2.查看hadoop文件系统中根目录下in子目录中所有内容

[grid@h1 hadoop-0.20.2]$ bin/hadoop dfs -ls                                           查看hadoop文件系统根目录内容
Found 1 items
drwxr-xr-x   - grid supergroup          0 2012-09-17 19:44 /user/grid/in              只有一个in目录
[grid@h1 hadoop-0.20.2]$ bin/hadoop dfs -ls ./in/*                                    查看hadoop文件系统中根目录下in子目录内容
-rw-r--r--   2 grid supergroup         17 2012-09-17 19:44 /user/grid/in/test1.txt    有 2个 文件
-rw-r--r--   2 grid supergroup         12 2012-09-17 19:44 /user/grid/in/test2.txt
小结:Hadoop没有当前目录的概念,当然也不能进入in目录,更没有cd命令。所以查看时必须输入目录路径

3.测试map_reduce系统是否可以正常工作,map reduce 采用“就近分配节点”原则执行数据
jar包:/home/grid/hadoop-0.20.2/hadoop-0.20.2-examples.jar       安装hadoop时从源代码拷贝过来的,我们可以直接使用
[grid@h1 hadoop-0.20.2]$ bin/hadoop jar hadoop-0.20.2-examples.jar wordcount in out   把这个jar包里wordcount功能提交给map_reduce当做一个作业运行,测试map_reduce系统是否可以正常工作,in  输入数据目录(数据源) out 输出数据目录(即输出到哪里)
12/09/17 20:39:06 INFO input.FileInputFormat: Total input paths to process : 2
12/09/17 20:39:07 INFO mapred.JobClient: Running job: job_201209172027_0002        运行作业号“2012年9月17日1856不是时间”
12/09/17 20:39:08 INFO mapred.JobClient:  map 0% reduce 0%                        
12/09/17 20:40:34 INFO mapred.JobClient:  map 50% reduce 0%
12/09/17 20:40:49 INFO mapred.JobClient:  map 100% reduce 0%                       map  reduce进度
12/09/17 20:41:02 INFO mapred.JobClient:  map 100% reduce 100%
12/09/17 20:41:04 INFO mapred.JobClient: Job complete: job_201209172027_0002       作业完成
12/09/17 20:41:04 INFO mapred.JobClient: Counters: 17
12/09/17 20:41:04 INFO mapred.JobClient:   Job Counters                            作业计数器
12/09/17 20:41:04 INFO mapred.JobClient:     Launched reduce tasks=1               启动reduce任务1个
12/09/17 20:41:04 INFO mapred.JobClient:     Launched map tasks=3                  启动map任务3个
12/09/17 20:41:04 INFO mapred.JobClient:     Data-local map tasks=3
12/09/17 20:41:04 INFO mapred.JobClient:   FileSystemCounters                      文件系统计数器
12/09/17 20:41:04 INFO mapred.JobClient:     FILE_BYTES_READ=59
12/09/17 20:41:04 INFO mapred.JobClient:     HDFS_BYTES_READ=29
12/09/17 20:41:04 INFO mapred.JobClient:     FILE_BYTES_WRITTEN=188
12/09/17 20:41:04 INFO mapred.JobClient:     HDFS_BYTES_WRITTEN=29
12/09/17 20:41:04 INFO mapred.JobClient:   Map-Reduce Framework                    map_reduce框架
12/09/17 20:41:04 INFO mapred.JobClient:     Reduce input groups=3                 reduce输入组3
12/09/17 20:41:04 INFO mapred.JobClient:     Combine output records=4              合并输出记录4
12/09/17 20:41:04 INFO mapred.JobClient:     Map input records=2                   map输入记录2
12/09/17 20:41:04 INFO mapred.JobClient:     Reduce shuffle bytes=65               reduce shuffle=预处理 减少计算量 算的更快
12/09/17 20:41:04 INFO mapred.JobClient:     Reduce output records=3               reduce输出记录3
12/09/17 20:41:04 INFO mapred.JobClient:     Spilled Records=8                     溢出记录8
12/09/17 20:41:04 INFO mapred.JobClient:     Map output bytes=45                   map输出字节45
12/09/17 20:41:04 INFO mapred.JobClient:     Combine input records=4               合并输入记录4
12/09/17 20:41:04 INFO mapred.JobClient:     Map output records=4                  map输出记录4
12/09/17 20:41:04 INFO mapred.JobClient:     Reduce input records=4                reduce输入记录4
浏览器:
http://192.168.2.102:50030/jobtracker.jsp   这里有job更详细的信息
小结:报错信息【org.apache.hadoop.util.DiskChecker$DiskErrorException: Could no find taskTracker/jobcache/job_201209171856_0001/attempt_201209171856_0001_m_000000_0/output/file.out.index in any of the configured local directories】  请执行stop-all.sh -> start-all.sh    重启hadoop所有进程

4.列出根目录下所有内容
[grid@h1 hadoop-0.20.2]$ bin/hadoop dfs -ls
Found 2 items
drwxr-xr-x   - grid supergroup          0 2012-09-17 19:44 /user/grid/in
drwxr-xr-x   - grid supergroup          0 2012-09-17 19:56 /user/grid/out
  列出根目录下out子目录所有内容
[grid@h1 hadoop-0.20.2]$ bin/hadoop dfs -ls ./out/
Found 2 items
drwxr-xr-x   - grid supergroup          0 2012-09-17 20:39 /user/grid/out/_logs
-rw-r--r--   2 grid supergroup         29 2012-09-17 20:40 /user/grid/out/part-r-00000

5.查看part-r-00000文件内容
[grid@h1 hadoop-0.20.2]$ bin/hadoop dfs -cat /user/grid/out/part-r-00000      必须写绝对路径,因为hadoop下没有当前目录概念
hello 2                     统计单词出现2次
leonarding 1             统计单词出现1次
world 1                     统计单词出现1次
小结:cat 对象必须是文件,不能对目录查看

6.删除hadoop文件系统文件和目录
必须选项 -rmr   不能-rm   use -rmr instead
[grid@h1 hadoop-0.20.2]$ bin/hadoop dfs -rmr /user/grid/in/input/test2.txt     删除hadoop文件系统里的test2.txt文件,一定要加目录路径
Deleted hdfs://h1:9000/user/grid/in/input/test2.txt
[grid@h1 hadoop-0.20.2]$ bin/hadoop dfs -rmr /user/grid/in/test2.txt           删除hadoop文件系统文件,一定要加目录路径
Deleted hdfs://h1:9000/user/grid/in/test2.txt
[grid@h1 hadoop-0.20.2]$ bin/hadoop dfs -rmr /user/grid/in                     删除in目录
Deleted hdfs://h1:9000/user/grid/in
h2  h4  的Linux操作系统上面看文件是不是已经被删除了,占用block已经被释放了
小结:删除HDFS文件系统内文件和目录时选项必须要写 -rmr  而不能 -rm哦

7.从Linux操作系统上看hadoop文件存放在哪里   数据只会存放在数据节点  h2  h4,而不会存放在名称节点 h1

[grid@h4 current]$ pwd
     /home/grid/hadoop-0.20.2/data/current
[grid@h4 current]$ ll                 h4节点
总用量 224
-rw-r--r--. 1 grid hadoop     17  9月 17 19:44 blk_1740766816993665795
-rw-r--r--. 1 grid hadoop     11  9月 17 19:44 blk_1740766816993665795_1013.meta
-rw-r--r--. 1 grid hadoop   9151  9月 17 20:41 blk_5787152218309601238
-rw-r--r--. 1 grid hadoop     79  9月 17 20:41 blk_5787152218309601238_1026.meta
-rw-r--r--. 1 grid hadoop 142466  9月 17 20:35 blk_-5912167526685784374
-rw-r--r--. 1 grid hadoop   1123  9月 17 20:35 blk_-5912167526685784374_1020.meta
-rw-r--r--. 1 grid hadoop      4  9月 17 20:28 blk_618795584037082806
-rw-r--r--. 1 grid hadoop     11  9月 17 20:28 blk_618795584037082806_1019.meta
-rw-r--r--. 1 grid hadoop     29  9月 17 20:40 blk_-6836333776136840432
-rw-r--r--. 1 grid hadoop     11  9月 17 20:40 blk_-6836333776136840432_1026.meta
-rw-r--r--. 1 grid hadoop     12  9月 17 19:44 blk_7008012568223069759
-rw-r--r--. 1 grid hadoop     11  9月 17 19:44 blk_7008012568223069759_1012.meta
-rw-r--r--. 1 grid hadoop  16737  9月 17 20:39 blk_8327174067432266416
-rw-r--r--. 1 grid hadoop    139  9月 17 20:39 blk_8327174067432266416_1025.meta
-rw-r--r--. 1 grid hadoop   1734  9月 18 07:51 dncp_block_verification.log.curr
-rw-r--r--. 1 grid hadoop    158  9月 17 20:27 VERSION
[grid@h2 current]$ ll                 h2节点
总用量 224
-rw-r--r--. 1 grid hadoop     17  9月 17 19:44 blk_1740766816993665795
-rw-r--r--. 1 grid hadoop     11  9月 17 19:44 blk_1740766816993665795_1013.meta
-rw-r--r--. 1 grid hadoop   9151  9月 17 20:41 blk_5787152218309601238
-rw-r--r--. 1 grid hadoop     79  9月 17 20:41 blk_5787152218309601238_1026.meta
-rw-r--r--. 1 grid hadoop 142466  9月 17 20:35 blk_-5912167526685784374
-rw-r--r--. 1 grid hadoop   1123  9月 17 20:35 blk_-5912167526685784374_1020.meta
-rw-r--r--. 1 grid hadoop      4  9月 17 20:28 blk_618795584037082806
-rw-r--r--. 1 grid hadoop     11  9月 17 20:28 blk_618795584037082806_1019.meta
-rw-r--r--. 1 grid hadoop     29  9月 17 20:40 blk_-6836333776136840432
-rw-r--r--. 1 grid hadoop     11  9月 17 20:40 blk_-6836333776136840432_1026.meta
-rw-r--r--. 1 grid hadoop     12  9月 17 19:44 blk_7008012568223069759
-rw-r--r--. 1 grid hadoop     11  9月 17 19:44 blk_7008012568223069759_1012.meta
-rw-r--r--. 1 grid hadoop  16737  9月 17 20:39 blk_8327174067432266416
-rw-r--r--. 1 grid hadoop    139  9月 17 20:39 blk_8327174067432266416_1025.meta
-rw-r--r--. 1 grid hadoop   1541  9月 18 07:51 dncp_block_verification.log.curr
-rw-r--r--. 1 grid hadoop    158  9月 17 20:27 VERSION
小结:hadoop数据只在datanode节点保存(h2 h4)不在namenode保存,由于我设置了 数据块复制2份,那么在h2 h4 里面文件都是一模一样的(冗余防错)hdfs_site.xml -> dfs.data.dir指定数据节点存放数据位置 /home/grid/hadoop-0.20.2/data/
hadoop一个文件是由数据块组成,容量最大不超过64M,是由数据和元数据组成。
datanode文件采用一次性写入多次读,不需修改,可以删除在重新写入
NAMENODE介绍
namenode节点中保存是映像文件和事务日志,即元数据,如果元数据被破坏了,那么我们整个HDFS系统就崩溃了
映像文件:存放文件系统命名空间 ,例如 文件映像  文件属性
事务日志:存放HDFS元数据记录
什么是元数据:记录每个文件数据块在各个datanode上位置和副本(文件数据块都放在哪个节点上,副本有几个),元数据也可以复制多个副本,只在namenode里添加副本,缺点就是副本越多,空间利用率越小,安全性越大,速度越慢
namenode冗余:namenode是HDFS文件系统总控节点,但它是一个单点,如果出现故障也需要手动切换到secondarynamenode SNN
namenode不参与实际数据传输,只负责元数据查询
namenode元数据位置:
[grid@h1 current]$ pwd
/home/grid/hadoop-0.20.2/tmp/dfs/name/current
[grid@h1 current]$ ll
总用量 16
-rw-r--r--. 1 grid hadoop    4  9月 18 08:58 edits      事务日志
-rw-r--r--. 1 grid hadoop 2130  9月 18 08:58 fsimage    映像文件
-rw-r--r--. 1 grid hadoop    8  9月 18 08:58 fstime     事务日志
-rw-r--r--. 1 grid hadoop  101  9月 18 08:58 VERSIO

8.hadoop文件系统的管理报告,即HDFS基本统计信息
[grid@h4 ~]$ hadoop dfsadmin -report            h4 节点
Configured Capacity: 19865944064 (18.5 GB)      分配总容量
Present Capacity: 8934457344 (8.32 GB)         
DFS Remaining: 8933957632 (8.32 GB)             DFS剩余容量
DFS Used: 499712 (488 KB)                       DFS已使用容量
DFS Used%: 0.01%                                DFS已使用百分比
Under replicated blocks: 1                      复制成功块数
Blocks with corrupt replicas: 0                 复制失败块数
Missing blocks: 0                               丢失块数
-------------------------------------------------
Datanodes available: 2 (2 total, 0 dead)        数据节点有效
Name: 192.168.2.103:50010                       h2数据节点ip和端口
Decommission Status : Normal                    状态正常
Configured Capacity: 9932972032 (9.25 GB)       配置总容量
DFS Used: 249856 (244 KB)                       DFS使用量
Non DFS Used: 5350871040 (4.98 GB)              linux容量非DFS使用的
DFS Remaining: 4581851136(4.27 GB)              DFS剩余容量
DFS Used%: 0%                                   DFS已使用百分比
DFS Remaining%: 46.13%                          DFS未用百分比
Last contact: Tue Sep 18 19:34:32 CST 2012      最后的联接

Name: 192.168.2.105:50010                       h2数据节点ip和端口
Decommission Status : Normal                    状态正常
Configured Capacity: 9932972032 (9.25 GB)       配置总容量
DFS Used: 249856 (244 KB)                       DFS使用量
Non DFS Used: 5580615680 (5.2 GB)               linux容量非DFS使用的
DFS Remaining: 4352106496(4.05 GB)              DFS剩余容量
DFS Used%: 0%                                   DFS已使用百分比
DFS Remaining%: 43.81%                          DFS未用百分比
Last contact: Tue Sep 18 19:34:32 CST 2012      最后的联接

9.单独启动停止 namenode  datanode  jobtracker  tasktracker
单独启动/停止 namenode      start-dfs.sh/stop-dfs.sh
单独启动/停止 datanode      hadoop-daemon.sh start datanode/hadoop-daemon.sh stop datanode
单独启动/停止 jobtracker    hadoop-daemon.sh start tasktracker/hadoop-daemon.sh stop tasktracker
单独启动/停止 tasktracker   start-mapred.sh/stop-mapred.sh
举例
[grid@h4 bin]$ pwd
/home/grid/hadoop-0.20.2/bin
[grid@h4 bin]$ jps
27736 Jps
17119 DataNode
17230 TaskTracker
[grid@h4 bin]$ hadoop-daemon.sh stop tasktracker         停止tasktracker
stopping tasktracker
[grid@h4 bin]$ jps
27783 Jps
17119 DataNode
[grid@h4 bin]$ hadoop-daemon.sh start tasktracker        启动tasktracker
starting tasktracker, logging to /home/grid/hadoop-0.20.2/bin/../logs/hadoop-grid-tasktracker-h4.out
[grid@h4 bin]$ jps
27829 TaskTracker                                        已经重新启动,pid都改变了
17119 DataNode
27868 Jps
[grid@h4 bin]$ pwd
/home/grid/hadoop-0.20.2/bin

10.均衡负载
[grid@h4 bin]$ start-balancer.sh
starting balancer, logging to /home/grid/hadoop-0.20.2/bin/../logs/hadoop-grid-balancer-h4.out
场合:新增节点 或 节点故障  把所有数据块重新均衡负载到各各节点上,包括新增节点。例如 几个G数据,均衡负载十几分钟

你可能感兴趣的:(Hadoop)