大家好,3y啊。好些天没更新了,并没有偷懒,只不过始终在装置环境,差点都想放弃了。

上一次比拟大的更新是做了austin的预览地址,把企业微信的利用和机器人音讯各种的音讯类型和性能给欠缺了。上一篇文章也提到了,austin惯例的性能曾经更新得差不多了,剩下的就是各种细节的欠缺。

不晓得大家还记不记得我过后布局austin时,所画出的架构图:

当初就剩下austin-datahouse这个模块没有实现了,也有挺多同学在看代码的时候问过我这个模块在哪...其实就是还没实现,先布局,牛逼先吹出去(互联网人必备技能)

音讯推送平台推送下发【邮件】【短信】【微信服务号】【微信小程序】【企业微信】【钉钉】等音讯类型

  • https://gitee.com/zhongfucheng/austin/
  • https://github.com/ZhongFuCheng3y/austin

至于这个模块吧,我料想它的性能就是把austin相干的实时数据写到数据仓库里。一方面是做数据备份,另一方面是大多数的报表很多都得依赖数据仓库去做。实际上,生产环境也会把相干的数据写到数仓中。

而在公司里,要把数据写到数据仓库,这事对开发来说个别很简略。因为无数仓这个货色,那大多数都会有相干的根底建设了。对于开发而言,可能就是把日志数据写到Kafka,在相干的后盾配置下这个topic,就能将这个topic的数据同步到数据仓库里咯。如果是数据库的话,那应该大数据平台有同步数据的性能,对一般开发来说也就配置下表名就能同步到数据仓库里咯。

反正应用起来很简略就是了。不过,我其实不晓得具体是怎么做的。

然而不要紧啊,反正开源我的项目对于工夫这块还是很富余得啊:没有deadline,没有产品在隔壁催我写,没有相干的技术要跟我对接。那我不懂能够学,于是也花了几天看了下数仓这块内容。

在看数仓的同时,我之前在公司常常会听到数据湖这个词。我刚毕业的时候是没听过的,但这几年如同这个概念就火起来了。跟大数据那边聊点事的时候,常常会听到:数据入湖

那既然看都看了,顺便理解数据湖是个什么货色吧?对着浏览器一轮检索之后,我发现这个词还是挺形象的,始终没找到让我耳目一新的答案,这个数据湖也不晓得怎么就火起来了。我浏览了一遍之后,我大略能够总结出什么是数据湖,跟数据仓库有啥区别:

1、数据仓库是存储结构化的数据,而数据湖是什么数据都能存(非结构化的数据也能存)。结构化数据能够了解为咱们的二维表JSON数据,非结构化的数据能够了解为图像文件之类的。

数据仓库在写入的时候,就要定义好schema了,而数据湖在写入的时候不须要定schema,能够等用到的时候再查出来。强调这点,阐明数据湖对数据的schema束缚更加灵便。

2、数据仓库和数据湖并不是代替关系。数据是先进数据湖,将数据加工(ETL)之后,一部分数据会到数据仓库中。

3、咱们晓得现有的数据仓库个别基于Hadoop体系的HDFS分布式文件系统去搭建的,而数据湖也得存储数据的嘛,个别也是依赖HDFS。

4、开源的数据湖技术比拟闻名的有hudiicebergDelta Lake

看完下面的形容,是不是感觉有点空洞。看似学到了很多,然而理论还是不晓得数据湖有啥牛逼之处。嗯,我也是这么想的。总体下来,感觉数据湖就相当于数据仓库的ODS,围绕着这些数据定义了对应的meta信息,做元数据的治理。

说到ODS这个词了,就简略聊下数据仓库的分层构造吧。这个行业通用的,个别分为以下:

1、ODS(Operate Data Store),原始数据层,未通过任何加工的。

2、DIM(Dictionary Data Layer),维度数据层,比方存储地区、用户客户端这些维度的数据。

3、DWD(Data Warehouse Detail),数据明细层,把原始数据通过简略的加工(去除脏数据,空数据之后就失去明细数据)。

4、DWS(Data Warehouse Service),数据维度汇总层,比方将数据明细依据用户维度做汇总失去的汇总之后的数据。

5、ADS(Application Data Store),数据应用层,这部分数据能给到后端以接口的形式给到前端做可视化应用了。

至于为什么要分层,跟当初咱们了解DAO/Service/Controller的思维差不多,大略就是复用便于后续批改变动

