- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在尝试运行一个非常简单的 hadoop 作业。它是对经典 wordCount 的修改,它不计算单词,而是计算文件中的行数。我想用它来清理一堆我知道有重复的大日志文件(每个大约 70GB)。每行都是一条“记录”,因此我只想获取每条记录一次。
我知道我的代码是有效的,因为当我用小的普通文件运行它时,它做了它应该做的事情。当我用大文件运行它时,Hadoop 表现得很严格。首先,它开始在 MAP 阶段正常工作,该阶段通常可以毫无问题地达到 100%。然而,在处理 REDUCE 时,它永远不会超过 50%。它可能达到 40%,然后在显示一些“设备上没有剩余空间”异常后回到 0%:
FSError: java.io.IOException: No space left on device
然后它再次尝试执行 REDUCE,当它达到 40% 时,它再次下降到 0%,依此类推。当然,在决定以失败告终之前,它会执行 2 或 3 次。
不过,此异常的问题在于它与磁盘上的实际空间无关。磁盘空间永远不会变满。不是 HDFS 上的总(全局)空间,也不是每个节点中的单个磁盘。我检查 fs 状态:
$ hadoop dfsadmin -report > report
此报告从未显示实际节点达到 100%。事实上,没有任何节点能接近这一点。
我在每个节点上有大约 60GB 的可用磁盘,我在一个有 60 个数据节点的集群中运行它,这给我的总空间超过 3TB。我要处理的文件只有 70GB。
上网查了一下,可能是Hadoop在处理大量数据的同时创建了太多文件有关。原始的 wordCount 代码大大减少了数据(因为单词重复很多)。一个 70GB 的文件可以减少到只有 7MB 的输出。但是,我预计只会减少 1/3,或者大约 20-30GB 的输出。
Unix 类型的系统限制每个进程打开 1024 个文件:
$ ulimit -n
1024
如果 hadoop 创造的不止于此,那可能是个问题。我要求系统管理员将该限制增加到 65K,即现在的限制是:
$ ulimit -n
65000
问题不断。这可能是我需要进一步增加这个限制吗?这里还有其他事情吗?
非常感谢您的帮助!
代码在这里:
package ...;
import java.io.IOException;
import java.util.StringTokenizer;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.util.GenericOptionsParser;
public class LineCountMR {
public static class MapperClass
extends Mapper<Object, Text, Text, IntWritable>{
private final static IntWritable one = new IntWritable(1);
private Text word = new Text();
private String token = new String();
public void map(Object key, Text value, Context context
) throws IOException, InterruptedException {
token = value.toString().replace(' ', '_');
word.set(token);
context.write(word, one);
}
}
public static class ReducerClass
extends Reducer<Text,IntWritable,Text,IntWritable> {
private IntWritable result = new IntWritable();
public void reduce(Text key, Iterable<IntWritable> values,
Context context
) throws IOException, InterruptedException {
int sum = 0;
for (IntWritable val : values) {
sum += val.get();
}
result.set(sum);
context.write(key, result);
}
}
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();;
if (args.length != 2) {
System.err.println("Parameters: <in> <out>");
System.exit(2);
}
Job job = new Job(conf, "line count MR");
job.setJarByClass(LineCountMR.class);
job.setMapperClass(MapperClass.class);
job.setCombinerClass(ReducerClass.class);
job.setReducerClass(ReducerClass.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
FileInputFormat.addInputPath(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));
System.exit(job.waitForCompletion(true) ? 0 : 1);
}
}
最佳答案
我在处理 10TB 数据时在集群上看到了这个问题。此问题与 HDFS 上的可用空间无关,而是与本地文件系统 (df -h) 上的可用空间有关,该文件系统用于存储在本地而非 HDFS 中存储的 map-reduce 操作期间生成的中间数据。
关于Hadoop 无法完成作业,因为 "No space left on device",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17710996/
我系统上的docker info命令输出如下: # docker info Containers: 0 Images: 0 Storage Driver: devicemapper ..... D
我如何捕获用户按下 ctrl + space + space? 我用这段代码成功测试了ctrl + space: RegisterHotKey(0, 1, MOD_CONTROL, VK_SPACE)
我有一个 Matlab 图,我想在论文中使用。此图包含多个 cdfplots。现在的问题是我不能使用标记,因为在情节中变得非常密集。如果我想让样本稀疏,我必须从 cdfplot 中删除一些样本,这将导
我正在尝试获取我将用于备份的服务器上所有数据库的列表。以下是我尝试打印数据库列表但出现错误的代码片段。如何解决?添加双方括号并不能解决问题。 我已经研究了一些类似的问题,但我无法弄清楚。 grep:字
我了解 new gen/old gen/perm gen 之间的区别,但我不知道“To Space”和“From Space”是什么。我看到我的“From Space”使用率达到 99.8%,而“To
我当前有一个返回时看起来像这样的字符串: //This is the url string // the-great-debate---toilet-paper-over-or-under-the-r
我太亲密了。我正在尝试编写用于Notepad++的正则表达式表达式,以用空格替换破折号,而忽略已经用前置/后置空格代替的破折号。我知道我可以用“foobarfoo”搜索/替换“-”,然后搜索“-”替换
我的 ANTLR 代码如下: LPARENTHESIS : ('('); RPARENTHESIS : (')'); fragment CHARACTER : ('a'..'z'|'0'..'9'|)
在过去的 6 个小时里,我一直在尝试在我的 webgl 应用程序中实现点击,但我找不到任何关于这个主题的足够清晰的内容。 到目前为止,我想出的是伪代码: screenSpace = mousePosi
如何使用正则表达式来测试空格或制表符,但不测试换行符? 我尝试了 \s,但我发现它也测试换行符。 我使用C# (.NET) 和 WPF ,但这应该不重要。 最佳答案 使用字符类:[\t] 关于rege
我想解析以下内容: name:name 名称以字母开头和结尾,并且可以包含字母和空格的任意组合。它们也可以是空白的。我的规则是: identifier = alnum (space* alnum)*;
有什么办法可以让 Eden 空间按比例大于 Tenured 空间吗?有 NewRatio 但它以相反的方式工作(Tenured 比 Eden 大几倍)。 我知道有 -XX:NewSize= 和 -XX
我正在编写一个程序,让人们输入他们的信息(姓名,年龄......)。对于姓名输入,我不希望他们留空,只允许字母和空格,但不能以空格开头。合适的正则表达式是什么?我尝试使用: ^[a-zA-Z\\s]*
好的,我正在制作一个程序,它也可以制作垂直线、水平线和对角线!我对我的一个没有任何意义的输出感到困惑。 所以我的伪代码是这样的: //enter a char //enter a number
当我使用 scp 从服务器复制文件时, 我错误地使用了命令 scp xxx@xxxx:xx.zip . 当我完成后,我发现该文件的名称是 .我无法解压 这是目录列表。 http://pfil
我需要一个 bat 文件来获取 Windows 系统中 C:\驱动器的总空间和可用空间(以 GB(千兆字节)为单位),并创建一个包含详细信息的文本文件。 注意:我不想使用任何外部实用程序。 最佳答案
作为预处理我的数据的一部分。我希望能够替换空格后跟数字,同时保留空格后跟一个字符。例如: Input String: '8.1.7 Sep 2000 Dec 2004 Dec 2006 Indefin
我正在编写一个 XPath 表达式,但我修复了一个奇怪的错误,但是以下两个 XPath 表达式之间有什么区别? "//td[starts-with(normalize-space()),'Posted
在 C 中,当读取文本文件时,是否有可能接受一个未知大小的整数值(假设它适合 int),因为它在数字之前和数字之后都有一个空格。例如。 363 865我想分别存储 363 和 865,因为它们有自己的
在 sys/ptrace.h 中,我看到类似这样的内容: @define PT_READ_I 1 /* read world in child's I space*/ @define PT_READ
我是一名优秀的程序员,十分优秀!