1.大数据方面核心技术有哪些?
2.详解flink中Look up维表的源码使用
大数据方面核心技术有哪些?
大数据技术的体系庞大且复杂,基础的源码技术包含数据的采集、数据预处理、源码分布式存储、源码数据库、源码数据仓库、源码凤尾战法源码公式机器学习、源码并行计算、源码可视化等。源码
1、源码数据采集与预处理:FlumeNG实时日志收集系统,源码支持在日志系统中定制各类数据发送方,源码用于收集数据;Zookeeper是源码crapy源码剖析一个分布式的,开放源码的源码分布式应用程序协调服务,提供数据同步服务。源码
2、数据存储:Hadoop作为一个开源的框架,专为离线和大规模数据分析而设计,HDFS作为其核心的存储引擎,已被广泛用于数据存储。HBase,是一个分布式的、面向列的开源数据库,可以认为是hdfs的封装,本质是滴滴小猪源码数据存储、NoSQL数据库。
3、数据清洗:MapReduce作为Hadoop的查询引擎,用于大规模数据集的并行计算。
4、数据查询分析:Hive的核心工作就是把SQL语句翻译成MR程序,可以将结构化的数据映射为一张数据库表,并提供HQL(HiveSQL)查询功能。Spark启用了内存分布数据集,除了能够提供交互式查询外,它还可以优化迭代工作负载。
5、macos源码解析数据可视化:对接一些BI平台,将分析得到的数据进行可视化,用于指导决策服务。
详解flink中Look up维表的使用
背景
在流式计算领域,维表是一种常用概念,主要用于SQL的JOIN操作,以实现对流数据的补充。比如,我们的数据源stream是订单日志,日志中仅记录了订单商品的ID,缺乏其他信息。但在数据分析时,python联盟源码我们需要商品名称、价格等详细信息,这时可以通过查询维表对数据进行补充。
维表通常存储在外部存储中,如MySQL、HBase、Redis等。本文以MySQL为例,介绍Flink中维表的使用。
LookupableTableSource
Flink提供LookupableTableSource接口,用于实现维表功能。通过特定的key列查询外部存储,获取相关信息,以补充stream数据。
LookupableTableSource有三个方法
在Flink中,实现LookupableTableSource接口的主要有四个类:JdbcTableSource、HBaseTableSource、CsvTableSource和HiveTableSource。本文以JDBC为例,讲解如何进行维表查询。
实例讲解
以下是一个示例,首先定义stream source,使用Flink 1.提供的datagen生成数据。
我们模拟生成用户数据,范围在1-之间。
datagen具体的使用方法请参考:
聊聊Flink 1.中的随机数据生成器-DataGen connector
然后创建一个MySQL维表信息:
该MySQL表中样例数据如下:
最后执行SQL查询,流表关联维表:
结果示例如下:
对于维表中存在的数据,已关联出来,对于维表中不存在的数据,显示为null。
完整代码请参考:github.com/zhangjun0x...
源码解析JdbcTableSource
以JDBC为例,看看Flink底层是如何实现的。
JdbcTableSource#isAsyncEnabled方法返回false,即不支持异步查询,因此进入JdbcTableSource#getLookupFunction方法。
最终构造一个JdbcLookupFunction对象。
JdbcLookupFunction
接下来看看JdbcLookupFunction类,它是TableFunction的子类,具体使用可参考以下文章:
Flink实战教程-自定义函数之TableFunction
TableFunction的核心是eval方法,在该方法中,主要工作是使用多个keys拼接成SQL查询数据,首先查询缓存,缓存有数据则直接返回,缓存无数据则查询数据库,并将查询结果返回并放入缓存。下次查询时,直接查询缓存。
为什么要加缓存?默认情况下不开启缓存,每次查询都会向维表发送请求,如果数据量较大,会给存储维表的系统造成压力。因此,Flink提供了LRU缓存,查询维表时,先查询缓存,缓存无数据则查询外部系统。如果某个数据查询频率较高,一直被命中,则无法获取新数据。因此,缓存需要设置超时时间,超过这个时间则强制删除该数据,查询外部系统获取新数据。
如何开启缓存?请参考JdbcLookupFunction#open方法:
即cacheMaxSize和cacheExpireMs需要同时设置,构造缓存对象cache来缓存数据。这两个参数对应的DDL属性为lookup.cache.max-rows和lookup.cache.ttl。
对于具体的缓存大小和超时时间的设置,用户需要根据自身情况自行定义,在数据准确性和系统吞吐量之间进行权衡。