在互联网上找不到足够的信息,请在这里询问:
假设我正在将一个巨大的文件写入磁盘,数百TB,这是mapreduce(或spark或其他)导致的。 mapreduce如何将这样的文件有效地写入HDFS(可能是并行的?),以便以后以并行方式读取?
我的理解是HDFS只是基于块(例如128MB)。因此,要编写第二个块,您必须已经编写了第一个块(或至少确定什么内容将进入块1)。假设这是一个CSV文件,文件中的一行很有可能会跨越两个块-我们如何在mapreduce中将此类CSV读取到其他映射器?读取两个块,合并它们并读取正确的行是否需要做一些聪明的逻辑?
答案 0 :(得分:1)
Hadoop使用RecordReaders和InputFormats作为读取和理解块中字节的两个接口。
默认情况下,在Hadoop MapReduce中,每条记录都使用TextInputFormat以新行结尾,对于只有一行跨越块末尾的情况,即使字面意义上的{{1 }}个字符
写入数据是通过reduce任务或Spark执行程序等完成的,因为每个任务仅负责写入整个输出的一部分。对于非小型作业,您通常永远不会获得单个文件,这也不是问题,因为大多数Hadoop处理引擎的输入参数都是用于扫描目录,而不是指向单个文件