由于某个组件出现错误,HDFS 中的文件不断积累,数量非常大,达到 2123516 个。我想列出所有文件并将它们的名称复制到一个文件中,但是当我运行以下命令时,会出现 Java 堆空间错误。
hdfs dfs -ls /tmp/content/
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:3332)
at java.lang.AbstractStringBuilder.expandCapacity(AbstractStringBuilder.java:137)
at java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:121)
at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:421)
at java.lang.StringBuffer.append(StringBuffer.java:272)
at java.net.URI.appendSchemeSpecificPart(URI.java:1911)
at java.net.URI.toString(URI.java:1941)
at java.net.URI.<init>(URI.java:742)
at org.apache.hadoop.fs.Path.initialize(Path.java:145)
at org.apache.hadoop.fs.Path.<init>(Path.java:126)
at org.apache.hadoop.fs.Path.<init>(Path.java:50)
at org.apache.hadoop.hdfs.protocol.HdfsFileStatus.getFullPath(HdfsFileStatus.java:215)
at org.apache.hadoop.hdfs.DistributedFileSystem.makeQualified(DistributedFileSystem.java:252)
at org.apache.hadoop.hdfs.DistributedFileSystem.listStatus(DistributedFileSystem.java:311)
at org.apache.hadoop.fs.FileSystem.listStatus(FileSystem.java:842)
at org.apache.hadoop.fs.FileSystem.listStatus(FileSystem.java:902)
at org.apache.hadoop.fs.FileSystem.globStatusInternal(FileSystem.java:1032)
at org.apache.hadoop.fs.FileSystem.globStatus(FileSystem.java:987)
at org.apache.hadoop.fs.FileSystem.globStatus(FileSystem.java:965)
at org.apache.hadoop.fs.shell.Command.runAll(Command.java:62)
at org.apache.hadoop.fs.FsShell.run(FsShell.java:1822)
at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:65)
at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:79)
at org.apache.hadoop.fs.FsShell.main(FsShell.java:1895)
还有其他方法可以列出文件吗?列出 2400000 个文件需要多少堆空间?
答案1
您可以尝试通过设置环境变量来增加 CLI 堆大小HADOOP_HEAPSIZE
,例如:
$ HADOOP_HEAPSIZE=1000 hdfs dfs -ls /tmp/content
该数字以 MB 为单位,因此请温柔一点 :)
更大的问题是,您要如何处理控制台上的超过 2M 的文件?您不打算将输出重定向到某个地方吗?