引言:我们维护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
rid@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数据,均衡负载十几分钟