小编joj*_*oba的帖子

Hadoop:没有可写接口的简单方法将对象作为输出值

我正在尝试利用hadoop来训练多个模型.我的数据足够小,可以放入内存中,因此我想在每个地图任务中训练一个模型.

我的问题是,当我完成我的模型训练后,我需要将它发送到减速器.我正在使用Weka来训练模型.我不想开始研究如何在Weka类中实现Writable接口,因为它需要付出很多努力.我正在寻找一种简单的方法来做到这一点.

Weka中的Classifier类实现了Serializable接口.如何将此对象发送到reducer?

        edits
Run Code Online (Sandbox Code Playgroud)

以下是提及weka对象序列化的链接:http://weka.wikispaces.com/Serialization

以下是我的代码:配置作业(仅发布部分配置):

       conf.set("io.serializations","org.apache.hadoop.io.serializer.JavaSerialization," + "org.apache.hadoop.io.serializer.WritableSerialization"); 
       job.setOutputKeyClass(Text.class);
       job.setOutputValueClass(Classifier.class);
Run Code Online (Sandbox Code Playgroud)

地图功能:

     //load dataset in data variable
     Classifier tree=new J48();
     tree.buildClassifier();
     context.write(new Text("whatever"), tree);
Run Code Online (Sandbox Code Playgroud)

我的Map类扩展了Mapper(对象,文本,文本,分类器)

但我得到这个错误:

     java.lang.NullPointerException
at org.apache.hadoop.io.serializer.SerializationFactory.getSerializer(SerializationFactory.java:73)
at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.<init>(MapTask.java:964)
at org.apache.hadoop.mapred.MapTask$NewOutputCollector.<init>(MapTask.java:673)
at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:755)
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:369)
at org.apache.hadoop.mapred.Child$4.run(Child.java:259)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:416)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1059)
at org.apache.hadoop.mapred.Child.main(Child.java:253)
Run Code Online (Sandbox Code Playgroud)

我做错了什么?

java serialization hadoop weka

5
推荐指数
1
解决办法
6693
查看次数

所有映射任务的Hadoop缓存文件

我的map函数必须为每个输入读取一个文件.该文件根本没有变化,仅供阅读.分布式缓存可能对我有很多帮助,但我无法找到使用它的方法.我需要覆盖的public void configure(JobConf conf)函数,我认为已弃用.好的JobConf肯定已被弃用.所有DistributedCache教程都使用不推荐的方式.我能做什么?有没有我可以覆盖的另一个配置功能?

这些是我的地图功能的第一行:

     Configuration conf = new Configuration();          //load the MFile
     FileSystem fs = FileSystem.get(conf);
     Path inFile = new Path("planet/MFile");       
     FSDataInputStream in = fs.open(inFile);
     DecisionTree dtree=new DecisionTree().loadTree(in);
Run Code Online (Sandbox Code Playgroud)

我想缓存那个MFile,这样我的map函数就不需要一遍又一遍地查看它

java file-io hadoop mapreduce distributed-cache

4
推荐指数
1
解决办法
3763
查看次数

Hadoop:堆空间和gc问题

我目前正在开发一个项目,我需要为我的地图任务提供内存结构.我做了一些计算,我可以说每个地图任务我不需要超过600MB的内存.但问题是,经过一段时间我有java堆空间问题或gc开销限制.我不知道这怎么可能.

这里有一些更多的细节.我有两个四核系统,12GB内存.这意味着我可以同时运行多达8个地图任务.我正在构建一棵树,所以我有一个迭代算法,可以为每个树级别执行map-reduce作业.我的算法适用于小型数据集,但是对于中型数据集存在堆空间问题.我的算法到达某个树级别然后它离开堆空间,或者有gc开销问题.那时,我做了一些计算,我发现每个任务都不需要超过100MB的内存.所以对于8个任务,我使用大约800MB的内存.我不知道发生了什么事.我甚至用这些行更新了我的hadoop-env.sh文件:

   export HADOOP_HEAPSIZE=8000
   export HADOOP_OPTS=-XX:+UseParallelGC
Run Code Online (Sandbox Code Playgroud)

问题是什么?这些行是否甚至覆盖了我的系统的java选项?使用parallelGC是我在互联网上看到的,并且建议在拥有多个核心时使用.

     edits
Run Code Online (Sandbox Code Playgroud)

这里有一些监视堆空间和总内存后的编辑.当同时运行6个任务时,我消耗大约3500MB的RAM.这意味着jobtracker,tasktracker,namenode,datanode,secondary namenode我的操作系统和6个任务都使用3500 RAM,这是一个非常合乎逻辑的大小.那么为什么我会获得gc开销限制?我对每个树级别都遵循相同的算法.唯一改变的是每个树级别的节点数量.在树级别拥有许多节点,不会给我的算法增加太多开销.那么为什么gc不能正常工作呢?

java heap garbage-collection hadoop multicore

4
推荐指数
1
解决办法
5416
查看次数

Hadoop:基元数组作为键值对中的值

我在之前的一个主题Hadoop中问过一个非常类似的问题:我怎样才能将一个双精度数组作为键值对中的值?.

我的问题是我想将一个双数组作为值从map传递到reduce阶段.我得到的答案是序列化,转换为Text,将其传递给reducer并反序列化.这是一个很好的解决方案,但它像序列化和反序列化两次.

例如,ArrayWritable只接受像FloatWritable这样实现Writable的类型.所以另一个解决方案是将我的双精度数组转换为DoubleWritables数组.但这需要一些时间,而Writable是一种非常昂贵的资源.是不是有一个非常简单的解决方案,如ArrayWritable array = new ArrayWritable(Double.class)???

java arrays hadoop key-value writable

4
推荐指数
1
解决办法
4838
查看次数