在Java上使用Map_only Hadoop选择函数(Select function with Map_only Hadoop on java)
我想创建一个简单的函数来选择CSV文件中的非空元组。 我已经考虑过输入:CSV文件的每一行,并且如果值不为null,则该值将接收相同的元组。
我的程序如下:import java.io.IOException; 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.mapred.FileInputFormat; import org.apache.hadoop.mapred.FileOutputFormat; import org.apache.hadoop.mapred.JobClient; import org.apache.hadoop.mapred.JobConf; import org.apache.hadoop.mapred.KeyValueTextInputFormat; import org.apache.hadoop.mapred.MapReduceBase; import org.apache.hadoop.mapred.Mapper; import org.apache.hadoop.mapred.OutputCollector; import org.apache.hadoop.mapred.OutputFormat; import org.apache.hadoop.mapred.Reporter; import org.apache.hadoop.mapred.SequenceFileInputFormat; import org.apache.hadoop.mapred.SequenceFileOutputFormat; import org.apache.hadoop.mapred.TextInputFormat; import org.apache.hadoop.mapred.TextOutputFormat; public class Selectfunction { public static class Map extends MapReduceBase implements Mapper<Text, Text, Text, Text>{ // Map void public void map(Text key, Text value, OutputCollector<Text, Text> output, Reporter reporter) throws IOException { //input Text cle = new Text(); //int valeur1 = 0; //int valeur2 = 1; String[] tokens = value.toString().split(","); String cle1 = tokens.toString(); for (int i=0;i<tokens.length;i++) { // System.out.println("hana"); if(tokens[5].toString().equals(null)){ value.set(value); } cle.set(cle1); //output.collect(word, one); output.collect(new Text(cle), value); } } } public static void main(String args[])throws Exception { if(args.length!=2){ System.err.println("Usage: WeatherTemperature <input path> <output path>"); System.exit(-1); } // Create a new JobConf JobConf job = new JobConf(new Configuration(), Selectfunction.class); // Specify various job-specific parameters job.setJobName("myjob"); FileInputFormat.setInputPaths(job, new Path(args[0])); FileOutputFormat.setOutputPath(job, new Path(args[1])); job.setNumReduceTasks(0); job.setMapperClass(Selectfunction.Map.class); job.setInputFormat(TextInputFormat.class); job.setOutputFormat(TextOutputFormat.class); FileInputFormat.addInputPath(job, new Path(args[0])); FileOutputFormat.setOutputPath(job, new Path(args[1])); JobClient.runJob(job); } }
我收到以下错误:
16/05/25 23:32:26 INFO mapreduce.Job: Running job: job_1448020964278_0451 16/05/25 23:32:36 INFO mapreduce.Job: Job job_1448020964278_0451 running in uber mode : false 16/05/25 23:32:36 INFO mapreduce.Job: map 0% reduce 0% 16/05/25 23:32:44 INFO mapreduce.Job: Task Id : attempt_1448020964278_0451_m_000000_0, Status : FAILED Error: java.lang.ClassCastException: org.apache.hadoop.io.LongWritable cannot be cast to org.apache.hadoop.io.Text at select.Selectfunction$Map.map(Selectfunction.java:1) at org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:54) at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:450) at org.apache.hadoop.mapred.MapTask.run(MapTask.java:343) at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:163) at java.security.AccessController.doPrivileged(Native Method) at javax.security.auth.Subject.doAs(Subject.java:415) at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1628) at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:158) 16/05/25 23:32:45 INFO mapreduce.Job: Task Id : attempt_1448020964278_0451_m_000001_0, Status : FAILED Error: java.lang.ClassCastException: org.apache.hadoop.io.LongWritable cannot be cast to org.apache.hadoop.io.Text at select.Selectfunction$Map.map(Selectfunction.java:1) at org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:54) at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:450) at org.apache.hadoop.mapred.MapTask.run(MapTask.java:343) at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:163) at java.security.AccessController.doPrivileged(Native Method) at javax.security.auth.Subject.doAs(Subject.java:415) at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1628) at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:158)
I want to create simple function to select the not null tuple in CSV file. I had considered as input : each line of CSV file, and the value recieve the same tuple if it's not null.
my program is as follow:import java.io.IOException; 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.mapred.FileInputFormat; import org.apache.hadoop.mapred.FileOutputFormat; import org.apache.hadoop.mapred.JobClient; import org.apache.hadoop.mapred.JobConf; import org.apache.hadoop.mapred.KeyValueTextInputFormat; import org.apache.hadoop.mapred.MapReduceBase; import org.apache.hadoop.mapred.Mapper; import org.apache.hadoop.mapred.OutputCollector; import org.apache.hadoop.mapred.OutputFormat; import org.apache.hadoop.mapred.Reporter; import org.apache.hadoop.mapred.SequenceFileInputFormat; import org.apache.hadoop.mapred.SequenceFileOutputFormat; import org.apache.hadoop.mapred.TextInputFormat; import org.apache.hadoop.mapred.TextOutputFormat; public class Selectfunction { public static class Map extends MapReduceBase implements Mapper<Text, Text, Text, Text>{ // Map void public void map(Text key, Text value, OutputCollector<Text, Text> output, Reporter reporter) throws IOException { //input Text cle = new Text(); //int valeur1 = 0; //int valeur2 = 1; String[] tokens = value.toString().split(","); String cle1 = tokens.toString(); for (int i=0;i<tokens.length;i++) { // System.out.println("hana"); if(tokens[5].toString().equals(null)){ value.set(value); } cle.set(cle1); //output.collect(word, one); output.collect(new Text(cle), value); } } } public static void main(String args[])throws Exception { if(args.length!=2){ System.err.println("Usage: WeatherTemperature <input path> <output path>"); System.exit(-1); } // Create a new JobConf JobConf job = new JobConf(new Configuration(), Selectfunction.class); // Specify various job-specific parameters job.setJobName("myjob"); FileInputFormat.setInputPaths(job, new Path(args[0])); FileOutputFormat.setOutputPath(job, new Path(args[1])); job.setNumReduceTasks(0); job.setMapperClass(Selectfunction.Map.class); job.setInputFormat(TextInputFormat.class); job.setOutputFormat(TextOutputFormat.class); FileInputFormat.addInputPath(job, new Path(args[0])); FileOutputFormat.setOutputPath(job, new Path(args[1])); JobClient.runJob(job); } }
I have received the following error:
16/05/25 23:32:26 INFO mapreduce.Job: Running job: job_1448020964278_0451 16/05/25 23:32:36 INFO mapreduce.Job: Job job_1448020964278_0451 running in uber mode : false 16/05/25 23:32:36 INFO mapreduce.Job: map 0% reduce 0% 16/05/25 23:32:44 INFO mapreduce.Job: Task Id : attempt_1448020964278_0451_m_000000_0, Status : FAILED Error: java.lang.ClassCastException: org.apache.hadoop.io.LongWritable cannot be cast to org.apache.hadoop.io.Text at select.Selectfunction$Map.map(Selectfunction.java:1) at org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:54) at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:450) at org.apache.hadoop.mapred.MapTask.run(MapTask.java:343) at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:163) at java.security.AccessController.doPrivileged(Native Method) at javax.security.auth.Subject.doAs(Subject.java:415) at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1628) at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:158) 16/05/25 23:32:45 INFO mapreduce.Job: Task Id : attempt_1448020964278_0451_m_000001_0, Status : FAILED Error: java.lang.ClassCastException: org.apache.hadoop.io.LongWritable cannot be cast to org.apache.hadoop.io.Text at select.Selectfunction$Map.map(Selectfunction.java:1) at org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:54) at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:450) at org.apache.hadoop.mapred.MapTask.run(MapTask.java:343) at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:163) at java.security.AccessController.doPrivileged(Native Method) at javax.security.auth.Subject.doAs(Subject.java:415) at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1628) at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:158)
原文:https://stackoverflow.com/questions/37448288
最满意答案
你最有可能遭受内存碎片化 。
发生的事情是,当您释放内存块时,您会得到一些小漏洞,这些漏洞可能无法在您下次请求内存时使用。 当您继续以创建小的不可用孔的模式分配和释放时,唯一的解决方案是从系统中获得更多的内存。
如果您对程序如何将内存用于特定事物有明确定义的规则,您可能需要考虑一个内存池来帮助根据程序的特定要求分配和释放内存,而不是标准的通用要求图书馆。
You are most likely suffering from memory fragmentation.
What happens is that as you release chunks of memory, you get little holes which might not be able to be used next time you request memory. As you continue allocating and releasing in a pattern that creates small unusable holes, the only solution is to get more hunks of memory from the system.
If you have well-defined rules for how your program uses memory for specific things, you might want to consider a memory pool to help allocate and release memory according to the specific requirements of your program, rather than the general-purpose requirements of the standard library.
相关问答
更多-
C ++代码内存泄漏(C++ code memory leak)[2021-01-09]
既然你找不到直接的泄漏,你似乎需要比较内存状态的快照以查看发生了什么变化。 快速搜索表明valgrind的地块可以做快照,并且有一个python脚本来比较它们(但是如果你的程序很小,你可以手工比较) Since you can't find a straightforward leak, you seem to need to compare snapshots of memory state to see what has changed. A quick search indicates that va ... -
首先,您应该使用Option Strict On ,它会向您显示变量类型不匹配的位置,甚至可能会为您提供更正,例如,查看以下代码中DirectCast运算符的使用位置。 其次, HttpWebResponse有一个.Dispose()方法,所以当你完成使用时你应该调用它,或者像Zaggler指出的那样,你可以使用Using来确保非托管资源被正确清理,从而消除内存泄漏关心。 请注意,代码中可能存在其他类似问题,我们无法看到。 你不应该把事情设置为Nothing以试图摆脱它们 - 这样做与垃圾收集器混乱,并没有 ...
-
你最有可能遭受内存碎片化 。 发生的事情是,当您释放内存块时,您会得到一些小漏洞,这些漏洞可能无法在您下次请求内存时使用。 当您继续以创建小的不可用孔的模式分配和释放时,唯一的解决方案是从系统中获得更多的内存。 如果您对程序如何将内存用于特定事物有明确定义的规则,您可能需要考虑一个内存池来帮助根据程序的特定要求分配和释放内存,而不是标准的通用要求图书馆。 You are most likely suffering from memory fragmentation. What happens is that ...
-
对我来说,你的图表分析与rusage增加单调的事实是可疑的。 rusage状态的文档: 使用的最大驻留集大小,以千字节为单位。 也就是说,同时处理使用的物理内存的最大数量是千字节。 由于您可能在同一过程中收集统计信息,只能跨多个图像,所以rusage报告所有图像的最大内存使用情况是rusage的。 事实上,使用不同的分析工具(OS X上的仪器)会生成此图表,显示当前的内存使用情况: 这与使用proc的结果非常相似。 我会得出结论, rusage不是你想要的分析工具。 To me, the fact that ...
-
在这段代码中: Body *body = new Body(); body->readSkel("C:\\skel2.skel"); body->drawBody(); body = new Body(); 你正在泄漏一个Body因为你没有删除第一个。 和这个: body->~Body(); delete body; 太奇怪了。 你没有显式调用这样的析构函数 - delete负责调用析构函数。 这段代码: delete[25] joints; 也很奇怪。 正确的形式是: delete [] joint ...
-
内存使用量增加(Memory usage increasing)[2022-10-02]
可能发生的情况是,当你释放你的无限级别视图控制器(通过关闭/从超级视图中移除)时,仍然有一些对View / iVars / Properties的强烈引用仍然悬而未决。 尝试在释放视图控制器之前释放所有属性和实例变量。 您也可以尝试将所有IBOutlet(不会从视图中删除)定义为弱类型,以便在视图控制器被解除时释放它们。 您可以记住一些关于内存管理的清单: 任何强/保留类型的属性/变量应该由用户释放。 ARC自动执行,但有时它不能正确释放(不要问为什么)。 实例变量默认为“强”引用类型,这意味着您必须手动释 ... -
假设您指的是Chrome开发者工具,您可能看不到堆快照中的内存增加,因为堆快照分析器在快照之前运行垃圾收集器。 看到增加的内存使用量,特别是在活动处理期间,是很正常的。 垃圾收集器不会不必要地运行。 如果你的机器有备用的内存,它会让预留的内存增长。 如果你开始推动可用内存的限制,收集器应该运行。 你应该允许它发生这种情况。 由于您在空闲时段之后报告内存下降到其原始级别,这表示没有内存泄漏,并且垃圾收集器能够正确收集所有已分配的堆对象。 但是,IANAGE(我不是Google工程师)。 我建议阅读Heap P ...
-
使用SDL_TTF时,C ++程序内存使用量不断增加(C++ program memory usage keeps increasing when using SDL_TTF)[2023-09-05]
找到问题。 我复制了lazyfoo的风格并尝试在我的实现中,所以当我渲染新的textTexture时,它实际上创建了新的纹理而不会破坏它。 通过使用SDL_DestroyTexture,一切正常 在这里找到答案: https : //stackoverflow.com/questions/24938695/memory-leak-sdl-while-using-sdl-createtexturefromsurface Find the problem. I copy the style of lazyfoo ... -
DispatcherTimer不断增加内存使用量,直到应用程序崩溃(DispatcherTimer keeps increasing memory usage until app crash)[2023-10-28]
为什么要在计时器滴答事件之外声明timespan1和timespan2? 如果在事件处理程序中创建内存,内存是否会更好 I have finally isolated the core of my memory leak, the issue was not with my DispatcherTimer but instead with my AdRotator Control. The problem has been identified on the side of the AdRotator de ... -
iOS内存使用量不断增加(iOS Memory usage keep increasing)[2021-08-19]
使用快照查找内存蠕变。 (见: bbum博客 ) 基本上,他们的方法是运行Instruments分配工具,获取快照,运行代码的迭代和另一个快照,重复3或4次。 这将指示在迭代期间分配但未释放的内存。 在这种情况下,请在下载之间获取快照(现在称为不同的东西)。 要弄清楚结果,请披露个人分配情况。 如果您需要查看对象使用的保留,释放和自动释放的位置,请使用仪器: 在仪器中运行,在分配中将“记录参考计数”设置为打开(您必须停止记录以设置选项)。 允许运行问题代码,停止录制,然后搜索感兴趣的对象。 之后,您需要向下 ...