Skip to main content

· 18 分钟阅读
ruY9527

环境以及版本

  • jdk-8 , maven-3.6.3
  • node-14.15.0(是否需要自己编译前端代码调整)
  • Gradle-4.6(是否编译Qualitis质量服务)
  • hadoop-3.1.1,Spark-3.0.1,Hive-3.1.2,Flink-1.13.2,Sqoop-1.4.7 (Apache版本)
  • linkis-1.1.1
  • DataSphereStudio-1.1.0
  • Schudulis-0.7.0
  • Qualitis-0.9.2
  • Visualis-1.0.0
  • Streamis-0.2.0
  • Exchangis-1.0.0
  • Chrome建议100以下的版本

各组件场景以及版本

系统名字版本场景
linkis1.1.1引擎编排,运行执行hive,spark,flinkSql,shell,python等,数据源统一管理等
DataSphereStudio1.1.0实现对任务的dag编排,实现整合其他系统的规范以及统一接入,提供基于SparkSql的服务Api
Schudulis0.7.0任务调度,以及调度详情和重跑,并且提供基于选择时间的补漏数据
Qualitis0.9.2提供内置Sql的版本等功能,对常见的数据质量以及可以自定义sql,对一些不符合规则的数据进行校验并写入到对应的库中
Exchangis1.0.0Hive到Mysql,Mysql到Hive之间的数据交换
Streamis0.2.0流式开发应用中心
Visualis1.0.0可视化报表展示,可以分享外链接

部署顺序

从序号3之后的顺序可以自己选择进行调整.但是在部署exchangis中需要注意一点,将exchangis的sqoop引擎插件,给copy到linkis的lib下的engine插件包下 Schedulis,Qualitis,Exchangis,Streamis,Visualis等系统,都是通过各自的appconn来与dss进行整合,注意每次整合组件-appconn后,进行重启dss对应的服务模块或者重启dss

  1. linkis
  2. DataSphereStudio
  3. Schedulis
  4. Qualitis
  5. Exchangis
  6. Streamis
  7. Visualis

image.png

如果你集成了Skywalking的话,就可以在扩拓扑图中,看到服务的状态和连接状态,如下图 image.png 同时你也可以看清晰到在追踪中看到调用链路,如下图,也便于你定位具体服务的错误日志文件 image.png

依赖调整以及打包

linkis

由于spark是采用了3.x版本的,scala也是需要升级到12版本 原项目代码地址 适配修改代码参考地址

linkis的pom文件

<hadoop.version>3.1.1</hadoop.version>
<scala.version>2.12.10</scala.version>
<scala.binary.version>2.12</scala.binary.version>

<!-- 将hadoop-hdfs 替换成为hadoop-hdfs-client -->
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-hdfs-client</artifactId>
<version>${hadoop.version}</version>

linkis-hadoop-common的pom文件

       <!-- 注意这里的 <version>${hadoop.version}</version> , 根据你有没有遇到错误来进行调整 --> 
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-hdfs-client</artifactId>
<version>${hadoop.version}</version>
</dependency>

linkis-engineplugin-hive的pom文件

<hive.version>3.1.2</hive.version>

linkis-engineplugin-spark的pom文件

<spark.version>3.0.1</spark.version>

SparkScalaExecutor 中 getField 方法需调整下代码

protected def getField(obj: Object, name: String): Object = {
// val field = obj.getClass.getField(name)
val field = obj.getClass.getDeclaredField("in0")
field.setAccessible(true)
field.get(obj)
}

linkis-engineconn-plugin-flink的pom文件

<flink.version>1.13.2</flink.version>

由于flink1.12.2版本和1.13.2有些类的调整,这里目前参考社区同学给出的临时"暴力"方法: 将1.12.2部分的类给copy到1.13.2,调整scala版本到12,自己编译 涉及到flink具体的模块: flink-sql-client_${scala.binary.version}

-- 注意,下列的类是从1.12.2给copy到1.13.2版本来
org.apache.flink.table.client.config.entries.DeploymentEntry
org.apache.flink.table.client.config.entries.ExecutionEntry
org.apache.flink.table.client.gateway.local.CollectBatchTableSink
org.apache.flink.table.client.gateway.local.CollectStreamTableSink

image.pngimage.png

linkis-engineplugin-python

参考pr 如果linkis-engineplugin-python下的resource/python的python.py文件中,有import pandas as pd , 如果不想安装pandas的话,需对其进行移除

linkis-label-common

org.apache.linkis.manager.label.conf.LabelCommonConfig 修改默认版本,便于后续的自编译调度组件使用

    public static final CommonVars<String> SPARK_ENGINE_VERSION =
