此操作既在map端,也在还原端。

对问题的简要描述:

如果减少输入密钥文本(字符串),价值byteswritable(字节{ }),不同类型的核心价值为100万,平均粒径约30K,100值对应的关键,要求每个关键的两个文件的建立,一个二进制数据的价值不断增加。一个值,用来记录在文件索引每个位置。(大量小文件会影响HDFS,性能最好的剪接这些小文件)

当文件数量很小,可以考虑采用多输出分裂的核心价值,它可以出口到不同的文件或目录,根据关键。但数量的减少只有1,或每降低将产生相同的目录或文件,因此无法实现最终的目标。此外,最重要的是,操作系统限制文件数量由每个进程打开。默认值是1024。集群的节点可以被配置为具有更高的价值,但在成千上万的几十,这仍然是一个限制因素,无法满足数以百万计的需求文件。

减少的主要目的是融合的关键值并输出到HDFS,当然,我们也可以做其他的操作在减少,如文件读写,因为默认的分区工具保证相同的密钥数据也会降低,所以在每天减少,只有两个文件可以读写(一个索引文件,数据文件)。并发程度取决于数量的减少,和数量的减少为256。然后我们可以在同一时间过程的256个关键数据(partioner保证不同的降低处理,不会造成文件读写冲突不同的键)。这样的并发效率是客观的,是可以在短时间内需要。

这是思维方式,但同时,由于Hadoop的HDFS和任务调度的特点,仍有可能在文件中的许多问题,读和写。下面是遇到的一些常见问题。

1.org.apache.hadoop.hdfs.protocol.alreadybeingcreatedexception异常

这可能是最常遇到的问题之一,可能的原因如下:

(1)文件流冲突。

当你创建一个文件,你将打开写文件流。我们要说,如果你使用了错误的API,它可能会引起上述问题。在文件系统类的例子,如果追加()方法创建称为()方法后,上述会抛出异常,所以最好使用创建空文件的方法,只能创建一个文件,不要打开流。

(2)MapReduce推测执行机制。

MapReduce为了提高效率,它会在任务启动后同时启动一些任务。(尝试)当一次尝试成功完成时,它将被视为完成整个任务。结果将是最终的结果和杀慢的尝试。集群一般打开此选项以优化性能(空间,时间),但它是不恰当的推测这个问题的实现。因为我们通常需要一个任务处理文件,但如果我们开始推测执行,将有几次试图运行相同的文件在同一时间,这将导致异常。所以最好关闭此选项,设置mapred.reduce.max.attempts 1,或设置mapred.reduce.tasks.speculative.execution假。

但仍有可能出现问题,因为如果一次任务的尝试有问题,任务在被杀后仍会有另一次尝试。当时,因为最后的尝试异常终止,它仍然可能影响新尝试操作导致异常。所以最安全的方法是从机构吸取教训,投机执行(每一次尝试都产生自己的结果,最后选定为最终结果),每一次尝试ID后缀附加到文件,和捕获所有的文件操作和异常处理,避免了文件的读写冲突。上下文可用于在运行时获得一些背景信息,而且很容易尝试的ID号。注意,在这个时候,如果你能开始猜想,你可以产生很多相同的文件(每复制一个尝试),它仍然不是最好的解决方案。

同时,我们可以使用还原输出来记录异常键。运行。大多数这些任务被attempt_0和重启attempt_1,所以下面的文件通常是两份。这些案件的关键输出(文件异常或attemptid > 0)可以处理一些后续工序,如文件重命名,或紧紧地重新编写这些关键。因为在这种情况下,关键是一般只有几个,但不影响整体效率。

2。文件的异常处理

最好是设置异常处理在MapReduce的所有的文件操作。否则,一个文件的异常可能导致整个工作的失败。所以在效率方面,最好是记录的关键是减少文件时异常输出。因为同时,MapReduce会重新开始一个任务,尝试重新读写文件,这将确保我们得到最终的数据。最后,我们需要对这些异常密钥做一些简单的文件重命名操作。

超过3。目录和文件拼接

如果我们设置键1000万类,上述方法会产生较小的文件太多,这将影响到HDFS性能。此外,由于所有文件都在同一目录中,因此会导致同一目录中的文件数量过多,影响访问效率。

建立多个目录创建文件是创建具有降低的taskId子目录的一个有用的方法。多少子目录可以通过减少以致没有冲突文件建立。由同一处理关键的减少将在同一个目录。

文件拼接来考虑问题的一个指标。为了使文件索引尽可能简单,你应该尽量保证相同的关键的数据都在同一个大的文件。这可以用关键hashCode实现。如果我们想在每一个目录建立1000个文件,只是把hashCode 1000。