文档章节

如何在Scala中读取Hadoop集群上的gz压缩文件

九劫散仙
 九劫散仙
发布于 2017/04/05 19:02
字数 688
阅读 32
收藏 0

存在Hadoop集群上的文件,大部分都会经过压缩,如果是压缩后的文件,我们直接在应用程序中如何读取里面的数据?答案是肯定的,但是比普通的文本读取要稍微复杂一点,需要使用到Hadoop的压缩工具类支持,比如处理gz,snappy,lzo,bz压缩的,前提是首先我们的Hadoop集群得支持上面提到的各种压缩文件。

本次就给出一个读取gz压缩文件的例子核心代码:

  def readHdfsWriteKafkaByDate(fs:FileSystem,date:String,conf:Configuration,topic:String,finishTimeStamp:Long):Unit={
  
  //访问hdfs文件,只读取gz结尾的压缩文件,如果是.tmp结尾的不会读取
    val path=new Path("/collect_data/userlog/"+date+"/log*.gz")
    //实例化压缩工厂编码类
    val factory = new CompressionCodecFactory(conf)
    //读取通配路径
    val items=fs.globStatus(path)
    var count=0
    //遍历每一个路径文件
    items.foreach(f=>{
    //打印全路径
      println(f.getPath)
      //通过全路径获取其编码
      val codec = factory.getCodec(f.getPath())//获取编码
      //读取成数据流
      var  stream:InputStream = null;
      if(codec!=null){
      //如果编码识别直接从编码创建输入流
        stream = codec.createInputStream(fs.open(f.getPath()))
      }else{
      //如果不识别则直接打开
        stream = fs.open(f.getPath())
      }
      val writer=new StringWriter()
      //将字节流转成字符串流
      IOUtils.copy(stream,writer,"UTF-8")
      //得到字符串内容
      val raw=writer.toString
      //根据字符串内容split出所有的行数据,至此解压数据完毕
      val raw_array=raw.split("\n")
      //遍历数据      
      raw_array.foreach(line=>{

        val array = line.split("--",2) //拆分数组
        val map = JSON.parseObject(array(1)).asScala
        val userId = map.get("userId").getOrElse("").asInstanceOf[String] //为空为非法数据
        val time = map.get("time").getOrElse("") //为空为非法数据
        if(StringUtils.isNotEmpty(userId)&&(time+"").toLong<=finishTimeStamp){//只有数据
          pushToKafka(topic,userId,line)
          count=count+1
        }

      })

    })

  }

压缩和解压模块用的工具包是apache-commons下面的类:

import org.apache.commons.io.IOUtils
import org.apache.commons.lang.StringUtils

如果想在Windows上调试,可以直接设置HDFS的地址即可

-     val conf = new Configuration()//获取hadoop的conf
//    conf.set("fs.defaultFS","hdfs://192.168.10.14:8020/")//windows上调试用

至此数据已经解压并读取完毕,其实并不是很复杂,用java代码和上面的代码也差不多类似,如果直接用原生的api读取会稍微复杂,但如果我们使用Hive,Spark框架的时候,框架内部会自动帮我们完成压缩文件的读取或者写入,对用户透明,当然底层也是封装了不同压缩格式的读取和写入代码,这样以来使用者将会方便许多。

参考文章:

https://blog.matthewrathbone.com/2013/12/28/reading-data-from-hdfs-even-if-it-is-compressed

有什么问题可以扫码关注微信公众号:我是攻城师(woshigcs),在后台留言咨询。 技术债不能欠,健康债更不能欠, 求道之路,与君同行。

输入图片说明

© 著作权归作者所有

九劫散仙
粉丝 266
博文 175
码字总数 189625
作品 0
海淀
私信 提问
spark集群详细搭建过程及遇到的问题解决(三)

上篇文章中讲完了如何配置免密码登录的问题,现在讲述下,三个节点的环境配置过程。 所需要的hadoop-2.7.3.tar.gz 、 jdk-7u79-linux-x64.tar.gz 、 scala-2.11.6.tgz 、 spark-2.0.1-bin-ha...

lefteva
2016/11/17
0
0
hadoop+spark详细的部署过程

准备软件包 1、hadoop-2.7.2.tar.gz http://mirror.bit.edu.cn/apache/hadoop/common/ 2、scala-2.10.4.tgz http://www.scala-lang.org/download/2.10.4.html 3、spark-2.0.0-bin-hadoop2.7......

天涯有梦
2017/07/18
0
0
Scala-2.12.2和Spark-2.1.0安装配置(基于Hadoop2.7.3集群)

Hadoop集群环境 安装配置详见: Hadoop完全分布式集群安装及配置(基于虚拟机) Ubuntu镜像版本: ubuntu-16.04.2-server-amd64.iso JDK版本: jdk1.8 Hadoop版本: hadoop-2.7.3 已安装的H...

quiet_girl
2017/07/21
0
0
配置hadoop+pyspark环境

配置hadoop+pyspark环境 1、部署hadoop环境 配置hadoop伪分布式环境,所有服务都运行在同一个节点上。 1.1、安装JDK 安装jdk使用的是二进制免编译包,下载页面 下载jdk 解压文件,配置环境变...

巴利奇
2018/10/30
0
0
spark-2.2.0 集群安装部署以及hadoop集群部署

Spark在生产环境中,主要部署在安装Linux系统的集群中。在linux系统中安装Spark需要预先安装JDK、Scala等所需要的依赖。 由于Spark是计算框架,所以需要预先在集群内有搭建好存储数据的持久化...

huaishu
2017/08/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

二、Docker

1、Docker - The TLDR(Too Long,Don't Read,Linxu 终端工具 ) Docker是在Linux和Windows上运行的软件。它创建、管理和编排容器。该软件以开源方式开发,在Github上作为Moby开源项目的一部分。...

倪伟伟
23分钟前
2
0
Python猫荐书系列之七:Python入门书籍有哪些?

本文原创并首发于公众号【Python猫】,未经授权,请勿转载。 原文地址:https://mp.weixin.qq.com/s/ArN-6mLPzPT8Zoq0Na_tsg 最近,猫哥的 Python 技术学习群里进来了几位比较特殊的同学:一...

豌豆花下猫
今天
5
0
Guava RateLimiter限流源码解析和实例应用

在开发高并发系统时有三把利器用来保护系统:缓存、降级和限流 缓存 缓存的目的是提升系统访问速度和增大系统处理容量 降级 降级是当服务出现问题或者影响到核心流程时,需要暂时屏蔽掉,待高...

算法之名
今天
13
0
国产达梦数据库与MySQL的区别

背景 由于项目上的需要,把项目实现国产化,把底层的MySQL数据库替换为国产的达梦数据库,花了一周的时间研究了国产的数据库-达梦数据库,它和MySQL有一定的区别,SQL的写法也有一些区别。 ...

TSMYK
今天
2
0
老也有错?35岁程序员是一道坎,横亘在每个技术职场人的心中

随着互联网的高速发展变革,大龄恐惧症越来越多地在技术圈被人讨论。很多程序员在工作5-10年以后,都会开始思考5年、10年甚至更久以后的自己,会是怎样一种生活工作状态,以及是否会被时代抛...

我最喜欢三大框架
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部