CommonVars.apply("wds.linkis.spark.engine.version", "3.0.1");

public static final CommonVars<String> HIVE_ENGINE_VERSION =
CommonVars.apply("wds.linkis.hive.engine.version", "3.1.2");

linkis-computation-governance-common

org.apache.linkis.governance.common.conf.GovernanceCommonConf 修改默认版本,便于后续的自编译调度组件使用

  val SPARK_ENGINE_VERSION = CommonVars("wds.linkis.spark.engine.version", "3.0.1")

val HIVE_ENGINE_VERSION = CommonVars("wds.linkis.hive.engine.version", "3.1.2")

编译

确保以上修改和环境都有,依次执行

    cd linkis-x.x.x
mvn -N install
mvn clean install -DskipTests

编译错误

  • 如果你整理进行编译的时候,出现了错误,尝试单独进入到一个模块中进行编译,看是否有错误,根据具体的错误来进行调整
  • 比如下面举例(群友适配cdh低版本的时候,存在py4j版本不适配): 如果你遇到了这种问题,可以调整下有对应方法的版本来进行是否适配

image.png

DataSphereStudio

原项目代码地址 适配修改代码参考地址

DataSphereStudio的pom文件

由于dss依赖了linkis,所有编译dss之前编译linkis

<!-- scala 环境一致 -->
<scala.version>2.12.10</scala.version>

dss-dolphinschuduler-token

DolphinSchedulerTokenRestfulApi: 去掉类型的转换

responseRef.getValue("expireTime")

web调整

前端编译地址 参考pr 将如下目录从master分支的内容覆盖,或者web基于master分支去build image.png

编译

    cd DataSphereStudio
mvn -N install
mvn clean install -DskipTests

Schedulis

原项目代码地址 适配修改代码参考地址

Schedulis的pom文件

       <hadoop.version>3.1.1</hadoop.version>
<hive.version>3.1.2</hive.version>
<spark.version>3.0.1</spark.version>

azkaban-jobtype

下载对应版本的jobtype文件(注意对应好版本): 下载地址 下载完后,将整个jobtypes放在jobtypes下 image.png

Qualitis

原项目代码地址

forgerock包下载

release地址 下的release-0.9.1,解压完后放在.m2\repository\org下即可.

编译

gradle建议使用4.6

cd Qualitis
gradle clean distZip

编译完后,会再qualitis下有一个qualitis-0.9.2.zip文件 image.png

dss-qualitis-appconn编译

将appconn内从给copy到DataSphereStudio下的appconns中(创建dss-qualitis-appconn文件夹),如下图 对dss-qualitis-appconn进行编译,out下的qualitis就是dss整合qualitis的包 image.png

Exchangis

原项目代码地址 适配修改代码参考地址

Exchangis的pom文件

<!-- scala 版本保持一致 -->
<scala.version>2.12.10</scala.version>

后端编译

官方编译文档 assembly-package的target包中wedatasphere-exchangis-1.0.0.tar.gz是自身的服务包 linkis-engineplugin-sqoop是需要放入linkis中(lib/linkis-engineconn-plugins) exchangis-appconn.zip是需要放入dss中(dss-appconns)

mvn clean install 

image.png

前端编译

如果前端你是自己用nginx部署的话,需要注意是拿到dist下面dist文件夹 image.png

Visualis

原项目代码地址 适配修改代码参考地址

Visualis的pom文件

<scala.version>2.12.10</scala.version>

编译

官方编译文档 assembly下的target中visualis-server-zip是自身服务的包 visualis-appconn的target是visualis.zip是dss需要的包(dss-appconns) build是前端打出来的包

cd Visualis
mvn -N install
mvn clean package -DskipTests=true

image.png

Streamis

原项目代码地址 适配修改代码参考地址

Streamis的pom文件

<scala.version>2.12.10</scala.version>

streamis-project-server的pom文件

       <!-- 如果你这里是1.0.1的话,就调整到${dss.version} -->
<dependency>
<groupId>com.webank.wedatasphere.dss</groupId>
<artifactId>dss-sso-integration-standard</artifactId>
<version>${dss.version}</version>
<scope>compile</scope>
</dependency>

编译

官方编译文档 assembly下target包wedatasphere-streamis-0.2.0-dist.tar.gz是自身后端服务的包 streamis-appconn下target的streamis.zip包是dss需要的(dss-appconns) dist下的dist是前端的包

cd ${STREAMIS_CODE_HOME}
mvn -N install
mvn clean install

image.png

安装部署

官方部署地址 常见错误地址

路径统一

建议将相关的组件,部署同一个路径(比如我这里全部解压在/home/hadoop/application下) image.png

linkis部署注意点

