我正在运行一个地图缩小作业,需要一个小输入(~3MB,大小为z的整数列表), 具有大小为n×m的稀疏矩阵高速缓存,并且基本上输出尺寸为(n×1)的z稀疏向量。这里的输出非常大(约2TB)。我在Amazon EC2上运行20个m1.small节点,并将S3存储作为输入和输出。
但是,我收到IOException:设备上没有剩余空间。 看起来在Hadoop日志上写了s3字节,但没有创建文件。 当我使用较小的输入(较小的z)时,在作业完成后输出正确。 因此,我认为它在临时存储中耗尽。
有没有办法检查这个临时存储的位置? 另外,有趣的是日志说所有字节都写入s3,但我看不到文件,也不知道这些字节的写入位置。
感谢您的帮助。
示例代码(也尝试拆分为map并减少相同错误的作业)
public void map(LongWritable key, Text value,
Mapper<LongWritable, Text, LongWritable, VectorWritable>.Context context)
throws IOException, InterruptedException
{
// Assume the input is id \t number
String[] input = value.toString().split("\t");
int idx = Integer.parseInt(input[0]) - 1;
// Some operations to do, but basically outputting a vector
// Collect the output
context.write(new LongWritable(idx), new VectorWritable(matrix.getColumn(idx)));
};
答案 0 :(得分:0)
Amazon EMR支持几个versions。这些是默认值0.20.205
hadoop.tmp.dir - /tmp/hadoop-${user.name} - 其他临时目录的基础。
mapred.local.dir - $ {hadoop.tmp.dir} / mapred / local - MapReduce存储中间数据文件的本地目录。可能是不同设备上以逗号分隔的目录列表,以便传播磁盘i / o。不存在的目录将被忽略。
mapred.temp.dir - $ {hadoop.tmp.dir} / mapred / temp - 临时文件的共享目录。
在du --max-depth=7 /home/xyz | sort -n
上运行hadoop.tmp.dir
命令,检查哪个目录占用的空间最多。虽然hadoop.tmp.dir
表示临时,但它也存储系统和数据文件。