扯了那么多吧,聊会ausitn我的项目吧,我是打算怎么做的呢?因为我的实时计算austin-stream模块是采纳Flink去做的,我打算austin-datahouse也是采纳flink去做。

这几年在大数据畛域湖仓一体流批一体这些概念都十分火,而对于austin来说,第一版迭代还不必走得这么急。我目前的想法是利用flinktableapi去对接Hive,通过SupersetMetabaseDataEase 其中一个开源的大数据可视化工具Hive的数据给读取进去,那第一版就差不多实现了。

现状

自从我决定开始写austin-data-house数据仓库模块,曾经过了两周有多了。这两周多我都在被部署装置环境折磨,中途有很屡次就想放弃了。

我初学编程,到当初工作了几年,我还是没变,判若两人地厌恶装置环境

花了这么长时间调试装置部署环境,实现的性能其实很简略:生产Kafka的音讯,写入hive。(我在写全链路追踪性能实时引擎用的是flink,为了技术架构对立,我还是心愿通过flink来实现。)

flink1.9开始反对hive。到目前为止,flink稳固的版本在1.16.0flink反对hive也就这两年的事。

austin所依赖的组件有很多(失常线上环境都会有这些组件,只是不必咱们本人搭建而已)。各种组件的环境问题被我一一驯服了,但有很大水平上的功绩是在docker-compose上。

说到数据仓库,第一工夫必定是想到hive。尽管我没装过hadoop/hive/hdfs大数据相干的组件,但略微想想这都是简单的。那装置hive天然就会想到有没有docker镜像,一键装置可多爽啊。

之前接入的flink也是跑在docker上的,把hive也找个镜像,两者交融交融不就行了嘛?

想法很好,我就开干了。

基础知识

flinkhive交融,实际上是借助hive catalog来买通hivehive catalog对接着hive metastore(hive存储元数据的中央)。

当咱们应用flink创立出的元数据,会经由hive catalog 最终长久化到hive metastore,同时咱们会利用hive catalog提供的接口对hive进行写入和读取。

装置hive环境

那时候简略搜了下,还真被我找到了hive的镜像,没想到这么侥幸,还是反对docker-compose的,一键装置,美滋滋。

https://github.com/big-data-europe/docker-hive

我就简略复述下过程吧,比较简单:

1、把仓库拉到本人的服务器上

git clone git@github.com:big-data-europe/docker-hive.git

2、进入到我的项目的文件夹里

cd docker-hive

3、启动我的项目

docker-compose up -d

一顿下载之后,能够发现就启动胜利了,通过docker ps 命令就看到运行几个镜像了。

没错,这就装置好hive了,是不是非常简单。具体启动了什么,咱们能够简略看下docker-compose.yml文件的内容。

最初,咱们能够连上hive的客户端,感触下疾速装置好hive的成功感。

# 进入bashdocker-compose exec hive-server bash# 应用beeline客户端连贯/opt/hive/bin/beeline -u jdbc:hive2://localhost:10000

深陷迷雾

hive装置好了之后,我就快马加鞭地想晓得怎么跟flink进行交融了。我就搜了几篇博客看个大略,起初发现大多数博客的内容其实就是翻译了flink官网的内容。

不过,翻博客的过程中让我大抵理解了一点:如果我要应用flink连贯hive,那我要手动flink连贯hivejar包导入到flink/lib目录下。

说实话,这还是比拟麻烦的。我还认为只须要在我的工程里导入相干的依赖就好了,没想到还得本人手动把jar包下来下来,而后传入到flink的装置目录下。

我吭哧吭哧地做了,但把我写好的工程jar包传上去提交给jobmanager不是缺这就是少那依赖。我置信我能搞掂,反正就是版本依赖的问题嘛,我在行的。

前面又发现在flink工程项目里用maven引入hadoop依赖是不够的,flink新版本里默认打的镜像是没有hadoop的,要手动在flink环境目录下引入hadoop。这个也是麻烦的,但只有我在镜像里下载些环境,也不是不能干。

1、装置vim

apt-get updateapt-get install vim

2、装置hadoop

2.1、下载hadoop

wget https://archive.apache.org/dist/hadoop/common/hadoop-2.7.4/hadoop-2.7.4.tar.gz

2.2、解压hadoop

tar -zxf hadoop-2.7.4.tar.gz

2.3、配置环境变量

vim /etc/profile
export HADOOP_HOME=/opt/hadoop-2.7.4export PATH=$HADOOP_HOME/bin:$PATHexport HADOOP_CLASSPATH=`hadoop classpath`
source /etc/profile