deploy-config文件夹

db.sh中, MYSQL配置的linkis连接的地址,HIVE的元数据连接地址 linkis-env.sh

-- 保存script脚本的路径,下一次会有一个用户名字的文件夹,对应用户的脚本就存放在该文件夹中
WORKSPACE_USER_ROOT_PATH=file:///home/hadoop/logs/linkis
-- 存放物料以及引擎执行的log文件
HDFS_USER_ROOT_PATH=hdfs:///tmp/linkis
-- 引擎每次执行的log以及启动engineConnExec.sh相关的信息
ENGINECONN_ROOT_PATH=/home/hadoop/logs/linkis/apps
-- Yarn主节点访问地址(Active resourcemanager)
YARN_RESTFUL_URL
-- Hadoop/Hive/Spark的conf地址
HADOOP_CONF_DIR
HIVE_CONF_DIR
SPARK_CONF_DIR
-- 指定对应的版本
SPARK_VERSION=3.0.1
HIVE_VERSION=3.1.2
-- 指定linkis安装后的路径,比如我这里就同意指定在对应组件下的路径
LINKIS_HOME=/home/hadoop/application/linkis/linkis-home

如果你使用了flink的话,可以尝试从 flink-engine.sql 导入到linkis的数据库中.

需要修改@FLINK_LABEL版本为自己对应的版本,yarn的队列默认是default.

同时这个版本,如果你遇见了"1G"转换数字类型的错误,尝试去掉1g的单位以及正则校验的规则.参考如下:

flink3.png

lzo使用

如果你的hive使用了lzo的话,将对应的lzo的jar包给copy到hive路径下.比如下面路径:

lib/linkis-engineconn-plugins/hive/dist/v3.1.2/lib

常见问题注意点

  • Mysql的驱动包一定要copy到/lib/linkis-commons/public-module/和/lib/linkis-spring-cloud-services/linkis-mg-gateway/
  • 初始化密码在conf/linkis-mg-gateway.properties中的wds.linkis.admin.password
  • ps-cs 在启动脚本中,有可能存在存在失败的情况,如果有的话,使用 sh linkis-daemon.sh ps-cs , 对其进行单独启动
  • 目前日志是有时间备份的话,有时候之前的错误日志找不到的话,可能是备份到对应日期的文件夹里去了
  • 目前lib/linkis-engineconn-plugins是默认只有spark/shell/python/hive,如果你想要appconn,flink,sqoop就分别去dss中,linkis和exchangis中获取
  • 配置文件版本检查
linkis.properties中,flink看有没有使用
wds.linkis.spark.engine.version=3.0.1
wds.linkis.hive.engine.version=3.1.2
wds.linkis.flink.engine.version=1.13.2

image.png image.png

错误记录

  1. 版本不兼容,如果你遇到了下面这种错误的话,是scala版本是否没有完全保持一致,检查后再编译一下即可.

1905943989d7782456c356b6ce0d72b.png

  1. yarn配置Active节点地址,如果是配置了Standby地址的话,就会出现如下的错误

1ca32f79d940016d72bf1393e4bccc8.jpg

DSS部署注意点

官方安装文档

config文件夹

db.sh: 配置dss的数据库 config.sh

-- dss的安装路径,比如我这里就定义在dss下的文件夹中
DSS_INSTALL_HOME=/home/hadoop/application/dss/dss

conf文件夹

dss.properties

# 主要检查spark/hive等版本有,如果没有,就追加上
wds.linkis.spark.engine.version=3.0.1
wds.linkis.hive.engine.version=3.1.2
wds.linkis.flink.engine.version=1.13.2

dss-flow-execution-server.properties

# 主要检查spark/hive等版本有,如果没有,就追加上
wds.linkis.spark.engine.version=3.0.1
wds.linkis.hive.engine.version=3.1.2
wds.linkis.flink.engine.version=1.13.2

如果调度是想使用dolphinscheduler的话,请参数这个pr添加对应的spark/hive版本 参考pr

dss-appconns

exchangis,qualitis,streamis,visualis 都分别要从 Exchangis , Qualitis , Streamis, Visualis 的项目去获取

常见问题注意点

  • 由于dss我们整合了schedulis,qualitis,exchangis等组件,所有创建一个项目会同步调用这些组件的接口创建,所以确保dss_appconn_instance中的配置路径都是正确的,可以访问的
  • chrome浏览器建议内核使用10版本一下的,否则会出现你可以单独Scdulis,Qaulitis等组件,但是却无法通过dss登录成功问题
  • hostname和ip,如果是使用ip访问的话,执行appconn-install.sh安装的时候,也确保是ip. 否则会出现访问其他组件的时候,会提示没有登录或者没有权限

