前言:
基于spark框架读取HDFS日志文件数据,进行ETL操作,最终将数据插入到HBase表中
采集数据有很多 事件类型,不同的事件类型字段类型不一样
HBase表的设计
每天一张表,每次分析的数据为一条的数据,rowkey设计
rowkey设计
满足:唯一性、热点性、前缀匹配
例:
a)服务器的时间
b)用户ID + 会员ID+ 事件名称 ->CRC32处理,得到一个Long数字
ETL
数据从来源端经过萃取(extract)、转置(transform)、加载(load)至目的端
使用场景
要对某些日志数据文件进行分析时
ETL这一步是避免不了的
因为采集到的日志数据,总会有一部分脏数据
这部分脏数据可能会对后续的指标分析造成影响
所以要对数据进行一些操作,将数据转换成比较有规律的
我们想要的数据
步骤总结
第一步:读取资源
采集日志文件使用的工具有很多,如flume、kafka、ELk等工具
这些工具可以将采集到的日志数据存放到相应的文件系统中
如Flume可以将采集到的数据存放到HDFS,HIVE中
Spark可以从很多地方读取数据,比如HBase,HIVE,HDFS
但读取到的类型不同,比如HBase读到的是rowkey和result
第二步:转换格式
使用Spark的SparkContext或SparkSession可以从不同位置读取到数据
都会形成一个RDD(Resilient Distributed Datasets),弹性分布式数据集
RDD可以说是Spark的核心数据集合
此处常使用map方法操作读取到的RDD,将其中的数据转换成想要的数据格式
第一步中读取到的类型,为方便处理分析,往往将读取到的数据转换为元组
第三步:过滤脏数据,补全数据
ETL的功能,可以将对数据进行过滤
将我们不需要的数据进行过滤
将可以补全且需要的数据进行补全
第四步:提取想要的数据
在这一步,通常进行的操作即是将我们需要的数据
避免分析数据过于庞大
减小处理数据占用的资源
返回的大多是二元组或者多元组
第五步:保存数据结果
要考虑存放到HBase中时,rowkey的问题
在这一步就要将rowkey设计并生成
rowkey生成要满足三个点:唯一、热点、前缀匹配
同时在这一步,要将生成的rowkey进行转换
转换为ImmutableBytesWritable类型
还用生成一个Put对象,将截取出的数据进行Bytes转换后放到Put对象中
转换后的rowkey也要放到改put对象中
这一步的操作是在map中进行的
所以最后返回的值类型是一个二元组
key就是rowkey,value就是Put对象
第六步:结果到Hbase表中
建立HBase表时,要注意表名的设置,一般是每天都要分析数据
所以建议表名为日期,可以避免表名重复
或者将其作为参数,在执行Spark程序时将表面传入
同时设置表的数据压缩方式,并建立预分区
会用到RDD.saveAsNewAPIHadoopDataset()方法将数据存放到HBase中
最后关闭资源