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解决-->
                            <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上新建项目

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值