如何使用Java从Hadoop读取偏移量的文件

dbg*_*dbg 6 java iteration hadoop offset bufferedreader

问题:我想从HDFS读取文件的一部分并将其返回,例如从1000行的文件中返回101-120行.

我不想使用,seek因为我读过它很贵.

我有日志文件,我使用PIG处理成有意义的数据集.我一直在编写一个API来返回数据以供前端消费和显示.这些经过处理的数据集可以足够大,我不想在一个啜食中读出Hadoop中的整个文件,以节省线路时间和带宽.(比方说5 - 10MB)

目前我使用a BufferedReader来返回工作正常的小摘要文件

ArrayList lines = new ArrayList();
...
for (FileStatus item: items) {
    // ignoring files like _SUCCESS
    if(item.getPath().getName().startsWith("_")) {
        continue;
    }           

    in = fs.open(item.getPath());
    BufferedReader br = new BufferedReader(new InputStreamReader(in));

    String line;
    line = br.readLine();
    while (line != null) {
        line = line.replaceAll("(\\r|\\n)", "");
        lines.add(line.split("\t"));
        line = br.readLine();
    }
}
Run Code Online (Sandbox Code Playgroud)

我在网上搜索了很多和Stack一样,但还没找到我需要的东西.

也许这完全是错误的做法,我需要一套完全独立的代码和不同的功能来管理它.对任何建议开放.

谢谢!

正如基于以下讨论的研究所补充的那样: Hadoop过程如何记录跨越块边界的记录? Hadoop FileSplit阅读

vik*_*g21 4

我认为 SEEK 是读取大容量文件的最佳选择。它没有给我带来任何问题,因为我正在读取的数据量在 2 - 3GB 范围内。直到今天我还没有遇到任何问题,但我们确实使用文件分割来处理大数据集。下面是您可以用于阅读目的并进行测试的代码。

public class HDFSClientTesting {

/**
 * @param args
 */
public static void main(String[] args) {
    // TODO Auto-generated method stub

  try{

 //System.loadLibrary("libhadoop.so");
    Configuration conf = new Configuration();
    FileSystem fs = FileSystem.get(conf);
    conf.addResource(new Path("core-site.xml"));


    String Filename = "/dir/00000027";
    long ByteOffset = 3185041;



    SequenceFile.Reader rdr = new SequenceFile.Reader(fs, new Path(Filename), conf);
    Text key = new Text();
    Text value = new Text();

    rdr.seek(ByteOffset);
    rdr.next(key,value);
    //Plain text
    JSONObject jso = new JSONObject(value.toString());
    String content = jso.getString("body");
    System.out.println("\n\n\n" + content + "\n\n\n");

    File file =new File("test.gz");
    file.createNewFile();

}
  catch (Exception e ){
    throw new RuntimeException(e);

}
 finally{

 } 

  }

}
Run Code Online (Sandbox Code Playgroud)