我有一个 .txt
文件如下:
我是xyz
这是我的家
这是我的电脑
这是我的房间
这是ubuntu pc
(忽略每条记录后的空行)
我已将块大小设置为64字节。我想检查的是,是否存在一条记录被分成两个块的情况。
现在从逻辑上讲,由于块大小是64字节,所以在将文件上载到hdfs之后,它应该分别创建3个大小为64、64、27字节的块,它确实如此。此外,由于第一个块的大小为64字节,因此它应仅包含以下数据:
我是xyz
这是我的家
这是我的电脑
这是我的房间
第
现在我想看看第一个块是否像这样,如果我通过浏览器浏览hdfs并下载文件,它会下载整个文件而不是单个块。
所以我决定运行一个map reduce作业,它只显示记录值 reducers=0
,Map器输出为 context.write(null,record_value)
,同时将默认分隔符更改为 ""
)
现在,在运行作业时,作业计数器显示3个拆分,这是显而易见的,但是在完成后,当我检查输出目录时,它显示3个Map器输出文件,其中2个是空的,第一个Map器输出文件具有文件的所有内容。
有人能帮我吗?新版本的hadoop是否有可能自动处理不完整的记录?
2条答案
按热度按时间rbpvctlc1#
复制场景所遵循的步骤
1) 创建了一个文件
sample.txt
内容总大小~153B
```cat sample.txt
This is xyz
This is my home
This is my PC
This is my room
This is ubuntu PC xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxxxxxxxxxxxxxxxxxxx
并加载到块大小为
64B
.这就产生了三个大小块
64B
,64B
以及25B
.内容
Block0
:内容
Block1
:内容
Block2
:3) 一个简单的
mapper.py
```!/usr/bin/env python
import sys
for line in sys.stdin:
print line
yarn jar hadoop-streaming-2.7.1.jar -Dmapreduce.job.reduces=0 -file mapper.py -mapper mapper.py -input /sample.txt -output /splittest
hdfs dfs -ls /splittest
-rw-r--r-- 3 user supergroup 0 2017-03-22 11:13 /splittest/_SUCCESS
-rw-r--r-- 3 user supergroup 168 2017-03-22 11:13 /splittest/part-00000
-rw-r--r-- 3 user supergroup 0 2017-03-22 11:13 /splittest/part-00001
-rw-r--r-- 3 user supergroup 0 2017-03-22 11:13 /splittest/part-00002
mapper1: start=0, length=64B
mapper2: start=64, length=64B
mapper3: start=128, length=25B
This is xyz
This is my home
This is my PC
This is my room
This is ubuntu PC xxxx xxxx xxxx xxxx
xxxx xxxx xxxx xxxx xxxx xxxx xxxx
xxxxxxxxxxxxxxxxxxxxx
u2nhd7ah2#
使用以下命令获取hdfs上文件的阻止列表
hdfs fsck path-文件-块-位置
where path是文件所在的完整hdfs路径。
输出(部分如下所示)将是这样的(行号2,3。。。忽略)
通过连接到namenodehttp://ec2-54-235-1-193.compute-1.amazonaws.com:50070/fsck?ugi=student6&files=1&blocks=1&locations=1&path=%2fsudent6%2ftest.txt fsck由student6启动(auth:simple)自/172.31.11.124起,路径为/student6/test.txt,时间为2017年3月22日星期三15:33:17 utc/student6/test.txt,22字节,1个块:确定0。bp-944036569-172.31.11.124-1467635392176:blk\ U 1073755254\ U 14433 len=22 repl=1[数据节点信息存储[172.31.11.124:50010,ds-4a530a72-0495-4b75-a6f9-75bdb8ce7533,磁盘]]
复制输出命令的粗体部分(不包括),如上面的输出示例所示
转到datanode上的linux文件系统到存储块的目录(这将由hdfs-site.xml的dfs.datanode.data.dir参数指向),并从该位置在整个子树中搜索包含刚才复制的粗体字符串的文件名。这将告诉您dfs.datanode.data.dir下的哪个子目录包含名称中带有该字符串的文件(排除任何带有.meta后缀的文件名)。一旦找到这样的文件名,就可以对该文件名运行linux cat命令来查看文件内容。
请记住,尽管该文件是一个hdfs文件,但在封面下,该文件实际上存储在linux文件系统中,hdfs文件的每个块都是一个惟一的linux文件。该块由linux文件系统标识,其名称如步骤2的粗体字符串所示