当前位置: 首页 > news >正文

05 开发环境和远程仓库Gitlab准备

1. 创建项目

1.1 父工程

在IDEA中创建项目,项目架构如下

  1. realtime-common:用于引入公共的第三方依赖,编写工具类、实体类等。
  2. realtime-dim:用于编写DIM层业务代码。
  3. realtime-dwd:用于编写DWD层业务代码。
  4. 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上新建项目

http://www.xdnf.cn/news/1365589.html

相关文章:

  • coze工作流200+源码,涵盖AI文案生成、图像处理、视频生成、自动化脚本等多个领域
  • 向量库Qdrant vs Milvus 系统详细对比
  • 智能专网升级:4G与5G混合组网加速企业数字化转型
  • FunASR基础语音识别工具包
  • 【Canvas与标牌】维兰德汤谷公司logo
  • JavaScript 中类(class)的super 关键字
  • 【YOLOv5部署至RK3588】模型训练→转换RKNN→开发板部署
  • UniApp文件上传大小限制问题解决方案
  • kafka 副本集设置和理解
  • kafka常用命令
  • 宋红康 JVM 笔记 Day07|本地方法接口、本地方法栈
  • Linux(四):进程状态
  • python项目中pyproject.toml是做什么用的
  • SDC命令详解:使用set_timing_derate命令进行约束
  • K8s高可用:Master与候选节点核心解析
  • 基于MalConv的恶意软件检测系统设计与实现
  • 力扣(用队列实现栈)
  • SSH 反向隧道:快速解决服务器网络限制
  • 蜗牛播放器 Android TV:解决大屏观影痛点的利器
  • 【科研绘图系列】R语言绘制代谢物与临床表型相关性的森林图
  • 从0死磕全栈第1天:从写一个React的hello world开始
  • leetcode 238 除自身以外数组的乘积
  • PHP学习笔记1
  • 基于MATLAB实现支持向量机(SVM)进行预测备
  • 数据结构青铜到王者第三话---ArrayList与顺序表(1)
  • 【数学·三角函数】两角和差公式 二倍角公式
  • idea官网选择具体版本的下载步骤
  • easy-dataset的安装
  • 【STM32】G030单片机的独立看门狗
  • 不止效率工具:AI 在文化创作中如何重构 “灵感逻辑”?