Hadoop 如何将大量数据从Java写入HDFS

Hadoop 如何将大量数据从Java写入HDFS,hadoop,hdfs,Hadoop,Hdfs,我们的Java应用程序会在长时间运行的程序中生成大量数据,但无法高效地存储数据 Public class HDFSWriter { FSDataOutputStream out = null; FileSystem fs = null; Configuration conf = null; static int linescounter = 0; void CreateHDFSFile() { Path filePath = new Pa

我们的Java应用程序会在长时间运行的程序中生成大量数据,但无法高效地存储数据

Public class HDFSWriter {
    FSDataOutputStream out = null;
    FileSystem fs = null;
    Configuration conf = null;
    static int linescounter = 0;

    void CreateHDFSFile() {
        Path filePath = new Path("filename.CSV");
        conf = new Configuration();
        fs = FileSystem.get(conf);
        out = fs.create(filePath);
    }

    void writeHDFSFile(String csvLine) {
        out.writeBytes(csvLine);
        linescounter++;
        if(linescounter>=500) {
            linescounter=0;
            out.writeBytes(csvLine);
            //out.hsync();
            //out.hflush();
        }
    }

    void close() {
        fs.close();
    }
}
CreateHDFSFile方法称为程序的开始

为要插入HDFS文件的每一行调用writeHDFSFile方法

在程序结束时调用close方法

即使我调用了hsync或hflush,数据也不会出现在HDFS中。它仅在完整程序完成后出现,即fs.close之后


如何在创建HDFS文件期间,或在每个时间间隔或特定数量的记录中提供数据?

在我回答之前,有几个问题:如果您的作业太大,为什么要用Java应用程序处理它?这项工作需要多长时间?您需要在中间阶段访问此数据吗?这是一种流式作业,它不断生成数据。我们需要在HDFS中每天创建一个文件。是的,这些数据应该可以在中间阶段获得。然后你必须看看Storm和HdfsBolt。让非分布式Java作业处理实时大数据是一个非常糟糕的主意。。。。它基于RotationPolicy生成多个文件,文件名将采用命名格式而不是标准文件名,逗号不应用作分隔符。。。。