手机版
你好,游客 登录 注册
背景:
阅读新闻

解决Hadoop JobConf限制为5M的问题

[日期:2013-11-07] 来源:oschina.net  作者:张东昊 [字体: ]

查看发现这个configuration属于package org.apache.Hadoop.conf:

查看了下mongodb里面字段的configuration也是属于package org.apache.hadoop.conf:

所以就大胆的想着在mongoSplitter里面构造FileSystem直接去读文件获取,因为对hadoop不是很熟悉,而mongodb的driver里 mongoSplitter也是在MongoInputFormat里面调用的,所以担心这里的conf并不能获得hadoop集群的hdfs,所以给conf里面传入了一个字符串dataPath来指定需要读取的文件路径。然后读取:

FileSystem fileSystem = null;

        try {
            fileSystem = FileSystem.get(mongoConfig .conf);
        } catch (IOException e) {
            log.warn("无法获得fileSystem.......");
        }
    FSDataInputStream hdfsInStream = null;
    BufferedReader bufferedReader = null;
          try {

                    // 打开文件流
                    hdfsInStream = fileSystem.open(new Path(mongoConfig.conf.get("dataPath")));

                    bufferedReader = new BufferedReader(new InputStreamReader(
                            hdfsInStream, "UTF-8"));
                    String line = null;
                    while ((line = bufferedReader.readLine()) != null) {
                        try {
                            if (StringUtils.isNotBlank(line)) {

                                System.out.println(line);

                            }
                        } catch (Exception e) {
                            log.warn(ExceptionUtils.getFullStackTrace(e));
                            continue;
                        }
                    }
                    line = null;

            } catch (Exception e) {
                log.warn(ExceptionUtils.getFullStackTrace(e));
            } finally {
                try {
                    if (bufferedReader != null) {
                        bufferedReader.close();
                    }
                    if (hdfsInStream != null) {
                        hdfsInStream.close();
                    }
                } catch (IOException e) {
                    log.warn("关闭流时异常:" + ExceptionUtils.getFullStackTrace(e));
                }
            }

上面没有关闭fileSystem是因为不能关闭他,如果关闭了其他hadoop获取hdfs的流都会被关闭,调用会报空指针。应该是全局唯一的。

最后发现是可以的。也就是说hadoop在调用inputFormat 调用的getSplitter方法时传入的jobContext已经包含了hadoop集群的信息,所以可以在自己实现的mongoSplitter方法里使用FileSystem读取hdfs数据,也解决了因为conf限制的问题。

@Override
public List<InputSplit> getSplits(JobContext context) {
    final Configuration hadoopConfiguration = context.getConfiguration();
    final MongoSimpleConfig conf = new MongoSimpleConfig(hadoopConfiguration);
    return MongoSimpleSplitter.calculateSplits(conf);
}

更多Hadoop相关信息见Hadoop 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=13

linux
相关资讯       Hadoop配置  JobConf 
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款