首先,我们在使用前先看看HDFS是什麽?这将有助于我们是以后的运维使用和故障排除思路的获得。
HDFS采用master/slave架构。一个HDFS集群是由一个Namenode和一定数目的Datanodes组成。Namenode是一个中心服务器,负责管理文件系统的名字空间(namespace)以及客户端对文件的访问。
集群中的Datanode一般是一个节点一个,负责管理它所在节点上的存储。HDFS暴露了文件系统的名字空间,用户能够以文件的形式在上面存储数据。从内部看,一个文件其实被分成一个或多个数据块,这些块存储在一组Datanode上。Namenode执行文件系统的名字空间操作,比如打开、关闭、重命名文件或目录。它也负责确定数据块到具体Datanode节点的映射。Datanode负责处理文件系统客户端的读写请求。在Namenode的统一调度下进行数据块的创建、删除和复制。
HDFS采用Java语言开发,因此任何支持Java的机器都可以部署Namenode或Datanode。由于采用了可移植性极强的Java语言,使得HDFS可以部署到多种类型的机器上。一个典型的部署场景是一台机器上只运行一个Namenode实例,而集群中的其它机器分别运行一个Datanode实例。这种架构并不排斥在一台机器上运行多个Datanode,只不过这样的情况比较少见。(伪分布式就是采用这种方式,适合资源短缺的测试环境,尽量避免用作生产。)
HDFS支持传统的层次型文件组织结构。用户或者应用程序可以创建目录,然后将文件保存在这些目录里。文件系统名字空间的层次结构和大多数现有的文件系统类似:用户可以创建、删除、移动或重命名文件。当前,HDFS不支持用户磁盘配额和访问权限控制,也不支持硬链接和软链接。但HDFS架构并不妨碍实现这些特性。Namenode负责维护文件系统的名字空间,任何对文件系统名字空间或属性的修改都将被Namenode记录下来。应用程序可以设置HDFS保存的文件的副本数目。文件副本的数目称为文件的副本系数,这个信息也是由Namenode保存的。
HDFS被设计成能够在一个大集群中跨机器可靠地存储超大文件。它将每个文件存储成一系列的数据块,除了最后一个,所有的数据块都是同样大小的。为了容错,文件的所有数据块都会有副本。每个文件的数据块大小和副本系数都是可配置的。应用程序可以指定某个文件的副本数目。副本系数可以在文件创建的时候指定,也可以在之后改变。HDFS中的文件都是一次性写入的,并且严格要求在任何时候只能有一个写入者。
Namenode全权管理数据块的复制,它周期性地从集群中的每个Datanode接收心跳信号和块状态报告(Blockreport)。接收到心跳信号意味着该Datanode节点工作正常。块状态报告包含了一个该Datanode上所有数据块的列表。
副本的存放是HDFS可靠性和性能的关键。优化的副本存放策略是HDFS区分于其他大部分分布式文件系统的重要特性。
大型HDFS实例一般运行在跨越多个机架的计算机组成的集群上,不同机架上的两台机器之间的通讯需要经过交换机。Namenode可以确定每个Datanode所属的机架id。一个简单但没有优化的策略就是将副本存放在不同的机架上。但是为了降低整体的带宽消耗和读取延时,HDFS会尽量让读取程序读取离它最近的副本。如果在读取程序的同一个机架上有一个副本,那么就读取该副本。如果一个HDFS集群跨越多个数据中心,那么客户端也将首先读本地数据中心的副本。
当Namenode启动后会进入一个称为安全模式的特殊状态。处于安全模式的Namenode是不会进行数据块的复制的。Namenode从所有的 Datanode接收心跳信号和块状态报告。块状态报告包括了某个Datanode所有的数据块列表。每个数据块都有一个指定的最小副本数。当Namenode检测确认某个数据块的副本数目达到这个最小值,那么该数据块就会被认为是副本安全(safely replicated)的;在一定百分比(这个参数可配置)的数据块被Namenode检测确认是安全之后(加上一个额外的30秒等待时间),Namenode将退出安全模式状态。接下来它会确定还有哪些数据块的副本没有达到指定数目,并将这些数据块复制到其他Datanode上。
Namenode上保存着HDFS的名字空间。对于任何对文件系统元数据产生修改的操作,Namenode都会使用一种称为EditLog的事务日志记录下来。例如,在HDFS中创建一个文件,Namenode就会在Editlog中插入一条记录来表示;同样地,修改文件的副本系数也将往Editlog插入一条记录。Namenode在本地操作系统的文件系统中存储这个Editlog。整个文件系统的名字空间,包括数据块到文件的映射、文件的属性等,都存储在一个称为FsImage的文件中,这个文件也是放在Namenode所在的本地文件系统上。
Namenode在内存中保存着整个文件系统的名字空间和文件数据块映射(Blockmap)的映像。当Namenode启动时,它从硬盘中读取Editlog和FsImage,将所有Editlog中的事务作用在内存中的FsImage上,并将这个新版本的FsImage从内存中保存到本地磁盘上,然后删除旧的Editlog,因为这个旧的Editlog的事务都已经作用在FsImage上了。这个过程称为一个检查点(checkpoint)。在当前实现中,检查点只发生在Namenode启动时,在不久的将来将实现支持周期性的检查点。
Datanode将HDFS数据以文件的形式存储在本地的文件系统中,它并不知道有关HDFS文件的信息。它把每个HDFS数据块存储在本地文件系统的一个单独的文件中。Datanode并不在同一个目录创建所有的文件,实际上,它用试探的方法来确定每个目录的最佳文件数目,并且在适当的时候创建子目录。在同一个目录中创建所有的本地文件并不是最优的选择,这是因为本地文件系统可能无法高效地在单个目录中支持大量的文件。当一个Datanode启动时,它会扫描本地文件系统,产生一个这些本地文件对应的所有HDFS数据块的列表,然后作为报告发送到Namenode,这个报告就是块状态报告。
所有的HDFS通讯协议都是建立在TCP/IP协议之上。客户端通过一个可配置的TCP端口连接到Namenode,通过ClientProtocol协议与Namenode交互。而Datanode使用DatanodeProtocol协议与Namenode交互。
HDFS的主要目标就是即使在出错的情况下也要保证数据存储的可靠性。常见的三种出错情况是:Namenode出错, Datanode出错和网络割裂(network partitions)。每个Datanode节点周期性地向Namenode发送心跳信号。网络割裂可能导致一部分Datanode跟Namenode失去联系。Namenode通过心跳信号的缺失来检测这一情况,并将这些近期不再发送心跳信号Datanode标记为宕机,不会再将新的IO请求发给它们。任何存储在宕机Datanode上的数据将不再有效。Datanode的宕机可能会引起一些数据块的副本系数低于指定值,Namenode不断地检测这些需要复制的数据块,一旦发现就启动复制操作。在下列情况下,可能需要重新复制:某个Datanode节点失效,某个副本遭到损坏,Datanode上的硬盘错误,或者文件的副本系数增大。
HDFS的架构支持数据均衡策略。如果某个Datanode节点上的空闲空间低于特定的临界点,按照均衡策略系统就会自动地将数据从这个Datanode移动到其他空闲的Datanode。
从某个Datanode获取的数据块有可能是损坏的,损坏可能是由Datanode的存储设备错误、网络错误或者软件bug造成的。HDFS客户端软件实现了对HDFS文件内容的校验和(checksum)检查。当客户端创建一个新的HDFS文件,会计算这个文件每个数据块的校验和,并将校验和作为一个单独的隐藏文件保存在同一个HDFS名字空间下。当客户端获取文件内容后,它会检验从Datanode获取的数据跟相应的校验和文件中的校验和是否匹配,如果不匹配,客户端可以选择从其他Datanode获取该数据块的副本。
FsImage和Editlog是HDFS的核心数据结构。如果这些文件损坏了,整个HDFS实例都将失效。因而,Namenode可以配置成支持维护多个FsImage和Editlog的副本。当Namenode重启的时候,它会选取最近的完整的FsImage和Editlog来使用。
HDFS被设计成支持大文件,适用HDFS的是那些需要处理大规模的数据集的应用。这些应用都是只写入数据一次,但却读取一次或多次,并且读取速度应能满足流式读取的需要。HDFS支持文件的“一次写入多次读取”语义。一个典型的数据块大小是64MB。因而,HDFS中的文件总是按照64M被切分成不同的块,每个块尽可能地存储于不同的Datanode中。
客户端创建文件的请求其实并没有立即发送给Namenode,事实上,在刚开始阶段HDFS客户端会先将文件数据缓存到本地的一个临时文件。应用程序的写操作被透明地重定向到这个临时文件。当这个临时文件累积的数据量超过一个数据块的大小,客户端才会联系Namenode。Namenode将文件名插入文件系统的层次结构中,并且分配一个数据块给它。然后返回Datanode的标识符和目标数据块给客户端。当文件关闭时,在临时文件中剩余的没有上传的数据也会传输到指定的Datanode上。然后客户端告诉Namenode文件已经关闭。此时Namenode才将文件创建操作提交到日志里进行存储。如果Namenode在文件关闭前宕机了,则该文件将丢失。
当客户端向HDFS文件写入数据的时候,一开始是写到本地临时文件中。假设该文件的副本系数设置为3,当本地临时文件累积到一个数据块的大小时,客户端会从Namenode获取一个Datanode列表用于存放副本。然后客户端开始向第一个Datanode传输数据,第一个Datanode一小部分一小部分(4 KB)地接收数据,将每一部分写入本地仓库,并同时传输该部分到列表中第二个Datanode节点。第二个Datanode也是这样,一小部分一小部分地接收数据,写入本地仓库,并同时传给第三个Datanode。最后,第三个Datanode接收数据并存储在本地。因此,Datanode能流水线式地从前一个节点接收数据,并在同时转发给下一个节点,数据以流水线的方式从前一个Datanode复制到下一个。
当一个文件的副本系数被减小后,Namenode会选择过剩的副本删除。下次心跳检测时会将该信息传递给Datanode。Datanode遂即移除相应的数据块,集群中的空闲空间加大。注意,从用户删除文件到HDFS空闲空间的增加之间会有一定时间的延迟。
好的,下面我们就先看一下有哪些命令语法是经常用到的?
DFSAdmin 命令用来管理HDFS集群。这些命令只有HDSF的管理员才能使用。
显示Datanode列表
[hadoop@qk ~]$ hadoop dfsadmin -report
DEPRECATED: Use of this script to execute hdfs command is deprecated.
Instead use the hdfs command for it.
Configured Capacity: 8318124032 (7.75 GB)
Present Capacity: 7273684992 (6.77 GB)
DFS Remaining: 7273619456 (6.77 GB)
DFS Used: 65536 (64 KB)
DFS Used%: 0.00%
Under replicated blocks: 0
Blocks with corrupt replicas: 0
Missing blocks: 0
-------------------------------------------------
Live datanodes (1):
Name: 192.168.1.230:50010 (qk)
Hostname: qk
Decommission Status : Normal
Configured Capacity: 8318124032 (7.75 GB)
DFS Used: 65536 (64 KB)
Non DFS Used: 1044439040 (996.05 MB)
DFS Remaining: 7273619456 (6.77 GB)
DFS Used%: 0.00%
DFS Remaining%: 87.44%
Configured Cache Capacity: 0 (0 B)
Cache Used: 0 (0 B)
Cache Remaining: 0 (0 B)
Cache Used%: 100.00%
Cache Remaining%: 0.00%
Xceivers: 1
Last contact: Wed Mar 22 17:19:26 CST 2017
将集群置于不同模式(enter:进入安全模式;leave:离开安全模式;get:获知是否开启安全模式;wait:等待离开安全模式)
hdfs dfsadmin -safemode < enter | leave |get| wait >
[hadoop@qk wc-in]$ hdfs dfsadmin -safemode enter
Safe mode is ON
[hadoop@qk wc-in]$ hdfs dfsadmin -safemode leave
Safe mode is OFF
[hadoop@qk wc-in]$ hdfs dfsadmin -safemode get
Safe mode is OFF
使Datanode节点datanodename退役
[hadoop@qk ~]$hadoop dfsadmin -decommission datanodename
DFSShell,命令的语法和用户熟悉的其他shell(例如 bash, csh)工具类似。
查看当前HDFS目录结构 : -ls(-R更详细列出)
[hadoop@qk ~]$ hadoop fs -ls /
Found 2 items
drwx-wx-wx - hadoop supergroup 0 2017-03-22 17:02 /tmp
drwxr-xr-x - hadoop supergroup 0 2017-03-22 16:23 /user
[hadoop@qk ~]$ hadoop fs -ls -R /
drwx-wx-wx - hadoop supergroup 0 2017-03-22 17:02 /tmp
drwx-wx-wx - hadoop supergroup 0 2017-03-17 17:59 /tmp/hive
drwx------ - hadoop supergroup 0 2017-03-20 11:23 /tmp/hive/hadoop
drwxr-xr-x - hadoop supergroup 0 2017-03-22 16:23 /user
drwxr-xr-x - hadoop supergroup 0 2017-03-22 16:27 /user/hadoop
drwxr-xr-x - hadoop supergroup 0 2017-03-22 16:27 /user/hadoop/wc-in
-rw-r--r-- 1 hadoop supergroup 8 2017-03-22 16:27 /user/hadoop/wc-in/a.txt
-rw-r--r-- 1 hadoop supergroup 11 2017-03-22 16:27 /user/hadoop/wc-in/b.txt
drwxr-xr-x - hadoop supergroup 0 2017-03-22 16:27 /user/hadoop/wc-out
-rw-r--r-- 1 hadoop supergroup 0 2017-03-22 16:27 /user/hadoop/wc-out/_SUCCESS
-rw-r--r-- 1 hadoop supergroup 11 2017-03-22 16:27 /user/hadoop/wc-out/part-r-00000
drwxr-xr-x - hadoop supergroup 0 2017-03-17 18:40 /user/hive
drwxr-xr-x - hadoop supergroup 0 2017-03-20 11:22 /user/hive/warehouse
drwxr-xr-x - hadoop supergroup 0 2017-03-17 18:40 /user/hive/warehouse/test.db
drwxr-xr-x - hadoop supergroup 0 2017-03-20 11:22 /user/hive/warehouse/wh301.db
创建一个目录: -mkdir
[hadoop@qk ~]$ hadoop fs -mkdir /tmp/foodir
[hadoop@qk ~]$ hadoop fs -ls /tmp
Found 2 items
drwxr-xr-x - hadoop supergroup 0 2017-03-22 17:27 /tmp/foodir
drwx-wx-wx - hadoop supergroup 0 2017-03-17 17:59 /tmp/hive
查看目录下的文件内容 :-cat
[hadoop@qk ~]$ hadoop fs -cat /user/hadoop/wc-out/part-r-00000
bla 3
wa 2
删除文件: -rm
[hadoop@qk ~]$ hadoop fs -ls -R /user/hadoop/wc-out/
-rw-r--r-- 1 hadoop supergroup 0 2017-03-22 16:27 /user/hadoop/wc-out/_SUCCESS
-rw-r--r-- 1 hadoop supergroup 11 2017-03-22 16:27 /user/hadoop/wc-out/part-r-00000
[hadoop@qk ~]$ hadoop fs -rm /user/hadoop/wc-out/part-r-00000
17/03/22 17:32:16 INFO fs.TrashPolicyDefault: Namenode trash configuration: Deletion interval = 0 minutes, Emptier interval = 0 minutes.
Deleted /user/hadoop/wc-out/part-r-00000
[hadoop@qk ~]$ hadoop fs -ls -R /user/hadoop/wc-out/
-rw-r--r-- 1 hadoop supergroup 0 2017-03-22 16:27 /user/hadoop/wc-out/_SUCCESS
从本地复制到HDFS上 : -put
注意:要复制的目标文件不能存在鱼HDFS上,否则命令不能执行,要复制到的目标文件夹要存在,否则命令不能执行。
[hadoop@qk wc-in]$ hadoop fs -ls -R /user/hadoop/wc-in
-rw-r--r-- 1 hadoop supergroup 8 2017-03-22 16:27 /user/hadoop/wc-in/a.txt
-rw-r--r-- 1 hadoop supergroup 11 2017-03-22 16:27 /user/hadoop/wc-in/b.txt
[hadoop@qk wc-in]$ hadoop fs -put /home/hadoop/wc-in/a.txt /user/hadoop/wc-in/
put: `/user/hadoop/wc-in/a.txt': File exists[hadoop@qk wc-in]$ hadoop fs -put /home/hadoop/wc-in/c.txt /user/hadoop/wc-in/
[hadoop@qk wc-in]$ hadoop fs -ls -R /user/hadoop/wc-in
-rw-r--r-- 1 hadoop supergroup 8 2017-03-22 16:27 /user/hadoop/wc-in/a.txt
-rw-r--r-- 1 hadoop supergroup 11 2017-03-22 16:27 /user/hadoop/wc-in/b.txt
-rw-r--r-- 1 hadoop supergroup 8 2017-03-22 17:40 /user/hadoop/wc-in/c.txt
[hadoop@qk wc-in]$ hadoop fs -put /home/hadoop/wc-in/d.txt /user/hadoop/wc-in1/
put: `/user/hadoop/wc-in1/': No such file or directory[hadoop@qk wc-in]$
在HDFS间复制一个文件: -cp
[hadoop@qk wc-in]$ hadoop fs -ls -R /user/hadoop/wc-in/
-rw-r--r-- 1 hadoop supergroup 8 2017-03-22 16:27 /user/hadoop/wc-in/a.txt
-rw-r--r-- 1 hadoop supergroup 11 2017-03-22 16:27 /user/hadoop/wc-in/b.txt
-rw-r--r-- 1 hadoop supergroup 8 2017-03-22 17:40 /user/hadoop/wc-in/c.txt
-rw-r--r-- 1 hadoop supergroup 3 2017-03-22 17:41 /user/hadoop/wc-in/d.txt
[hadoop@qk wc-in]$ hadoop fs -cp /user/hadoop/wc-in/a.txt /user/hadoop/wc-in1/
[hadoop@qk wc-in]$ hadoop fs -ls -R /user/hadoop/wc-in/
-rw-r--r-- 1 hadoop supergroup 8 2017-03-22 16:27 /user/hadoop/wc-in/a.txt
-rw-r--r-- 1 hadoop supergroup 11 2017-03-22 16:27 /user/hadoop/wc-in/b.txt
-rw-r--r-- 1 hadoop supergroup 8 2017-03-22 17:40 /user/hadoop/wc-in/c.txt
-rw-r--r-- 1 hadoop supergroup 3 2017-03-22 17:41 /user/hadoop/wc-in/d.txt
[hadoop@qk wc-in]$ hadoop fs -ls -R /user/hadoop/wc-in1/
-rw-r--r-- 1 hadoop supergroup 8 2017-03-22 17:44 /user/hadoop/wc-in1/a.txt
在HDFS间移动一个文件:-mv
[hadoop@qk wc-in]$ hadoop fs -ls -R /user/hadoop/wc-in/
-rw-r--r-- 1 hadoop supergroup 8 2017-03-22 16:27 /user/hadoop/wc-in/a.txt
-rw-r--r-- 1 hadoop supergroup 11 2017-03-22 16:27 /user/hadoop/wc-in/b.txt
-rw-r--r-- 1 hadoop supergroup 8 2017-03-22 17:40 /user/hadoop/wc-in/c.txt
-rw-r--r-- 1 hadoop supergroup 3 2017-03-22 17:41 /user/hadoop/wc-in/d.txt
[hadoop@qk wc-in]$ hadoop fs -mv /user/hadoop/wc-in/b.txt /user/hadoop/wc-in1/
[hadoop@qk wc-in]$ hadoop fs -ls -R /user/hadoop/wc-in/
-rw-r--r-- 1 hadoop supergroup 8 2017-03-22 16:27 /user/hadoop/wc-in/a.txt
-rw-r--r-- 1 hadoop supergroup 8 2017-03-22 17:40 /user/hadoop/wc-in/c.txt
-rw-r--r-- 1 hadoop supergroup 3 2017-03-22 17:41 /user/hadoop/wc-in/d.txt
[hadoop@qk wc-in]$ hadoop fs -ls -R /user/hadoop/wc-in1/
-rw-r--r-- 1 hadoop supergroup 8 2017-03-22 17:44 /user/hadoop/wc-in1/a.txt
-rw-r--r-- 1 hadoop supergroup 11 2017-03-22 16:27 /user/hadoop/wc-in1/b.txt
统计hdfs对应路径下的目录个数,文件个数,文件总计大小 :-count
[hadoop@qk wc-in]$ hadoop fs -ls /user/hadoop/wc-in1/
Found 2 items
-rw-r--r-- 1 hadoop supergroup 8 2017-03-22 17:44 /user/hadoop/wc-in1/a.txt
-rw-r--r-- 1 hadoop supergroup 11 2017-03-22 16:27 /user/hadoop/wc-in1/b.txt
[hadoop@qk wc-in]$ hadoop fs -count /user/hadoop/wc-in1/
1 2 19 /user/hadoop/wc-in1
显示hdfs对应路径下每个文件夹和文件的大小: -du(-s 计算总大小 -h 以方便的方式展现)
[hadoop@qk wc-in]$ hadoop fs -du /user/hadoop/wc-in1/
8 /user/hadoop/wc-in1/a.txt
11 /user/hadoop/wc-in1/b.txt
[hadoop@qk wc-in]$ hadoop fs -du -s /user/hadoop/wc-in1/
19 /user/hadoop/wc-in1
[hadoop@qk wc-in]$ hadoop fs -du -h /user/hadoop/wc-in1/
8 /user/hadoop/wc-in1/a.txt
11 /user/hadoop/wc-in1/b.txt
[hadoop@qk wc-in]$
查看对应路径的状态信息 :-stat (可选参数有:%b(文件大小),%o(Block大小),%n(文件名),%r(副本个数),%y(最后一次修改日期和时间))
[hadoop@qk wc-in]$ hadoop fs -stat %b /user/hadoop/wc-in1/a.txt
8
[hadoop@qk wc-in]$ hadoop fs -stat %o /user/hadoop/wc-in1/a.txt
134217728
[hadoop@qk wc-in]$ hadoop fs -stat %n /user/hadoop/wc-in1/a.txt
a.txt
[hadoop@qk wc-in]$ hadoop fs -stat %r /user/hadoop/wc-in1/a.txt
1
[hadoop@qk wc-in]$ hadoop fs -stat %y /user/hadoop/wc-in1/a.txt
2017-03-22 09:44:41
拷贝多个文件或目录到本地: -get(本地和hdfs同名情况下,文件不能传递,本地存在要get的文件也不能正常传递)
[hadoop@qk wc-in]$ hadoop fs -get /user/hadoop/wc-in1/a.txt /home/hadoop/wc-in/
[hadoop@qk wc-in]$ ls -ltr
total 4
-rw-r--r--. 1 hadoop hadoop 8 Mar 22 18:02 a.txt
[hadoop@qk wc-in]$ hadoop fs -get /user/hadoop/wc-in/b.txt /home/hadoop/wc-in/get: `/user/hadoop/wc-in/b.txt': No such file or directory
[hadoop@qk wc-in]$ hadoop fs -get /user/hadoop/wc-in1/a.txt /home/hadoop/wc-in/get: `/home/hadoop/wc-in/a.txt': File exists
改变一个文件在hdfs中的副本个数:-setrep(-R 将目录递归的更改副本个数)
[hadoop@qk wc-in]$ hadoop fs -stat %r /user/hadoop/wc-in1/b.txt
1
[hadoop@qk wc-in]$ hadoop fs -setrep 2 /user/hadoop/wc-in1/b.txt
Replication 2 set: /user/hadoop/wc-in1/b.txt
[hadoop@qk wc-in]$ hadoop fs -stat %r /user/hadoop/wc-in1/b.txt
2
运行一个mapreduce的文件都存在,我们来试试一个example的程序吧!
[hadoop@qk wc-in]$ hadoop fs -ls -R /user/hadoop/wc-in/
-rw-r--r-- 1 hadoop supergroup 8 2017-03-22 16:27 /user/hadoop/wc-in/a.txt
-rw-r--r-- 1 hadoop supergroup 11 2017-03-22 16:27 /user/hadoop/wc-in/b.txt
-rw-r--r-- 1 hadoop supergroup 8 2017-03-22 17:40 /user/hadoop/wc-in/c.txt
-rw-r--r-- 1 hadoop supergroup 3 2017-03-22 17:41 /user/hadoop/wc-in/d.txt
[hadoop@qk wc-in]$ hadoop jar $HADOOP_HOME/hadoop-mapreduce-examples-2.6.0.jar wordcount wc-in wc-out
17/03/22 18:25:46 INFO Configuration.deprecation: session.id is deprecated. Instead, use dfs.metrics.session-id
17/03/22 18:25:46 INFO jvm.JvmMetrics: Initializing JVM Metrics with processName=JobTracker, sessionId=
17/03/22 18:25:47 INFO input.FileInputFormat: Total input paths to process : 4
17/03/22 18:25:47 INFO mapreduce.JobSubmitter: number of splits:4
17/03/22 18:25:47 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_local2007528989_0001
17/03/22 18:25:48 INFO mapreduce.Job: The url to track the job: http://localhost:8080/
17/03/22 18:25:48 INFO mapreduce.Job: Running job: job_local2007528989_0001
17/03/22 18:25:48 INFO mapred.LocalJobRunner: OutputCommitter set in config null
17/03/22 18:25:48 INFO mapred.LocalJobRunner: OutputCommitter is org.apache.hadoop.mapreduce.lib.output.FileOutputCommitter
17/03/22 18:25:48 INFO mapred.LocalJobRunner: Waiting for map tasks
17/03/22 18:25:48 INFO mapred.LocalJobRunner: Starting task: attempt_local2007528989_0001_m_000000_0
17/03/22 18:25:48 INFO mapred.Task: Using ResourceCalculatorProcessTree : [ ]
17/03/22 18:25:48 INFO mapred.MapTask: Processing split: hdfs://192.168.1.230:9000/user/hadoop/wc-in/b.txt:0+11
17/03/22 18:25:49 INFO mapred.MapTask: (EQUATOR) 0 kvi 26214396(104857584)
17/03/22 18:25:49 INFO mapred.MapTask: mapreduce.task.io.sort.mb: 100
17/03/22 18:25:49 INFO mapred.MapTask: soft limit at 83886080
17/03/22 18:25:49 INFO mapred.MapTask: bufstart = 0; bufvoid = 104857600
17/03/22 18:25:49 INFO mapred.MapTask: kvstart = 26214396; length = 6553600
17/03/22 18:25:49 INFO mapred.MapTask: Map output collector class = org.apache.hadoop.mapred.MapTask$MapOutputBuffer
17/03/22 18:25:49 INFO mapreduce.Job: Job job_local2007528989_0001 running in uber mode : false
17/03/22 18:25:49 INFO mapreduce.Job: map 0% reduce 0%
17/03/22 18:25:49 INFO mapred.LocalJobRunner:
17/03/22 18:25:49 INFO mapred.MapTask: Starting flush of map output
17/03/22 18:25:49 INFO mapred.MapTask: Spilling map output
17/03/22 18:25:49 INFO mapred.MapTask: bufstart = 0; bufend = 22; bufvoid = 104857600
17/03/22 18:25:49 INFO mapred.MapTask: kvstart = 26214396(104857584); kvend = 26214388(104857552); length = 9/6553600
17/03/22 18:25:49 INFO mapred.MapTask: Finished spill 0
17/03/22 18:25:49 INFO mapred.Task: Task:attempt_local2007528989_0001_m_000000_0 is done. And is in the process of committing
17/03/22 18:25:49 INFO mapred.LocalJobRunner: map
17/03/22 18:25:49 INFO mapred.Task: Task 'attempt_local2007528989_0001_m_000000_0' done.
17/03/22 18:25:49 INFO mapred.LocalJobRunner: Finishing task: attempt_local2007528989_0001_m_000000_0
17/03/22 18:25:49 INFO mapred.LocalJobRunner: Starting task: attempt_local2007528989_0001_m_000001_0
17/03/22 18:25:49 INFO mapred.Task: Using ResourceCalculatorProcessTree : [ ]
17/03/22 18:25:49 INFO mapred.MapTask: Processing split: hdfs://192.168.1.230:9000/user/hadoop/wc-in/a.txt:0+8
17/03/22 18:25:49 INFO mapred.MapTask: (EQUATOR) 0 kvi 26214396(104857584)
17/03/22 18:25:49 INFO mapred.MapTask: mapreduce.task.io.sort.mb: 100
17/03/22 18:25:49 INFO mapred.MapTask: soft limit at 83886080
17/03/22 18:25:49 INFO mapred.MapTask: bufstart = 0; bufvoid = 104857600
17/03/22 18:25:49 INFO mapred.MapTask: kvstart = 26214396; length = 6553600
17/03/22 18:25:49 INFO mapred.MapTask: Map output collector class = org.apache.hadoop.mapred.MapTask$MapOutputBuffer
17/03/22 18:25:49 INFO mapred.LocalJobRunner:
17/03/22 18:25:49 INFO mapred.MapTask: Starting flush of map output
17/03/22 18:25:49 INFO mapred.MapTask: Spilling map output
17/03/22 18:25:49 INFO mapred.MapTask: bufstart = 0; bufend = 16; bufvoid = 104857600
17/03/22 18:25:49 INFO mapred.MapTask: kvstart = 26214396(104857584); kvend = 26214392(104857568); length = 5/6553600
17/03/22 18:25:49 INFO mapred.MapTask: Finished spill 0
17/03/22 18:25:49 INFO mapred.Task: Task:attempt_local2007528989_0001_m_000001_0 is done. And is in the process of committing
17/03/22 18:25:49 INFO mapred.LocalJobRunner: map
17/03/22 18:25:49 INFO mapred.Task: Task 'attempt_local2007528989_0001_m_000001_0' done.
17/03/22 18:25:49 INFO mapred.LocalJobRunner: Finishing task: attempt_local2007528989_0001_m_000001_0
17/03/22 18:25:49 INFO mapred.LocalJobRunner: Starting task: attempt_local2007528989_0001_m_000002_0
17/03/22 18:25:49 INFO mapred.Task: Using ResourceCalculatorProcessTree : [ ]
17/03/22 18:25:49 INFO mapred.MapTask: Processing split: hdfs://192.168.1.230:9000/user/hadoop/wc-in/c.txt:0+8
17/03/22 18:25:49 INFO mapred.MapTask: (EQUATOR) 0 kvi 26214396(104857584)
17/03/22 18:25:49 INFO mapred.MapTask: mapreduce.task.io.sort.mb: 100
17/03/22 18:25:49 INFO mapred.MapTask: soft limit at 83886080
17/03/22 18:25:49 INFO mapred.MapTask: bufstart = 0; bufvoid = 104857600
17/03/22 18:25:49 INFO mapred.MapTask: kvstart = 26214396; length = 6553600
17/03/22 18:25:49 INFO mapred.MapTask: Map output collector class = org.apache.hadoop.mapred.MapTask$MapOutputBuffer
17/03/22 18:25:49 INFO mapred.LocalJobRunner:
17/03/22 18:25:49 INFO mapred.MapTask: Starting flush of map output
17/03/22 18:25:49 INFO mapred.MapTask: Spilling map output
17/03/22 18:25:49 INFO mapred.MapTask: bufstart = 0; bufend = 12; bufvoid = 104857600
17/03/22 18:25:49 INFO mapred.MapTask: kvstart = 26214396(104857584); kvend = 26214396(104857584); length = 1/6553600
17/03/22 18:25:49 INFO mapred.MapTask: Finished spill 0
17/03/22 18:25:49 INFO mapred.Task: Task:attempt_local2007528989_0001_m_000002_0 is done. And is in the process of committing
17/03/22 18:25:49 INFO mapred.LocalJobRunner: map
17/03/22 18:25:49 INFO mapred.Task: Task 'attempt_local2007528989_0001_m_000002_0' done.
17/03/22 18:25:49 INFO mapred.LocalJobRunner: Finishing task: attempt_local2007528989_0001_m_000002_0
17/03/22 18:25:49 INFO mapred.LocalJobRunner: Starting task: attempt_local2007528989_0001_m_000003_0
17/03/22 18:25:49 INFO mapred.Task: Using ResourceCalculatorProcessTree : [ ]
17/03/22 18:25:49 INFO mapred.MapTask: Processing split: hdfs://192.168.1.230:9000/user/hadoop/wc-in/d.txt:0+3
17/03/22 18:25:49 INFO mapred.MapTask: (EQUATOR) 0 kvi 26214396(104857584)
17/03/22 18:25:49 INFO mapred.MapTask: mapreduce.task.io.sort.mb: 100
17/03/22 18:25:49 INFO mapred.MapTask: soft limit at 83886080
17/03/22 18:25:49 INFO mapred.MapTask: bufstart = 0; bufvoid = 104857600
17/03/22 18:25:49 INFO mapred.MapTask: kvstart = 26214396; length = 6553600
17/03/22 18:25:49 INFO mapred.MapTask: Map output collector class = org.apache.hadoop.mapred.MapTask$MapOutputBuffer
17/03/22 18:25:49 INFO mapred.LocalJobRunner:
17/03/22 18:25:49 INFO mapred.MapTask: Starting flush of map output
17/03/22 18:25:49 INFO mapred.MapTask: Spilling map output
17/03/22 18:25:49 INFO mapred.MapTask: bufstart = 0; bufend = 7; bufvoid = 104857600
17/03/22 18:25:49 INFO mapred.MapTask: kvstart = 26214396(104857584); kvend = 26214396(104857584); length = 1/6553600
17/03/22 18:25:49 INFO mapred.MapTask: Finished spill 0
17/03/22 18:25:49 INFO mapred.Task: Task:attempt_local2007528989_0001_m_000003_0 is done. And is in the process of committing
17/03/22 18:25:49 INFO mapred.LocalJobRunner: map
17/03/22 18:25:49 INFO mapred.Task: Task 'attempt_local2007528989_0001_m_000003_0' done.
17/03/22 18:25:49 INFO mapred.LocalJobRunner: Finishing task: attempt_local2007528989_0001_m_000003_0
17/03/22 18:25:49 INFO mapred.LocalJobRunner: map task executor complete.
17/03/22 18:25:49 INFO mapred.LocalJobRunner: Waiting for reduce tasks
17/03/22 18:25:49 INFO mapred.LocalJobRunner: Starting task: attempt_local2007528989_0001_r_000000_0
17/03/22 18:25:49 INFO mapred.Task: Using ResourceCalculatorProcessTree : [ ]
17/03/22 18:25:49 INFO mapred.ReduceTask: Using ShuffleConsumerPlugin: org.apache.hadoop.mapreduce.task.reduce.Shuffle@3c348ac4
17/03/22 18:25:49 INFO reduce.MergeManagerImpl: MergerManager: memoryLimit=363285696, maxSingleShuffleLimit=90821424, mergeThreshold=239768576, ioSortFactor=10, memToMemMergeOutputsThreshold=10
17/03/22 18:25:49 INFO reduce.EventFetcher: attempt_local2007528989_0001_r_000000_0 Thread started: EventFetcher for fetching Map Completion Events
17/03/22 18:25:49 INFO reduce.LocalFetcher: localfetcher#1 about to shuffle output of map attempt_local2007528989_0001_m_000000_0 decomp: 21 len: 25 to MEMORY
17/03/22 18:25:49 INFO reduce.InMemoryMapOutput: Read 21 bytes from map-output for attempt_local2007528989_0001_m_000000_0
17/03/22 18:25:49 INFO reduce.MergeManagerImpl: closeInMemoryFile -> map-output of size: 21, inMemoryMapOutputs.size() -> 1, commitMemory -> 0, usedMemory ->21
17/03/22 18:25:49 INFO reduce.LocalFetcher: localfetcher#1 about to shuffle output of map attempt_local2007528989_0001_m_000003_0 decomp: 11 len: 15 to MEMORY
17/03/22 18:25:49 INFO reduce.InMemoryMapOutput: Read 11 bytes from map-output for attempt_local2007528989_0001_m_000003_0
17/03/22 18:25:49 INFO reduce.MergeManagerImpl: closeInMemoryFile -> map-output of size: 11, inMemoryMapOutputs.size() -> 2, commitMemory -> 21, usedMemory ->32
17/03/22 18:25:49 INFO reduce.LocalFetcher: localfetcher#1 about to shuffle output of map attempt_local2007528989_0001_m_000001_0 decomp: 12 len: 16 to MEMORY
17/03/22 18:25:49 INFO reduce.InMemoryMapOutput: Read 12 bytes from map-output for attempt_local2007528989_0001_m_000001_0
17/03/22 18:25:49 INFO reduce.MergeManagerImpl: closeInMemoryFile -> map-output of size: 12, inMemoryMapOutputs.size() -> 3, commitMemory -> 32, usedMemory ->44
17/03/22 18:25:49 INFO reduce.LocalFetcher: localfetcher#1 about to shuffle output of map attempt_local2007528989_0001_m_000002_0 decomp: 16 len: 20 to MEMORY
17/03/22 18:25:49 WARN io.ReadaheadPool: Failed readahead on ifile
EBADF: Bad file descriptor
at org.apache.hadoop.io.nativeio.NativeIO$POSIX.posix_fadvise(Native Method)
at org.apache.hadoop.io.nativeio.NativeIO$POSIX.posixFadviseIfPossible(NativeIO.java:267)
at org.apache.hadoop.io.nativeio.NativeIO$POSIX$CacheManipulator.posixFadviseIfPossible(NativeIO.java:146)
at org.apache.hadoop.io.ReadaheadPool$ReadaheadRequestImpl.run(ReadaheadPool.java:206)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)
17/03/22 18:25:49 INFO reduce.InMemoryMapOutput: Read 16 bytes from map-output for attempt_local2007528989_0001_m_000002_0
17/03/22 18:25:49 INFO reduce.MergeManagerImpl: closeInMemoryFile -> map-output of size: 16, inMemoryMapOutputs.size() -> 4, commitMemory -> 44, usedMemory ->60
17/03/22 18:25:49 WARN io.ReadaheadPool: Failed readahead on ifile
EBADF: Bad file descriptor
at org.apache.hadoop.io.nativeio.NativeIO$POSIX.posix_fadvise(Native Method)
at org.apache.hadoop.io.nativeio.NativeIO$POSIX.posixFadviseIfPossible(NativeIO.java:267)
at org.apache.hadoop.io.nativeio.NativeIO$POSIX$CacheManipulator.posixFadviseIfPossible(NativeIO.java:146)
at org.apache.hadoop.io.ReadaheadPool$ReadaheadRequestImpl.run(ReadaheadPool.java:206)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)
17/03/22 18:25:49 INFO reduce.EventFetcher: EventFetcher is interrupted.. Returning
17/03/22 18:25:49 INFO mapred.LocalJobRunner: 4 / 4 copied.
17/03/22 18:25:49 INFO reduce.MergeManagerImpl: finalMerge called with 4 in-memory map-outputs and 0 on-disk map-outputs
17/03/22 18:25:49 INFO mapred.Merger: Merging 4 sorted segments
17/03/22 18:25:49 INFO mapred.Merger: Down to the last merge-pass, with 4 segments left of total size: 33 bytes
17/03/22 18:25:49 INFO reduce.MergeManagerImpl: Merged 4 segments, 60 bytes to disk to satisfy reduce memory limit
17/03/22 18:25:49 INFO reduce.MergeManagerImpl: Merging 1 files, 58 bytes from disk
17/03/22 18:25:49 INFO reduce.MergeManagerImpl: Merging 0 segments, 0 bytes from memory into reduce
17/03/22 18:25:49 INFO mapred.Merger: Merging 1 sorted segments
17/03/22 18:25:49 INFO mapred.Merger: Down to the last merge-pass, with 1 segments left of total size: 44 bytes
17/03/22 18:25:49 INFO mapred.LocalJobRunner: 4 / 4 copied.
17/03/22 18:25:49 INFO Configuration.deprecation: mapred.skip.on is deprecated. Instead, use mapreduce.job.skiprecords
17/03/22 18:25:50 INFO mapred.Task: Task:attempt_local2007528989_0001_r_000000_0 is done. And is in the process of committing
17/03/22 18:25:50 INFO mapred.LocalJobRunner: 4 / 4 copied.
17/03/22 18:25:50 INFO mapred.Task: Task attempt_local2007528989_0001_r_000000_0 is allowed to commit now
17/03/22 18:25:50 INFO output.FileOutputCommitter: Saved output of task 'attempt_local2007528989_0001_r_000000_0' to hdfs://192.168.1.230:9000/user/hadoop/wc-out/_temporary/0/task_local2007528989_0001_r_000000
17/03/22 18:25:50 INFO mapred.LocalJobRunner: reduce > reduce
17/03/22 18:25:50 INFO mapred.Task: Task 'attempt_local2007528989_0001_r_000000_0' done.
17/03/22 18:25:50 INFO mapred.LocalJobRunner: Finishing task: attempt_local2007528989_0001_r_000000_0
17/03/22 18:25:50 INFO mapred.LocalJobRunner: reduce task executor complete.
17/03/22 18:25:50 INFO mapreduce.Job: map 100% reduce 100%
17/03/22 18:25:51 INFO mapreduce.Job: Job job_local2007528989_0001 completed successfully
17/03/22 18:25:51 INFO mapreduce.Job: Counters: 38
File System Counters
FILE: Number of bytes read=1358767
FILE: Number of bytes written=2623735
FILE: Number of read operations=0
FILE: Number of large read operations=0
FILE: Number of write operations=0
HDFS: Number of bytes read=117
HDFS: Number of bytes written=26
HDFS: Number of read operations=51
HDFS: Number of large read operations=0
HDFS: Number of write operations=7
Map-Reduce Framework
Map input records=4
Map output records=7
Map output bytes=57
Map output materialized bytes=76
Input split bytes=456
Combine input records=7
Combine output records=5
Reduce input groups=4
Reduce shuffle bytes=76
Reduce input records=5
Reduce output records=4
Spilled Records=10
Shuffled Maps =4
Failed Shuffles=0
Merged Map outputs=4
GC time elapsed (ms)=222
CPU time spent (ms)=0
Physical memory (bytes) snapshot=0
Virtual memory (bytes) snapshot=0
Total committed heap usage (bytes)=931340288
Shuffle Errors
BAD_ID=0
CONNECTION=0
IO_ERROR=0
WRONG_LENGTH=0
WRONG_MAP=0
WRONG_REDUCE=0
File Input Format Counters
Bytes Read=30
File Output Format Counters
Bytes Written=26
[hadoop@qk wc-in]$ hadoop fs -cat /user/hadoop/wc-out/part-r-00000
arsenal 1
bla 3
fc 1
wa 2
[hadoop@qk wc-in]$
wordcount程序是一个计算文件的单词个数的程序,那么从以上计算结果看a.txt等4个文件的单词个数分别被计算出来。
...待续