java - 将大型 gzip 数据文件上传到 HDFS

标签 java hadoop hdfs gzipinputstream

我有一个用例,我想在 HDFS 上上传大的 gzip 文本数据文件(~ 60 GB)。

我下面的代码需要大约 2 个小时才能以 500 MB 的 block 上传这些文件。以下是伪代码。我正在检查是否有人可以帮助我减少这个时间:

i) int fileFetchBuffer = 500000000; System.out.println("文件获取缓冲区为:"+ fileFetchBuffer); int 偏移量 = 0; int bytesRead = -1;

    try {
        fileStream = new FileInputStream (file);    
        if (fileName.endsWith(".gz")) {
            stream = new GZIPInputStream(fileStream);

            BufferedReader reader = new BufferedReader(new InputStreamReader(stream)); 

            String[] fileN = fileName.split("\\.");
            System.out.println("fil 0 : " + fileN[0]);
            System.out.println("fil 1 : " + fileN[1]);
            //logger.info("First line is: " + streamBuff.readLine());

            byte[] buffer = new byte[fileFetchBuffer];

            FileSystem fs = FileSystem.get(conf);

            int charsLeft = fileFetchBuffer;
            while (true) {

                charsLeft = fileFetchBuffer;    



             logger.info("charsLeft outside while: " + charsLeft);

          FSDataOutputStream dos = null;
                while (charsLeft != 0) {
                    bytesRead = stream.read(buffer, 0, charsLeft);
                    if (bytesRead < 0) {
                        dos.flush();
                        dos.close();
                        break;
                    }
                    offset = offset + bytesRead;
                    charsLeft = charsLeft - bytesRead; 
                    logger.info("offset in record: " + offset);
                    logger.info("charsLeft: " + charsLeft);
                    logger.info("bytesRead in record: " + bytesRead);
                    //prettyPrintHex(buffer);

                    String outFileStr = Utils.getOutputFileName(
                            stagingDir,
                            fileN[0],
                            outFileNum);

                    if (dos == null) {
                    Path outFile = new Path(outFileStr);
                    if (fs.exists(outFile)) {
                        fs.delete(outFile, false);
                    }

                    dos = fs.create(outFile);
                    }

                    dos.write(buffer, 0, bytesRead);


                } 

                logger.info("done writing: " + outFileNum);
                dos.flush();
                dos.close();

                if (bytesRead < 0) {
                    dos.flush();
                    dos.close();
                    break;
                }

                outFileNum++;

            }  // end of if


        } else {
            // Assume uncompressed file
            stream = fileStream;
        }           

    } catch(FileNotFoundException e) {
        logger.error("File not found" + e);
    }

最佳答案

您应该考虑使用 super package IO from Apache .

它有一个方法

IOUtils.copy( InputStream, OutputStream )

这将大大减少复制文件所需的时间。

关于java - 将大型 gzip 数据文件上传到 HDFS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6443245/

相关文章:

java - Spring REST - 抽象父类(super class)中的 @createdDate 抛出错误

hadoop - yarn - 为什么应用程序尝试两次?

hadoop - 简单 Yarn 应用程序的 NoClassDefFoundError

hadoop - 执行start-dfs.sh未能启动hdfs守护程序

java - 鼠标监听器界面和绘画

java - + 和 Stringbuilder 追加性能

java - 计算Google App Engine/Java中的时差

hadoop - 使用 “declare”定义要在PIG中加载的s3 url

hadoop - HDFS block 大小及其与底层物理文件系统 block 大小的关系

hadoop - 来自Flume的Kafka的EOFException