05 开发环境和远程仓库Gitlab准备
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解决--><transformerimplementation="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: hadoop104port: 80https: 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服务
修改默认分支保护策略
在父工程下创建.gitignore文件
写入以下内容
/**/target
/**/.idea
*.iml
*.class**/*/dependency-reduced-pom.xml
分享到gitlab
在gitlab上新建项目