2.4、在flink的docker容器里还得把.bashrc也得改了才失效

过于乐观的我,搞了10天左右吧,终于顶不住了,下定决心:我肯定要对立版本,不能修修补补了,该什么版本就走什么版本,推倒素来吧。我就按着flink官网来走,一步一步走下来不可能错的吧!

flink最新的版本是v1.17-SNAPSHOT,那我就挑上一个稳固的版本就行了!顺便一看,我之前写全链路追踪austin接入flink的时候,代码的还是14.3版本。但管不了这么多了,就用1.16.0版本吧。

首先,我发现我的flink镜像拉取的是最新的版本image: flink:latest。那我得找1.16.0版本的docker-compose来部署,版本就得对立,前面的事才好搞。这个好找,在官网很快就找到了:image: flink:1.16.0-scala_2.12

新的镜像搞下来了当前,我又吭哧地把相干的jar都手动地导入到flink容器里。另外,我发现官网写的pom依赖,压根就下载不下来的,这不对劲啊

<dependency>  <groupId>org.apache.flink</groupId>  <artifactId>flink-table-api-java-bridge_2.12</artifactId>  <version>1.16.0</version>  <scope>provided</scope></dependency>

我开始认为是我的maven仓库配置问题,找遍了仓库在那个artifactId下,最大的也就只有1.14.x的版本。去找了下flinkissue,发现有人跟我一样的问题。

https://github.com/apache/flink/pull/21553

持续尝试提交我本人写好的flink.jar。毫无意外地,又报错了,有些是之前的报错,我很快地就能解决掉。

我一想,意识到是哪里没做好了:hive的版本,hadoop的版本,flink的版本这三者也要束缚。那我转头一看,发现之前我从镜像里拉下来hive版本是2.3.2,外面装的hadoop版本是2.7.4。于是,我又对立了这三者的版本。信念很足,感觉肯定能成。

再次提交,还是有问题,疯狂Google但就是始终找不到解决方案。能查出来的材料,网上的全都是“原始”装置部署的,就没有通过flink docker镜像跟hive交融的,而且也不是跨机器的(给进去的案例都是在同一台机器上,我是hive部署一台机器上,flink部署在另一台机器上)。

花了几天调试还是解决不掉,怎么搞呢?放弃又不甘心。咋整?持续推倒重来呗

在应用flink容器调试的过程中我曾经发现了:

1、拉下来的docker镜像里的内容,跟官网所形容的jar包是有出入的,有的是要我手动去下载的。但过后我感觉既然版本曾经限定了,那应该问题也不大。

2、hadoop环境变量在flink docker 容器下很难调试。每次从新推倒素来的时候,我都得手动配置一次,步骤也繁琐。即使我挂载了相干的jar包和整个目录

3、flink容器内重启和启动集群环境不可控,老是呈现奇奇怪怪的问题。

那这一次,我就不必docker-compose部署flink了,间接在centos装置部署flink,持续整。

随着我每一次推倒重来,我就感觉我离胜利越来越近越来越近。从环境变量报错缺失CALSS_PATH的问题,曾经到了sql的语法的问题,从sql语法的问题到找不到近程地址namenode can't found的问题,从近程地址的问题,到HDFS调用不通的问题。最初,终于调试胜利了。

上面就记录我能调试胜利的装置过程,各种坑谬误异样就不记录了(篇幅问题),这里也吐槽够了。

装置flink环境

1、下载flink压缩包

wget https://dlcdn.apache.org/flink/flink-1.16.0/flink-1.16.0-bin-scala_2.12.tgz

2、解压flink

tar -zxf flink-1.16.0-bin-scala_2.12.tgz

3、批改该目录下的conf下的flink-conf.yaml文件中rest.bind-address配置,不然近程拜访不到8081端口,将其改为0.0.0.0

rest.bind-address: 0.0.0.0

4、将flink官网提到连贯hive所须要的jar包下载到flinklib目录下(一共4个)

wget https://repo.maven.apache.org/maven2/org/apache/flink/flink-sql-connector-hive-2.3.9_2.12/1.16.0/flink-sql-connector-hive-2.3.9_2.12-1.16.0.jarwget https://repo.maven.apache.org/maven2/org/apache/hive/hive-exec/2.3.4/hive-exec-2.3.4.jarwget https://repo.maven.apache.org/maven2/org/apache/flink/flink-connector-hive_2.12/1.16.0/flink-connector-hive_2.12-1.16.0.jar wget https://repo.maven.apache.org/maven2/org/antlr/antlr-runtime/3.5.2/antlr-runtime-3.5.2.jar

