如何使用java读取与hadoop有偏移量的文件

jchrr9hc  于 2021-06-02  发布在  Hadoop
关注(0)|答案(1)|浏览(392)

问题:我想从hdfs读取文件的一部分并返回它,例如从1000行的文件中读取101-120行。
我不想用 seek 因为我读到它很贵。
我有日志文件,我正在使用pig将其处理成有意义的数据集。我一直在编写一个api来返回数据供前端使用和显示。这些处理过的数据集可能足够大,我不想一次就从hadoop中读取整个文件,以节省连线时间和带宽(比如说5-10mb)
目前我正在使用 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();
    }
}

我已经在互联网站和堆栈上翻了很多遍,但还没有找到我真正需要的东西。
也许这样做完全是错误的,我需要一组完全独立的代码和不同的函数来管理它。愿意接受任何建议。
谢谢!
根据以下讨论的研究,我们注意到:hadoop进程记录如何跨越块边界分割?hadoop文件分割读取

r6hnlfcb

r6hnlfcb1#

我认为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{

 } 

  }

}

相关问题