ec4989a817646f785c59f6802d0fab2.jpg

Schedulis部署注意点

官方部署文档

conf文件夹

azkaban.properties

# azkaban.jobtype.plugin.dir和executor.global.properties这里最好改成绝对路径
# Azkaban JobTypes Plugins
azkaban.jobtype.plugin.dir=/home/hadoop/application/schedulis/apps/schedulis_0.7.0_exec/plugins/jobtypes

# Loader for projects
executor.global.properties=/home/hadoop/application/schedulis/apps/schedulis_0.7.0_exec/conf/global.properties

# 引擎的版本
wds.linkis.spark.engine.version=3.0.1
wds.linkis.hive.engine.version=3.1.2
wds.linkis.flink.engine.version=1.13.2

web模块

plugins/viewer/system/conf: 这里需要配置数据库连接地址,与schedulis保持一致 azkaban.properties: 用户参数和系统管理的配置

viewer.plugins=system
viewer.plugin.dir=/home/hadoop/application/schedulis/apps/schedulis_0.7.0_web/plugins/viewer

常见问题注意点

如果出现资源或者web界面出现没有css等静态文件的话,将相关的路径修改为绝对路径 如果出现配置文件加载不到的问题,也可以将路径修改为绝对路径 比如:

### web模块中
web.resource.dir=/home/hadoop/application/schedulis/apps/schedulis_0.7.0_web/web/
viewer.plugin.dir=/home/hadoop/application/schedulis/apps/schedulis_0.7.0_web/plugins/viewer

### exec模块中
azkaban.jobtype.plugin.dir=/home/hadoop/application/schedulis/apps/schedulis_0.7.0_exec/plugins/jobtypes
executor.global.properties=/home/hadoop/application/schedulis/apps/schedulis_0.7.0_exec/conf/global.properties

Qualitis部署注意点

官方部署文档

conf文件夹

application-dev.yml

  # 这里配置正确的spark版本
spark:
application:
name: IDE
reparation: 50
engine:
name: spark
version: 3.0.1

Exchangis部署注意点

官方部署文档

常见问题注意点

如果点击数据源出现没有发布的错误的话,可以尝试将linkis_ps_dm_datasource的published_version_id值修改为1(如果是null的话)

Visualis

官方部署文档

常见问题注意点

如果出现预览视图一致出不来的话,请检查bin/phantomjs该文件是否完整上传. 如果能看到如下结果的话,说明是上传是完整的

./phantomjs -v
2.1.1

Streamis

官方部署文档

dss-appconn

qualitis,exchangis,streamis,visualis是分别要从各种的模块中编译好,copy到dss下的dss-appconns中,然后执行bin下的appconn-install.sh来为各自的组件进行安装 如果你在整合的时候,如果到一些如下的Sql脚本错误的话,请检测错误的Sql周边是否有注释,如果有的话,删掉注释再重新appconn-install一遍尝试 903ceec2f69fc1c7a2be5f309f69726.png 比如qualitis举例,下面的ip和host端口,根据自己具体使用的来

qualitis
127.0.0.1
8090

Nginx部署举例

linkis.conf: dss/linkis/visualis 前端 exchangis.conf: exchangis前端 streamis.conf: streamis前端 Schedulis和Qualitis是分别在自己项目中. linkis/visualis需要将前端打包出来的dist或者build在这里修改为对应组件的名字 image.png image.png image.png

linkis.conf

