我在HDFS中有很多文件,想要通过MR作业将它们复制到序列文件中。 seq文件的密钥类型是TEXT(我使用SHA1),值类型是BytesWritable(文件内容)。 我发现一些示例代码将所有文件内容读入一个字节数组,比如说缓冲区,然后将缓冲区设置为ByteWritable对象。例如:
byte[] buffer = new byte[(int)file.length()];
FileInputStream fis = new FileInputStream(fileEntry);
int length = fis.read(buffer);
fis.close();
key.set(sha1);
value.set(buffer, 0, buffer.length);
writer.append(key, value);
我的问题是:如果我的输入文件很大,缓冲区大小超出了内存限制。我可以使用在每次迭代中写入少量数据的循环追加到ByteWritable对象吗?或者我可以只将一个输入流分配给BytesWritable对象并让它来处理问题吗?
感谢。
答案 0 :(得分:-1)
您可以使用相当于Linux cat
命令的HDFS:
hadoop fs -cat '/path/to/files/*.' > oneBigSequenceFile.csv
它将连接一个序列文件中的所有文件。