5、依照官网批示把flink-table-planner_2.12-1.16.0.jarflink-table-planner-loader-1.16.0.jar 这俩个jar包挪动其目录;

mv $FLINK_HOME/opt/flink-table-planner_2.12-1.16.0.jar $FLINK_HOME/lib/flink-table-planner_2.12-1.16.0.jarmv $FLINK_HOME/lib/flink-table-planner-loader-1.16.0.jar $FLINK_HOME/opt/flink-table-planner-loader-1.16.0.jar

6、把后续kafka所须要的依赖也下载到lib目录下

wget https://repo1.maven.org/maven2/org/apache/flink/flink-connector-kafka/1.16.0/flink-connector-kafka-1.16.0.jarwget https://repo1.maven.org/maven2/org/apache/kafka/kafka-clients/3.3.1/kafka-clients-3.3.1.jar

装置hadoop环境

因为hive的镜像曾经锁死了hadoop的版本为2.7.4,所以我这边flink所以来的hadoop也是下载2.7.4版本

1、下载hadoop压缩包

wget https://archive.apache.org/dist/hadoop/common/hadoop-2.7.4/hadoop-2.7.4.tar.gz

2、解压hadoop

tar -zxf hadoop-2.7.4.tar.gz

装置jdk11

因为高版本的flink须要jdk 11,所以这边装置下该版本的jdk

yum install java-11-openjdk.x86_64yum install java-11-openjdk-devel.x86_64

配置jdk、hadoop的环境变量

这一步为了能让flink在启动的时候,加载到jdkhadoop的环境。

1、编辑/etc/profile文件

vim /etc/profile

2、文件内容最底下减少以下配置:

JAVA_HOME=/usr/lib/jvm/java-11-openjdk-11.0.17.0.8-2.el7_9.x86_64JRE_HOME=$JAVA_HOME/jreCLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/libPATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/binexport JAVA_HOME JRE_HOME CLASS_PATH PATHexport HADOOP_HOME=/root/hadoop-2.7.4export PATH=$HADOOP_HOME/bin:$PATHexport HADOOP_CLASSPATH=`hadoop classpath`

3、让配置文件失效

source /etc/profile

austin数据仓库工程代码

间接上austin仓库地址,文章篇幅就不贴代码了,该写的正文我都写了。

http://gitee.com/zhongfucheng/austin

这个工程代码量非常少,一共就4个外围文件pom.xml/hive-site.xml/AustinHiveBootStrap.java,要应用的时候留神该两处中央即可:

1、com.java3y.austin.datahouse.constants.DataHouseConstant#KAFKA_IP_PORT将这里改成本人的kafkaipport

2、hive-site.xml文件全局替换掉hive_ip为本人的hive地址,一共两处

部署工程代码到Flink

咱们把jar包上传到服务器,而后应用命令提交jar包给flink执行。也能够关上flink的治理后盾,在页面上提交jar包并启动。我这里就抉择应用命令的形式来提交,次要因为在外网透出flink的端口,很容器被攻打(我曾经重装系统几次了。。)

(flink命令在$FLINK_HOME/bin下)

./start-cluster.sh
./flink run austin-data-house-0.0.1-SNAPSHOT.jar

启动Kafka生产者写入测试数据

启动消费者的命令(将ipport改为本人服务器所部署的Kafka信息):

$KAFKA_HOME/bin/kafka-console-producer.sh --topic austinTraceLog  --broker-list ip:port

输出测试数据:

{"state":"1","businessId":"2","ids":[1,2,3],"logTimestamp":"123123"}

行将胜利

到这一步,离胜利就十分近了,但还是有通信的问题:flink无奈辨认namenode/namenodedatanode之间的通信问题等等。于是咱们须要做以下措施:

1、hive在部署的时候,减少datanode/namenode的通信端口,部署hive应用这个docker-compose文件的内容:

version: "3"services:  namenode:    image: bde2020/hadoop-namenode:2.0.0-hadoop2.7.4-java8    volumes:      - namenode:/hadoop/dfs/name    environment:      - CLUSTER_NAME=test    env_file:      - ./hadoop-hive.env    ports:      - "50070:50070"      - "9000:9000"      - "8020:8020"  datanode:    image: bde2020/hadoop-datanode:2.0.0-hadoop2.7.4-java8    volumes:      - datanode:/hadoop/dfs/data    env_file:      - ./hadoop-hive.env    environment:      SERVICE_PRECONDITION: "namenode:50070"    ports:      - "50075:50075"      - "50010:50010"      - "50020:50020"  hive-server:    image: bde2020/hive:2.3.2-postgresql-metastore    env_file:      - ./hadoop-hive.env    environment:      HIVE_CORE_CONF_javax_jdo_option_ConnectionURL: "jdbc:postgresql://hive-metastore/metastore"      SERVICE_PRECONDITION: "hive-metastore:9083"    ports:      - "10000:10000"  hive-metastore:    image: bde2020/hive:2.3.2-postgresql-metastore    env_file:      - ./hadoop-hive.env    command: /opt/hive/bin/hive --service metastore    environment:      SERVICE_PRECONDITION: "namenode:50070 datanode:50075 hive-metastore-postgresql:5432"    ports:      - "9083:9083"  hive-metastore-postgresql:    image: bde2020/hive-metastore-postgresql:2.3.0    ports:      - "5432:5432"  presto-coordinator:    image: shawnzhu/prestodb:0.181    ports:      - "8080:8080"volumes:  namenode:  datanode:

2、在部署flink服务器上减少hosts,有以下(ip为部署hive的地址):

127.0.0.1 namenode127.0.0.1 datanode127.0.0.1 b2a0f0310722

其中 b2a0f0310722datanode的主机名,该主机名会随着hivedocker而变更,咱们能够登录namenode的后盾地址找到其主机名。而办法则是在部署hive的地址输出:

http://localhost:50070/dfshealth.html#tab-datanode

3、把工程下的hive-site.xml文件拷贝到$FLINK_HOME/conf

4、hadoop的配置文件hdfs-site.xml减少以下内容(我的目录在/root/hadoop-2.7.4/etc/hadoop

<property>    <name>dfs.client.use.datanode.hostname</name>    <value>true</value>    <description>only cofig in clients</description></property>

5、启动flink-sql的客户端:

./sql-client.sh

6、在sql客户端下执行以下脚本命令,注:hive-conf-dir要放在$FLINK_HOME/conf

CREATE CATALOG my_hive WITH (    'type' = 'hive',    'hive-conf-dir' = '/root/flink-1.16.0/conf');
use catalog my_hive;
create database austin;

7、重启flink集群

./stop-cluster.sh
./start-cluster.sh

8、从新提交执行flink工作

./flink run austin-data-house-0.0.1-SNAPSHOT.jar

数据可视化

到下面为止,咱们曾经把数据写入到hive表了,咱们是不可能每一次都在命令行窗口里查问hive的数据。个别在公司里都会有可视化平台供咱们开发/数仓/数据分析师/经营 去查问hive的数据。

我简略看了几个开源的可视化平台:Superset/Metabase/DataEase。最初抉择了Metabase,无他,看着悦目一些。

部署Metabase很简略,也是应用docker进行装置部署,就两行命令(后续我会将其退出到docker-compose外面)。

docker pull metabase/metabase:latest
docker run -d -p 5001:3000 --name metabase metabase/metabase

完了之后,咱们就能够关上5001端口到Metabase的后盾了。

咱们能够在Metabase的后盾增加presto进而连贯hive去查问记录。

这个presto服务咱们在搭建hive的时候曾经一起启动了,所以这里间接应用就好了。

到这一步,咱们就能够通过在页面上写sql把音讯推送过程中埋点的明细数据查问进去

最初

这数据仓库整个装置环境和调试过程的确折腾人,屡次推倒重来(甚至不惜重装系统重来)。还好最初输出Kafka一条音讯,在hive表里能看到一条记录,能看到后果之后,折腾或者是值得的。

如果想学Java我的项目的,强烈推荐我的开源我的项目音讯推送平台Austin(8K stars) ,能够用作毕业设计,能够用作校招,能够看看生产环境是怎么推送音讯的。开源我的项目音讯推送平台austin仓库地址:

音讯推送平台推送下发【邮件】【短信】【微信服务号】【微信小程序】【企业微信】【钉钉】等音讯类型

  • https://gitee.com/zhongfucheng/austin/
  • https://github.com/ZhongFuCheng3y/austin

参考资料:

  • https://nightlies.apache.org/flink/flink-docs-release-1.16/docs/connectors/table/hive/overview/
  • https://blog.51cto.com/u_15105906/5849229
  • https://blog.csdn.net/qq_38403590/article/details/126172610