server {
listen 8089;# 访问端口
server_name localhost;
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;

location /dss/visualis {
# 修改为自己的前端路径
root /home/hadoop/application/webs; # 静态文件目录
autoindex on;
}

location /dss/linkis {
# 修改为自己的前端路径
root /home/hadoop/application/webs; # linkis管理台的静态文件目录
autoindex on;
}

location / {
# 修改为自己的前端路径
root /home/hadoop/application/webs/dist; # 静态文件目录
#root /home/hadoop/dss/web/dss/linkis;
index index.html index.html;
}

location /ws {
proxy_pass http://127.0.0.1:9001;#后端Linkis的地址
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection upgrade;
}

location /api {
proxy_pass http://127.0.0.1:9001; #后端Linkis的地址
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header x_real_ipP $remote_addr;
proxy_set_header remote_addr $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_http_version 1.1;
proxy_connect_timeout 4s;
proxy_read_timeout 600s;
proxy_send_timeout 12s;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection upgrade;
}

#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}

exchangis.conf

server {
listen 9800; # 访问端口 如果该端口被占用,则需要修改
server_name localhost;
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;
location / {
# 修改为自己路径
root /home/hadoop/application/webs/exchangis/dist/dist; # Exchangis 前端部署目录
autoindex on;
}

location /api {
proxy_pass http://127.0.0.1:9001; # 后端Linkis的地址,需要修改
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header x_real_ipP $remote_addr;
proxy_set_header remote_addr $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_http_version 1.1;
proxy_connect_timeout 4s;
proxy_read_timeout 600s;
proxy_send_timeout 12s;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection upgrade;
}

#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}

streamis.conf

server {
listen 9088;# 访问端口 如果该端口被占用,则需要修改
server_name localhost;
location / {
# 修改为自己的路径
root /home/hadoop/application/webs/streamis/dist/dist; # 请修改成Streamis前端的静态文件目录
index index.html index.html;
}
location /api {
proxy_pass http://127.0.0.1:9001; #后端Linkis的地址,请修改成Linkis网关的ip和端口
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header x_real_ipP $remote_addr;
proxy_set_header remote_addr $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_http_version 1.1;
proxy_connect_timeout 4s;
proxy_read_timeout 600s;
proxy_send_timeout 12s;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection upgrade;
}

#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}

· 3 分钟阅读
jacktao

1. 依赖版本

版本:

  • kind 0.14.0
  • docker 20.10.17
  • node v16.0.0

注意:

  • 1.先确保前后端能够正常编译

  • 2.确保组件依赖版本

  • 3.kind是用docker容器模拟节点的 机器重启回来容器都变了 调度器就不工作了 这个是kind的limitation,官方文档有详细说明。

2.安装docker

2.1 安装教程

sudo yum install -y yum-utils device-mapper-persistent-data lvm2

sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

sudo sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo

sudo yum makecache fast

sudo yum -y install docker-ce

systemctl start docker

systemctl enable docker

2.2 设置国内镜像

vi /etc/docker/daemon.json

{

"registry-mirrors": ["http://hub-mirror.c.163.com"],

"insecure-registries": ["https://registry.mydomain.com","http://hub-mirror.c.163.com"]

}

3. 安装kind

(1)手工下载kind二进制

https://github.com/kubernetes-sigs/kind/releases

(2)安装kind二进制

chmod +x ./kind

mv kind-linux-amd64 /usr/bin/kind

4. 安装JDK 和 Maven

(1)参考通用安装教程,安装如下组件

jdk 1.8

mavne 3.5+

5. 安装NodeJS

(1)安装版本

node v16.0.0

(2)安装nvm

export http_proxy=http://10.0.0.150:7890

export https_proxy=http://10.0.0.150:7890

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash

export NVM_DIR="$HOME/.nvm"

[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm

[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # This loads nvm bash_completion

(3)安装nodejs

nvm ls-remote

nvm install v14.19.3

(4)配置NPM

npm config set registry https://registry.npmmirror.com

npm config set sass_binary_site https://registry.npmmirror.com/binary.html?path=node-sass/

(5)编译前端

npm install -g yarn

yarn

yarn build

yarn

6. 编译linkis

\# 1. When compiling for the first time, execute the following command first

./mvnw -N install

\# 2. make the linkis distribution package

\# - Option 1: make the linkis distribution package only

./mvnw clean install -Dmaven.javadoc.skip=true -Dmaven.test.skip=true

\# - Option 2: make the linkis distribution package and docker image

./mvnw clean install -Pdocker -Dmaven.javadoc.skip=true -Dmaven.test.skip=true

\# - Option 3: linkis distribution package and docker image (included web)

./mvnw clean install -Pdocker -Dmaven.javadoc.skip=true -Dmaven.test.skip=true -Dlinkis.build.web=true

7. 创建集群

dos2unix ./linkis-dist/helm/scripts/*.sh

./linkis-dist/helm/scripts/create-test-kind.sh

8. 安装helm charts

 ./scripts/install-charts.sh linkis linkis-demo

9.访问linkis页面

kubectl port-forward -n linkis  --address=0.0.0.0 service/linkis-demo-web 8087:8087

http://10.0.2.101:8087

10.使用Linkis客户端测试

kubectl -n linkis exec -it linkis-demo-ps-publicservice-77d7685d9-f59ht -- bash
./linkis-cli -engineType shell-1 -codeType shell -code "echo \"hello\" " -submitUser hadoop -proxyUser hadoop

11.安装kubectl

cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

yum install -y --nogpgcheck kubectl

kubectl config view  查看集群信息
kubectl config get-contexts  得到所有集群context对象信息
kubectl cluster-info  查看当前集群情况

· 13 分钟阅读

1 概述

大家知道,持续集成由很多操作组成,比如抓取代码、运行测试、登录远程服务器,发布到第三方服务等等。gitHub 把这些操作就称为 actions。很多操作在不同项目里面是类似的,完全可以共享。github注意到了这一点,想出了一个很妙的点子,允许开发者把每个操作写成独立的脚本文件,存放到代码仓库,使得其他开发者可以引用。如果你需要某个 action,不必自己写复杂的脚本,直接引用他人写好的 action 即可,整个持续集成过程,就变成了一个 actions 的组合。这就是gitHub actions 最特别的地方。

Github为广大开发者提供了一个github action市场,我们可以从这个市场中找到我们想要的github action并配置到仓库的workflow中实现自动化操作,当然这个市场能提供的github action有限,有些情况下找不到能满足我们需求的github action,本篇博客在后面我也会教大家如何自己编写github action。

2 一些名词术语

2.1 什么是持续集成

简单说就是自动化程序,举个例子,对于前端程序员每次提交代码到 Github 的仓库后,Github 都会自动创建一个虚拟机(Mac / Windows / Linux 任我们选),来执行一段或多段指令(由我们定),例如:

npm install
npm run build

2.2 yaml是什么

我们集成github action的做法,就是在我们仓库的根目录下,创建一个 .github/workflow目录,里面放一个 *.yaml文件——这个yaml文件就是我们配置github action所用的文件。它是一个非常容易的脚本语言,对于不熟悉yaml的用户可以参考此处

3 开始编写第一个workflow

3.1 如何自定workflow的名字

Workflow的名称,github在存储库的Action页面上显示Workflow的名称。如果我们省略 name,则github会将其设置为相对于存储库根目录的工作流文件路径。

name: 
Say Hello

3.2 如何自定workflow的触发事件

事件有很多,例如:用户提交pull request到仓库、用户给仓库提交issue或者用户关闭issue等,我们希望某些事件发生时,自动执行workflow,这就需要定义触发事件了。下面是自定触发事件的一个例子:

name: 
Say Hello
on:
pull_request

上面的代码能在用户提交pull request时触发workflow,对于多个事件我们用方括号括起来,例如:

name: 
Say Hello
on:
[pull_request,pull]

当然我们希望触发事件能更具体一些,就比如当一个pull request关闭或重新开启时触发workflow:

name: 
Say Hello
on:
pull_request:
type:
[reopend,closed]

想了解更多的触发事件请参考此处的文档

3.3 如何定义一个job

一个Workflow由一个或多个jobs构成,含义是一次持续集成的运行,可以完成多个任务,下面是一个例子。

name: 
Say Hello
on:
pull_request
jobs:
my_first_job:
name: My first job
my_second_job:
name: My second job

每个job必须具有一个id与之关联。上面的my_first_jobmy_second_job就是job的id。

3.4 如何定义 job 的运行环境

指定运行job的运行环境,github上可用的操作系统为:

  • Windows
  • macos
  • linux

下面是指定运行环境的一个例子:

# 受限于篇幅,前面代码部分省略
jobs:
my_first_job:
name: My first job
runs-on: macos-10.15

3.5 step的使用

每个job由多个step构成,它会从上至下依次执行。step可以运行commands(如linux命令)以及action。 下面是一个输出hello world的例子:

# 受限于篇幅,前面代码部分省略
jobs:
my_first_job:
name: My first job
runs-on: macos-10.15
step:
- name: Print a greeting
# 定义 step 的环境变量
env:
FIRST_WORD: Hello
SECOND_WORD: WORD
# 运行指令:输出环境变量
run: |
echo $FIRST_WORD $SECOND_WORD.

接下来是action的使用,这里的action其实就是命令,比如github官方给了我们一些默认的命令,我么可以直接使用这些命令来减少仓库中workflow的代码量。最常见的action是checkout,它可以把仓库中最新的代码克隆到Workflow的工作区:

# 受限于篇幅,前面代码部分省略
step:
- name: Check out git repository
uses: actions/checkout@v2

有些action会需要传入额外的参数,一般使用with来设置参数值:

# 受限于篇幅,前面代码部分省略
step:
- name: Check out git repository
uses: actions/checkout@v2
uses: actions/setup-node@v2.2.0
with:
node-version: 14

4 如何编写自己的action

4.1 action.yml的配置

当在github action市场上找不到我们想要的action时我们可以自己动手编写满足自己需求的action。自定action需要在.github目录下新建一个actions目录,然后再新建一个自定的action名称的目录。每个action都需要有一个action.yml的配置文件,action.yml的runs段制定了操作的启动方式。启动方式可以分为三种:运行 Node.js脚本,运行Docker镜像,运行组合脚本。下面说明action.yml的常用参数:

  • name: 自定action的名字
  • description: 对action需要传入的参数或者输出进行声明
  • inputs: 自定需要输入的参数
  • outputs: 输出的变量
  • runs: 启动方式

下面是一个action.yml的配置例子:

name: "example action"

description: "This is an example action"

inputs:
param1:
description: "The first param of this action"
required: true #必传参数必须要设置required为true

param2:
description: "The second param of this action"
required: true

outputs:
out1:
description: "The outputs of this action"

runs:
using: node16
main: dist/index.js
post: dist/index.js

将runs.using设置为node16或node12,就可以指定为启动Node.js脚本。用main字段指定脚本的入口点。启动的方式类似于直接运行node main.js,所以并不会从 package.json中安装依赖。因此,在开发时,一般都会使用打包工具将依赖项打包到一起,输出一个单独的js文件,然后将这个文件作为入口点。post字段可以指定清理工作,这里的内容将会在 workflow 结束时运行。

4.2使用Docker镜像

若使用Docker,我们需要把action.yml中的runs修改为:

runs:
using: docker
image: Dockerfile

image 指定镜像启动需要的Dockerfile,这里指定为项目根目录下的Dockerfile文件,在 Dockerfile中,用ENTRYPOINT或者CMD指定启动的脚本。比如这样定义一个用python运行脚本的程序:

FROM python:3

RUN pip install --no-cache-dir requests

COPY . .

CMD [ "python", "/main.py"]

这里可以看出使用Docker的优点:可以自定义运行环境,就能够使用除了Node.js以外的环境,也能使用其他的语言。

5 Github action项目实战

在本节我会以一个具体的例子来讲述如何编写自己的github action。

问题

假设我们的github仓库中有许多待处理的issue,用户提交的每一个pull request可能会关联一个issue,如果每合并一个pull request后就要手动关闭一个issue会相当繁琐。

解决

这时workflow就派上用场了。我们可以监听pull request的closed事件,同时判断closed时是被merged关闭还是非merged关闭。如果是merged关闭则关闭关联的issue。 但这里仍然有一个问题,如何获取关联的issue?我们可以要求用户在提交pull request时在描述部分添加需要关联的issue如#345,再把345的issue编号抽取出来。如何实现这个功能呢?我们可以自己来编写github action。为了让github action程序更加简洁,这里我使用docker来启动github action。首先是准备action.yml:

# github action 的名称
name: "Auto_close_associate_issue"
# 该action的描述
description: "Auto close an issue which associate with a PR."

#定义需要输入的参数
inputs:
# 第一个参数名叫prbody
prbody:
#对该参数名的描述
description: "The body of the PR to search for related issues"
# 必须参数
required: true

outputs:
#输出的参数名
issurNumber:
description: "The issue number"

runs:
# 使用docker镜像
using: "docker"
image: "Dockerfile"

接下来是编写脚本文件,在这我使用node.js来编写脚本,此脚本的思路是:先从环境中获取变量值,抽取出issue编号再输出到环境中,对应的脚本(取名为main.js)如下:

// 获取环境变量,所有传给github action的参数一律大写,且需要加上INPUT_前缀,此处是github规定的
let body = process.env['INPUT_PRBODY'];
// 利用正则表达式抽取出issue编号数字
let pattern = /#\d+/;
let issueNumber = body.match(pattern)[0].replace('#', '');
// 输出到环境中
console.log(`::set-output name=issueNumber::${issueNumber}`);

接下来是docker的镜像文件(文件名为Dockerfile):

FROM node:10.15

COPY . .

CMD [ "node", "/main.js"]

最后在.github/actions/Auto_close_associate_issue路径下放入action.ymlDockerfile以及main.js三个文件,一个action的编写到此结束。

最后的最后就是编写workflow,workflow的配置在开始编写第一个workflow中进行了细致讲述,这里就不作具体赘述了,具体配置如下:

name: Auto close issue when PR is merged

on:
pull_request_target:
types: [ closed ]

jobs:
close-issue:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2

- name: "Auto issue closer"
uses: ./.github/actions/Auto_close_associate_issue/
id: Closer
with:
prbody: ${{ github.event.pull_request.body }}

- name: Close Issue
uses: peter-evans/close-issue@v2
if: ${{ github.event.pull_request.merged }}
with:
issue-number: ${{ steps.Closer.outputs.issueNumber }}
comment: The associated PR has been merged, this issue is automatically closed, you can reopend if necessary.
env:
Github_Token: ${{ secrets.GITHUB_TOKEN }}
PRNUM: ${{ github.event.pull_request.number }}

· 2 分钟阅读

· 3 分钟阅读
Casion

本文主要指引大家如何下载每个版本对应的非默认引擎安装插件包。

考虑到发布包的大小和大家使用插件的情况,linkis发布的二进制安装包中只包含了部分常用引擎/hive/spark/python/shell, 非常用引擎,项目代码中有对应的模块flink/io_file/pipeline/sqoop(不同版本之间可能有区别), 为了方便大家使用,基于linkis每个版本的release分支代码: https://github.com/apache/linkis, 编译出这部分引擎,供大家选择使用。

下载链接

linkis版本包含的引擎引擎物料包下载链接
1.5.0jdbc
pipeline
io_file
flink
openlookeng
sqoop
presto
elasticsearch
trino
impala
1.5.0-engineconn-plugin.tar
1.4.0jdbc
pipeline
io_file
flink
openlookeng
sqoop
presto
elasticsearch
trino
impala
1.4.0-engineconn-plugin.tar
1.3.2jdbc
pipeline
io_file
flink
openlookeng
sqoop
presto
elasticsearch
trino
seatunnel
1.3.2-engineconn-plugin.tar
1.3.1jdbc
pipeline
io_file
flink
openlookeng
sqoop
presto
elasticsearch
trino
seatunnel
1.3.1-engineconn-plugin.tar
1.3.0jdbc
pipeline
io_file
flink
openlookeng
sqoop
presto
elasticsearch
1.3.0-engineconn-plugin.tar
1.2.0jdbc
pipeline
flink
openlookeng
sqoop
presto
elasticsearch
1.2.0-engineconn-plugin.tar
1.1.3jdbc
pipeline
flink
openlookeng
sqoop
1.1.3-engineconn-plugin.tar
1.1.2jdbc
pipeline
flink
openlookeng
sqoop
1.1.2-engineconn-plugin.tar
1.1.1jdbc
pipeline
flink
openlookeng
1.1.1-engineconn-plugin.tar
1.1.0jdbc
pipeline
flink
1.1.0-engineconn-plugin.tar
1.0.3jdbc
pipeline
flink
1.0.3-engineconn-plugin.tar

引擎类型

引擎名支持底层组件版本
(默认依赖版本)
Linkis 版本要求是否默认包含在发布包中说明
SparkApache 2.0.0~2.4.7,
CDH >= 5.4.0,
(默认Apache Spark 2.4.3)
>=1.0.3Spark EngineConn, 支持SQL, Scala, Pyspark 和R 代码
HiveApache >= 1.0.0,
CDH >= 5.4.0,
(默认Apache Hive 2.3.3)
>=1.0.3Hive EngineConn, 支持HiveQL 代码
PythonPython >= 2.6,
(默认Python2*)
>=1.0.3Python EngineConn, 支持python 代码
ShellBash >= 2.0>=1.0.3Shell EngineConn, 支持Bash shell 代码
JDBCMySQL >= 5.0, Hive >=1.2.1,
(默认Hive-jdbc 2.3.4)
>=1.0.3JDBC EngineConn, 已支持Mysql,Oracle,KingBase,PostgreSQL,SqlServer,DB2,Greenplum,DM,Doris,ClickHouse,TiDB,Starrocks,GaussDB和OceanBase, 可快速扩展支持其他有JDBC Driver 包的引擎, 如SQLite
FlinkFlink >= 1.12.2,
(默认Apache Flink 1.12.2)
>=1.0.2Flink EngineConn, 支持FlinkSQL 代码,也支持以Flink Jar 形式启动一个新的Yarn 应用程序
Pipeline->=1.0.2Pipeline EngineConn, 支持文件的导入和导出
openLooKengopenLooKeng >= 1.5.0,
(默认openLookEng 1.5.0)
>=1.1.1openLooKeng EngineConn, 支持用Sql查询数据虚拟化引擎openLooKeng
SqoopSqoop >= 1.4.6,
(默认Apache Sqoop 1.4.6)
>=1.1.2Sqoop EngineConn, 支持 数据迁移工具 Sqoop 引擎
PrestoPresto >= 0.180>=1.2.0Presto EngineConn, 支持Presto SQL 代码
ElasticSearchElasticSearch >=6.0>=1.2.0ElasticSearch EngineConn, 支持SQL 和DSL 代码
TrinoTrino >=371>=1.3.1Trino EngineConn, 支持Trino SQL 代码
SeatunnelSeatunnel >=2.1.2>=1.3.1Seatunnel EngineConn, 支持Seatunnel SQL 代码

安装引擎指引

下载引擎的物料包后,解压包

tar -xvf  1.0.3-engineconn-plugin.tar
cd 1.0.3-engineconn-plugin

将需要要使用的引擎物料包拷贝至linkis的引擎插件目录,然后刷新引擎物料即可

详细流程参考安装 EngineConnPlugin 引擎