1. 创建项目
1.1 父工程
在IDEA中创建项目,项目架构如下

- realtime-common:用于引入公共的第三方依赖,编写工具类、实体类等。
- realtime-dim:用于编写DIM层业务代码。
- realtime-dwd:用于编写DWD层业务代码。
- realtime-dws:用于编写DWS层业务代码。
其中,后三个module统称为业务模块,业务模块都要将realtime-common模块作为依赖引入。
修改pom文件,在其中添加以下内容
<properties>
<java.version>1.8</java.version>
<maven.compiler.source>${java.version}</maven.compiler.source>
<maven.compiler.target>${java.version}</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<flink.version>1.17.1</flink.version>
<scala.version>2.12</scala.version>
<hadoop.version>3.3.4</hadoop.version>
<flink-cdc.vesion>2.4.2</flink-cdc.vesion>
<fastjson.version>1.2.83</fastjson.version>
<hbase.version>2.4.11</hbase.version>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-streaming-java</artifactId>
<version>${flink.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-clients</artifactId>
<version>${flink.version}</version>
<scope>provided</scope>
</dependency>
<dependency><!--在 idea 运行的时候,可以打开 web 页面-->
<groupId>org.apache.flink</groupId>
<artifactId>flink-runtime-web</artifactId>
<version>${flink.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-json</artifactId>
<version>${flink.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-csv</artifactId>
<version>${flink.version}</version>
<scope>provided</scope>
</dependency>
<!--如果保存检查点到hdfs上,需要引入此依赖-->
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>${hadoop.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-auth</artifactId>
<scope>provided</scope>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-reload4j</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.20</version>
<scope>provided</scope>
</dependency>
<!--Flink默认使用的是slf4j记录日志,相当于一个日志的接口,我们这里使用log4j作为具体的日志实现-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-to-slf4j</artifactId>
<version>2.14.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-table-api-java-bridge</artifactId>
<version>${flink.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-table-planner-loader</artifactId>
<version>${flink.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-table-runtime</artifactId>
<version>${flink.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-connector-files</artifactId>
<version>${flink.version}</version>
<scope>provided</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>${fastjson.version}</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-connector-kafka</artifactId>
<version>${flink.version}</version>
</dependency>
<dependency>
<groupId>com.ververica</groupId>
<artifactId>flink-connector-mysql-cdc</artifactId>
<version>${flink-cdc.vesion}</version>
</dependency>
<!-- hbase 依赖-->
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-client</artifactId>
<version>${hbase.version}</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-auth</artifactId>
<version>${hadoop.version}</version>
<scope>provided</scope>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-reload4j</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-connector-hbase-2.2</artifactId>
<version>${flink.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.doris/flink-doris-connector-1.17 -->
<dependency>
<groupId>org.apache.doris</groupId>
<artifactId>flink-doris-connector-1.17</artifactId>
<version>1.5.2</version>
</dependency>
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>1.9.4</version>
</dependency>
<dependency>
<groupId>com.janeluo</groupId>
<artifactId>ikanalyzer</artifactId>
<version>2012_u6</version>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.3.0</version>
</dependency>
<dependency>
<groupId>io.lettuce</groupId>
<artifactId>lettuce-core</artifactId>
<version>6.2.4.RELEASE</version>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.1.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<artifactSet>
<excludes>
<exclude>com.google.code.findbugs:jsr305</exclude>
<exclude>org.slf4j:*</exclude>
<exclude>log4j:*</exclude>
<exclude>org.apache.hadoop:*</exclude>
</excludes>
</artifactSet>
<filters>
<filter>
<!-- Do not copy the signatures in the META-INF folder.Otherwise, this might cause SecurityExceptions when using the JAR. -->
<!-- 打包时不复制META-INF下的签名文件,避免报非法签名文件的SecurityExceptions异常-->
<artifact>*:*</artifact>
<excludes>
<exclude>META-INF/*.SF</exclude>
<exclude>META-INF/*.DSA</exclude>
<exclude>META-INF/*.RSA</exclude>
</excludes>
</filter>
</filters>
<transformers combine.children="append">
<!-- The service transformer is needed to merge META-INF/services files -->
<!-- connector和format依赖的工厂类打包时会相互覆盖,需要使用ServicesResourceTransformer解决-->
<transformer
implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
dependencyManagement是Maven中的一个元素,它用于集中管理项目中所有依赖项的版本,而不是真正地声明这些依赖。当项目中有多个模块时,可以在父POM中集中管理所有模块的依赖版本。这确保了所有模块都使用相同的依赖版本,从而避免了版本冲突。当子模块添加已被管理的依赖时不需要声明版本,因为它已经在父工程定义了。
打包时不必包含在内的依赖的scope均为provided,本项目中主要包含3类:
- Flink相关:集群Flink的lib目录下存在的依赖,包括Flink运行环境及日志框架Log4j有关的依赖。
- Hadoop相关:hadoop-client和hadoop-auth。Flink的检查点保存在HDFS,hadoop-client用于和HDFS交互。本项目还要读写HBase,操作HBase需要引入hadoop-auth。
Lombok依赖:Lombok是一个Java库,它提供了一系列注解,旨在通过自动化某些常见的样板代码生成来简化Java代码。通过使用Lombok,开发者可以减少大量重复和冗长的代码,从而使得代码更加简洁、易读和易维护。
1.2 realtime-common
公共模块realtime-common,将第三方依赖都在公共模块的POM文件中引入,业务模块只需要引入realtime-common依赖即可。但要注意,如果realtime-common的scope为默认的compile,业务模块打包时依然会包含所有的第三方依赖,不能解决问题,所以我们将scope更改为provided,并将打好的realtime-common包放到集群Flink的lib目录下。
基类、工具类、实体类、常量类、通用的自定义函数全部放到realtime-common中。
在realtime-common模块中添加依赖,修改模块中的pom.xml文件
<dependencies>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-connector-kafka</artifactId>
</dependency>
<dependency>
<groupId>com.ververica</groupId>
<artifactId>flink-connector-mysql-cdc</artifactId>
</dependency>
<!-- hbase 依赖-->
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-client</artifactId>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-connector-hbase-2.2</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.doris/flink-doris-connector-1.17 -->
<dependency>
<groupId>org.apache.doris</groupId>
<artifactId>flink-doris-connector-1.17</artifactId>
</dependency>
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
</dependency>
<dependency>
<groupId>com.janeluo</groupId>
<artifactId>ikanalyzer</artifactId>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
<dependency>
<groupId>io.lettuce</groupId>
<artifactId>lettuce-core</artifactId>
</dependency>
</dependencies>
Flink使用log4j作为默认的日志框架,启动应用程序,控制台会打印日志,但有时默认的日志级别并不能满足我们的需求,此时就要在module的resources目录下创建log4j.properties文件,在其中对日志级别等做出调整。所有的业务模块都依赖的common模块,只需要在common模块的resources目录下准备一份log4j配置文件即可对所有模块生效。
在log4j.properties文件中写入以下内容:
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %10p (%c:%M) - %m%n
log4j.rootLogger=error,stdout
1.3 realtime-dim, realtime-dwd, realtime-dws
创建module realtime-dim,realtime-dwd, realtime-dws,并导入依赖realtime-common
<dependencies>
<dependency>
<groupId>com.atguigu</groupId>
<artifactId>realtime-common</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
</dependencies>
1.4 realtime-common的package设计

base包:包含所有业务代码的基类。
bean包:包含所有实体类。
constant包:包含所有常量类。
function包:包含所有函数类。
util包:包含所有工具类。
2. GitLab环境准备
GitLab安装在hadoop104上
2.1 安装准备
开启ssh
sudo systemctl status sshd
sudo systemctl enable sshd
sudo systemctl start sshd
开启防火墙http,https功能,已关闭防火墙可跳过,此处hadoop104之前已经关闭防火墙

2.2 rpm包安装
rpm包下载地址:gitlab/gitlab-ce - Packages · packages.gitlab.com
上传安装包至/opt/software下

编写安装脚本gitlab_install.sh,放在~/bin/目录下
sudo yum install -y curl policycoreutils-python openssh-server perl
sudo rpm -ivh /opt/software/gitlab-ce-16.2.1-ce.0.el7.x86_64.rpm
sudo yum install -y postfix
sudo systemctl enable postfix
sudo systemctl start postfix
添加权限并执行脚本
chmod +x gitlab_install.sh
gitlab_install.sh
报错:Job for postfix.service failed because the control process exited with error code. See "systemctl status postfix.service" and "journalctl -xe" for details.
查看日志
tail -n 50 /var/log/maillog # root用户
原因:Postfix 配置的
inet_interfaces包含::1,但系统不支持 IPv6 或未正确配置。解决方法:编辑
/etc/postfix/main.cf,调整inet_interfaces参数(本项目仅监听ipv4)sudo vi /etc/postfix/main.cf修改
inet_interfaces = 127.0.0.1重新加载postfix
sudo postfix check # 检查配置语法 sudo systemctl restart postfix
2.3 修改配置
2.3.1 修改external_url
sudo vim /etc/gitlab/gitlab.rb
![]()
编辑gitlab.yml,修改host
sudo vim /opt/gitlab/embedded/service/gitlab-rails/config/gitlab.yml
修改以下内容
gitlab:
## Web server settings (note: host is the FQDN, do not include http://)
host: hadoop104
port: 80
https: false
2.3.2 解决端口冲突
(1)8080端口(Zookeeper当前版本的Admin服务也会占用8080端口)
修改puma.rb
sudo vim /var/opt/gitlab/gitlab-rails/etc/puma.rb
bind 'tcp://127.0.0.1:8089'
修改gitlab.rb
sudo vim /etc/gitlab/gitlab.rb
puma['port'] = 8089
(2)8060端口(Doris的brpc_port默认端口也是8060,这个端口是用于Backends之间及Backends和Frontends通信的,如果被占用则Backend进程无法启动)
修改gitlab.rb
nginx['status'] = {
"enable" => true,
"listen_addresses" => ["127.0.0.1"],
"fqdn" => "127.0.0.1",
"port" => 9999,
"vts_enable" => true,
"options" => {
"server_tokens" => "on", # Don't show the version of NGINX
"access_log" => "on", # Disable logs for stats
"allow" => "127.0.0.1", # Only allow access from localhost
"deny" => "all" # Deny access to anyone else
}
}
3.3.3 处理头像显示异常问题
修改gitlab.rb
### Gravatar Settings
gitlab_rails['gravatar_plain_url'] = 'http://gravatar.loli.net/avatar/'
gitlab_rails['gravatar_ssl_url'] = 'https://gravatar.loli.net/avatar/'
执行初始化
sudo gitlab-ctl reconfigure
启停命令
sudo gitlab-ctl start
sudo gitlab-ctl stop
2.4 企业环境模拟
2.4.1 创建用户



用户会收到邮件可以修改密码,管理员也可以修改密码

2.4.2 创建群组
在gitlab里,可以创建出组、组下的子组。尽量不要使用中文创建组名, 可以在组信息中的备注编写中文描述以及中文组名, 组内人员名称也尽量用全拼命名。
对于人员权限以及角色的控制也比较简单,有如下五种:
- Owner:最高权限,谁去创建组,这个组就被谁拥有,它可以开除管理员,但管理员无法操作owner的角色。
- Maintainer:(管理员-只是具备sudo权限的用户)管理员一般是给小组的组长,或者是给产品线的总监设定。
- Developer:是干活的人,就是写代码的程序员,可以进行代码的上传以及代码的下载,不能下载其他的组内的代码,只能下载它们组的代码。
- Repoter:比如现在有需求,其他组的大牛到我们组过来指导工作,要审视我们的代码,人家就提出需要一个权限,我不能给它developer因为它会改你代码,其他组的人不能改我们组的代码,所以就给一个repoter权限,他只能看,只读权限。
- guest:不用看,匿名,直接去掉。一般出现在从ldap中把离职人员的信息删掉,再去gitlab查这个人的时候,它就是一个guest用户(匿名)需要再到gitlab把它删掉(不删也没事)。
假设研发部群组是rdc,下属后端组、前端组、大数据组等子群组:


创建研发中心群组rdc

在研发中心组下,再创建一个大数据组


将数据组的leader设为bigdata的负责人:


设置开发人员

最终大数据组成员

2.5 初始化项目
IDEA安装gitlab插件


配置ssh免密登录
安装Git Bash,运行以下语句(若已安装OpenSSH应用,可在Windows自带命令行界面运行)

到用户目录下.ssh查看id_rsa.pub文件


获取gitlab的个人令牌

创建后,可以查看和复制生成的token:

IDEA中添加gitlab服务

使用docker容器部署时,使用zerotier创建虚拟网络的情况下,服务器应填写“http://<服务器的zerotier IP>:<gitlab80端口映射到宿主机的端口号>”
修改默认分支保护策略

在父工程下创建.gitignore文件

写入以下内容
/**/target
/**/.idea
*.iml
*.class
**/*/dependency-reduced-pom.xml
分享到gitlab
在gitlab上新建项目








421

被折叠的 条评论
为什么被折叠?



