这是一个涉及Hadoop/HDFS的概念性问题.假设您有一个包含10亿行的文件.并且为了简单起见,我们考虑每条线的形式<k,v>,其中k是从开头开始的线的偏移量,值是线的内容.
现在,当我们说要运行N个映射任务时,框架是否将输入文件拆分为N个拆分并在该拆分上运行每个映射任务?或者我们是否必须编写一个分区函数来执行N分割并在生成的分割上运行每个映射任务?
我想知道的是,拆分是在内部完成还是我们必须手动拆分数据?
更具体地说,每次调用map()函数时,它的Key key and Value val参数是什么?
谢谢,迪帕克
想要确认以下内容.请验证这是否正确:1.根据我的理解,当我们将文件复制到HDFS时,文件(假设其大小> 64MB = HDFS块大小)被分成多个块并且每个块存储在不同的块上数据节点.
将文件复制到HDFS时文件内容已经拆分为块,并且在运行map作业时不会发生文件拆分.映射任务仅按照它们在每个最大块上工作的方式进行调度.大小为64 MB,具有数据位置(即映射任务在包含数据/块的节点上运行)
如果文件被压缩(gzip),也会发生文件分割,但MR确保每个文件只由一个映射器处理,即MR将收集位于其他数据节点的所有gzip文件块并将它们全部提供给单个映射器.
如果我们定义isSplitable()以返回false,则会发生与上述相同的事情,即文件的所有块将由在一台机器上运行的一个映射器处理.MR将从不同的数据节点读取文件的所有块,并将它们提供给单个映射器.
我需要摄取大型JSON文件,其记录可能跨越多行(而不是文件)(完全取决于数据提供者如何编写它).
Elephant-Bird假设LZO压缩,我知道数据提供者不会这样做.
Dzone文章http://java.dzone.com/articles/hadoop-practice假设JSON记录将在同一行.
任何想法,除了压缩JSON ...文件将是巨大的...如何正确分割文件,使JSON不会破坏.
编辑:行,而不是文件
问题:我想从HDFS读取文件的一部分并将其返回,例如从1000行的文件中返回101-120行.
我不想使用,seek因为我读过它很贵.
我有日志文件,我使用PIG处理成有意义的数据集.我一直在编写一个API来返回数据以供前端消费和显示.这些经过处理的数据集可以足够大,我不想在一个啜食中读出Hadoop中的整个文件,以节省线路时间和带宽.(比方说5 - 10MB)
目前我使用a BufferedReader来返回工作正常的小摘要文件
ArrayList lines = new ArrayList();
...
for (FileStatus item: items) {
// ignoring files like _SUCCESS
if(item.getPath().getName().startsWith("_")) {
continue;
}
in = fs.open(item.getPath());
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String line;
line = br.readLine();
while (line != null) {
line = line.replaceAll("(\\r|\\n)", "");
lines.add(line.split("\t"));
line = br.readLine();
}
}
Run Code Online (Sandbox Code Playgroud)
我在网上搜索了很多和Stack一样,但还没找到我需要的东西.
也许这完全是错误的做法,我需要一套完全独立的代码和不同的功能来管理它.对任何建议开放.
谢谢!
正如基于以下讨论的研究所补充的那样: Hadoop过程如何记录跨越块边界的记录? Hadoop FileSplit阅读
据我所知,HDFS中的块系统是基础文件系统之上的逻辑分区.但是,当我发出cat命令时,如何检索文件.
假设我有一个1 GB的文件.我的默认HDFS块大小为64 MB.
我发出以下命令:
hadoop -fs copyFromLocal my1GBfile.db input/data/
Run Code Online (Sandbox Code Playgroud)
上面的命令将文件my1GBfile.db从我的本地机器复制到输入/数据目录中HDFS:
我有16个块要复制和复制(1 GB/64 MB~16).
如果我有8 datanodes,则单个datanode可能没有所有块来重建文件.
当我发出以下命令
hadoop -fs cat input/data/my1GBfile.db | head
Run Code Online (Sandbox Code Playgroud)
现在发生了什么?
文件是如何重构的?虽然块只是逻辑分区,但1 GB文件是如何物理存储的.它存储在HDFS上.每个datanode获取文件的一些物理部分.因此,通过将输入1GB文件分成64 MB块,我们可能会破坏记录级别的某些内容(例如在行之间).这是怎么处理的?
我检查了我的datanode,我确实看到了一个blk_1073741825,在编辑器中打开时实际上显示了该文件的内容.
那么所制作的文件块是不合逻辑的,但实际partition的数据发生了吗?
请帮助澄清一下
我是hadoop的新手和地图缩小模型并试图让这些概念正确.
我首先想要得到输入拆分的概念和映射器的数量是正确的.
我正在运行mapreduce wordcount程序,以下是我的问题.
1)如何确定输入分割?我在同一个集群上运行相同的程序,有两个不同大小的输入
file 1 : size 48mb. => i got number of splits:1 in log.
file 2: size 126mb => number of splits : 1
file 2 : size 126mb ( executed in eclipse IDE) => number of splits: 4
Run Code Online (Sandbox Code Playgroud)
不应该是126 MB文件的分割数等于2?因为我已经读过块大小为64 MB.所以它必须创建2个分裂.
2)如何确定地图制作者的数量?我试图通过以下方式获得映射器的数量来理解mapreduce的工作流程.
conf.get("mapred.map.tasks")
Run Code Online (Sandbox Code Playgroud)
它每次返回2.
3)分割数和映射器数之间是否有任何关系?
4)做上面的事情取决于集群?对于伪分布式模式和其他集群是否相同或不同?
谢谢.
我需要在HDFS上存储大约10TB的大文件.我需要了解的是HDFS将如何存储此文件.比如,群集的复制因子是3,我有一个10节点群集,每个节点上有超过10 TB的磁盘空间,即总群集容量超过100TB.
现在,HDFS随机选择三个节点并将文件存储在这三个节点上.那么这就像听起来一样简单.请确认?
或者HDFS将文件分割 - 比如说每个10T分割1TB,然后将每个分割存储在随机选择的3个节点上.分裂是可能的,如果是,则是启用它的配置方面.如果HDFS必须拆分二进制文件或文本文件 - 它是如何拆分的.只需按字节.