hdfs文件流,封装为输出流返回遇到的问题记录

问题描述

现在由于业务增加,需要将hdfs的文件(夹) 封装为输出流返回,其实这一听也很简简单单,但我在数据的读取速度上遇到了问题,如下:(这里只展示读取文件的,读取文件夹的代码需要自己改)

val aa:String = "hdfs://127.0.0.1:9000/test/my_test.jar"
//调用封好的工具类,返回FSDataInputStream文件流
val inputStream:FSDataInputStream= HdfsUtil.getFSDataInputStream(aa)
val byteArrayOutputStream = new ByteArrayOutputStream()
//这里返回时需要返回文件名,所以创建压缩流
val zos = new ZipOutputStream(byteArrayOutputStream)
val jarName = jarPath.substring(jarPath.lastIndexOf("/")+1)
val zipEntry:ZipEntry = new ZipEntry(jarName)
zos.putNextEntry(zipEntry)
var flag = true
var index = 0;
var i:Int = 0;
while(flag){
    //循环read Hdfs的文件流
    val byte:Array[Byte] =new Array[Byte](1024*1024);
    index = inputStream.read(byte,0,byte.length)
    //打印一下每次读取的字节数
    println("----------------------index------------------:"+index)
    if (index>0){
      i=i+1;
      //这个文件读取了多少次
      println("--------------i---------------:"+i)
      zos.write(byte,0,index)
    }else{
      flag = false
    }
}
zos.closeEntry()
zos.close()

读取过程如下:

在这里插入图片描述
按说260M的文件,一次读取50M,读取六次就够了;但现在结果是每次只read了128K,声明的byte数组长度没用;也追了追源码,确实找到了131072的由来;但本人才疏学浅,实在不知道调整哪里,这个问题折磨了我2个星期,今天突然开窍了:我把返回值又写到了另一个hdfs上,用的hdfs的工具类 IOUtils.copyBytes(zipInputStream,outputStream,1024*1024*50);那为什么我封装返回值要自己while循环读呢,代码还不简洁,读取速度还墨迹的要死,下面附上之前找源码 131072的由来,但具体什么原因我一直没找到,感觉学的东西都忘完了,希望有知道的可以留言告诉我下,用上面的read方法为何每次只能读取131072
在这里插入图片描述

解决问题:调用hdfs的工具类IOUtils.copyBytes copy文件流

代码调整如下:

val aa:String = "hdfs://127.0.0.1:9000/test/my_test.jar"
//调用封好的工具类,返回FSDataInputStream文件流
val inputStream:FSDataInputStream= HdfsUtil.getFSDataInputStream(aa)
val byteArrayOutputStream = new ByteArrayOutputStream()
//这里返回时需要返回文件名,所以创建压缩流
val zos = new ZipOutputStream(byteArrayOutputStream)
val jarName = jarPath.substring(jarPath.lastIndexOf("/")+1)
println("copy hdfsDir start time:"+new Date(System.currentTimeMillis()))
val zipEntry:ZipEntry = new ZipEntry(jarName)
zos.putNextEntry(zipEntry)
IOUtils.copyBytes(elem._2,zos,1024*1024*50,false)
zos.closeEntry()
println("copy hdfsDir end time:"+new Date(System.currentTimeMillis()))
zos.close()

这里也附上我测试的几个结果吧,当时是copy的文件夹,大概小一个G,所花费的时间:
在这里插入图片描述
就自己写的文件流复制方法,byte声明长度为1024 * 1024 * 50,每次读取了128K不说了,花费的时间竟然比 1024*1024 更久,这问题我也是没时间去找了,希望有人知道答案了能留言具体说明一下,多谢

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值