OLAP平台

  拿到需求,第一个你要理解数据的场景,比如数据的含义,怎么产生,从哪里可以取,  第二个就是数据的格式及特点,规不规则,采用什么工具进行提取更合适,以及最后目标存储,差异在哪

  比如这里就是传感器的数据采集存储为CSV的格式,最后要转储到Hbase中,以供查询详情,其中能用于唯一标记事件,以及需要频繁过滤的字段,需要理解和关注

Table Schema的设计

  table设计,分析数据的特点:数据主要是记录传感器的事件,首先把最上面一级的分类做为RowKey,也就是传感器id,Rowkey需要考虑是否会热点写,如果存在这样的问题,需要采用手段灰度掉,比如加盐,hash,像这里的传感器id首位字符是4,如果按照默认的,会分到一个region里,发生热点写,这里可以采用hash md5作为RowKey存储

  从读写两个方面出发:

  写,除了使用spark RDD解析csv格式,然后存储到HBase中,也就是bulkput方式(Spark 和 Hbase交互),这种方式效率会低点,我其实还可以用bulk load方式,这种方式本质上就是把其他格式的数据转成HFile文件,Hbase加载HFile文件是很快

   读,在Hbase中,如果走rowKey查询很快,像目前这种场景,需要过滤传感器id、eventType、部件名等,多个过滤条件,当然你可以采用多个过滤条件做为RowKey,但是这样在存储效率上会很低,所以这里会借用外部系统solr来实现

  综上,无论读写,其实都不太关注RowKey

  确定RowKey后,就需要确定列了,首先看数据格式一致,并且也没有常不常用的字段之分,所以可以用一个Column Family,而光传感器id无法给event做到唯一,所以把event id作为Column Qualifier,列的属性:比如key存储方面Data Block Encoder,列很多,用Fast Diff,而value存储方面Compression采用Snappy,至于HFile过滤方面Bloom Filter,因为采用bulk load方式导入数据,只有一个HFile,所以这种过滤机制不考虑,以及预切分考虑Pre Split,由于RowKey采用md5值存储,那预切分规则则用HexStringSplit

  你会不会有疑问:列这么设计了,那其他字段值怎么存储?这里采用AVRO object进行存储,压缩效率也比较高,并且使用avro-maven-plugin插件,帮你把avsc schema文件转成java类,这样方便进行序列化

  用Spark写,发现坑很多,写不出来,后用MapReduce(转HFile代码),其中注意的是覆写map方法,但是只是简单的转换格式,不用聚合,所以不用写reduce方法

 //1 : 创建HBase表
 create 'sensor', {NUMREGIONS => 2, SPLITALGO => 'HexStringSplit'}, {NAME => 'v', COMPRESSION => 'NONE', BLOOMFILTER => 'NONE'}

 //2:将csv文件的数据上传到HDFS中
 hadoop fs -put omneo.csv hdfs://master-dev:9999//user/hadoop-twq/hbase-course/20180507

 //3:将CSV文件转成HFile文件
 hadoop jar practice-1.0-SNAPSHOT-jar-with-dependencies.jar com.twq.hbase.storage.ConvertToHFile \
 hdfs://master:9999//user/hadoop-twq/hbase-course/20180506/omneo.csv \
 hdfs://master:9999/user/hadoop-twq/hbase-course/hfiles/20180506 sensor

 //4:将转成的HFi了文件导入到HBase中
 hbase org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles /user/hadoop-twq/hbase-course/hfiles/20180506 sensor

 //5:验证数据
 count 'sensor', INTERVAL=>40000,CACHE=>40000
 scan 'sensor', {LIMIT => 1}

  方案缺点:转储时只适用批量离线场景,如果是实时,则必须走bulkput或者put接口

  导入数据(HBase)后,需要对AVRO object反序列验证,代码

  Solr实验版和生产环境安装和使用, 其中需要注意的是:在给solr导数据时,默认给字段值进行类型推荐,这个不推荐,需要我们手动关闭,然后手动添加字段,并且这个添加过程会选择是否Index,如果选择了,后期可以对这个字段使用分词技术进行过滤,并且记住操作Solr,无论是页面还是命令行都是通过http进行访问的

  搭建好Solr后,我们需要对solr导入数据,建立索引,也就是scan表中的数据获取需要建立索引的字段值和RowKey,然后通过dataset存到solr中(spark-solr模块提供了spark直接和solr交互存储的接口)

  走Solr索引查询数据,通过solr-solrj提供了客户端接口连接solr,构造查询参数,循环获取RowKey构造gets,然后查询hbase,获取对应的event

  其他考虑:数据量估算,计算资源配置,集群规模

posted @ 2021-01-17 18:46  财经知识狂魔  阅读(87)  评论(0编辑  收藏  举报