【问题标题】:Reading large files using mapreduce in hadoop在hadoop中使用mapreduce读取大文件
【发布时间】:2012-12-31 09:56:55
【问题描述】:

我有一个从 FTP 服务器读取文件并将其写入HDFS 的代码。我已经实现了一个自定义的InputFormatReader,它将输入的isSplitable 属性设置为false。但是这给了我以下错误。

INFO mapred.MapTask: Record too large for in-memory buffer

我用来读取数据的代码是

Path file = fileSplit.getPath();
                FileSystem fs = file.getFileSystem(conf);
                FSDataInputStream in = null;
                try {
                    in = fs.open(file);


                    IOUtils.readFully(in, contents, 0, contents.length);

                    value.set(contents, 0, contents.length);

                }

任何想法如何在不拆分输入文件的情况下避免java heap space error?或者如果我让isSplitable true 我该如何读取文件?

【问题讨论】:

    标签: java hadoop mapreduce elastic-map-reduce amazon-emr


    【解决方案1】:

    如果我没听错 - 你将整个文件加载到内存中。与 hadoop 无关——你不能在 Java 上做到这一点,并确保你有足够的内存。
    我建议定义一些合理的块并使其成为“记录”

    【讨论】:

    • 我明白你在说什么。我什至尝试对其进行编码。但是我开始遇到关闭将从源读取的输入流的问题。每次将输入的一部分作为记录读取并写入映射器时,返回读取剩余部分是不可能的。我会读取一大块 1024 并将其设置为记录的值。 while(totalBytes < len){ bytesRead =in.read(buf); } totalBytes+=1024; } value.set(buf);
    • 好吧 .. 有点疼。但是我遇到了一个新问题..请在这里找到:link
    【解决方案2】:

    当 Map 函数运行时,hadoop 会在名为 MapOutputBuffer 的内存缓冲区中收集输出记录。

    内存缓冲区的总大小由 io.sort.mb 属性设置,默认为 100 MB。

    尝试在 mapred-site.xml 中增加此属性值

    【讨论】:

    • 不起作用..我尝试使用'conf.set'通过我的代码设置它..它确实将值设置为我指定的值,但它仍然遇到堆空间错误。
    • 不起作用..我尝试使用'conf.set'通过我的代码设置它..它确实将值设置为我指定的值,但它仍然遇到堆空间错误跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-01
    • 2013-08-08
    相关资源
    最近更新 更多