Skip to main content

· 2 分钟阅读

本文主要介绍在 Linkis 1.3.2 版本中,整合 OceanBase 数据库。 OceanBase 数据库兼容 MySQL 5.7/8.0 的绝大部分功能和语法。因此可以将 OceanBase 数据库当成 MySQL 来使用。

1. 准备工作

1.1 环境安装

安装部署 OceanBase 数据库,参看快速体验OceanBase

1.2 环境验证

可以使用 MySQL 命令验证 OceanBase 数据库安装情况。

mysql -h${ip} -P${port} -u${username} -p${password} -D${db_name}

连接成功如下图所示:

2. Linkis提交 OceanBase 数据库任务

2.1 通过 shell 提交任务

 sh ./bin/linkis-cli -engineType jdbc-4 -codeType jdbc -code "show tables" -submitUser hadoop -proxyUser hadoop -runtimeMap wds.linkis.jdbc.connect.url=jdbc:mysql://${ip}:${port}/${db_name} -runtimeMap wds.linkis.jdbc.driver=com.mysql.jdbc.Driver -runtimeMap wds.linkis.jdbc.username=${username} -runtimeMap wds.linkis.jdbc.password=${password}

2.2 通过 Linkis SDK 提交任务

Linkis 提供了 JavaScalaSDKLinkis 服务端提交任务。具体可以参考 JAVA SDK Manual。对于 OceanBase 任务您只需要修改 Demo 中的 EngineConnTypeCodeType 参数即可:

Map<String, Object> labels = new HashMap<String, Object>();
labels.put(LabelKeyConstant.ENGINE_TYPE_KEY, "jdbc-4"); // required engineType Label
labels.put(LabelKeyConstant.USER_CREATOR_TYPE_KEY, "hadoop-IDE");// required execute user and creator
labels.put(LabelKeyConstant.CODE_TYPE_KEY, "jdbc"); // required codeType

2.3 多数据源支持

地址:登陆管理台-->数据源管理

步骤1:新建数据源

步骤2:连接测试

点击测试连接按钮进行测试

步骤3:发布数据源

步骤4:通过指定数据源名称提交 OceanBase 任务

请求URL:http://${gateway_url}:${port}/api/rest_j/v1/entrance/submit

请求方式:POST

请求参数:

{
"executionContent": {
"code": "show databases",
"runType": "jdbc"
},
"params": {
"variable": {},
"configuration": {
"startup": {},
"runtime": {
"wds.linkis.engine.runtime.datasource": "ob-test"
}
}
},
"labels": {
"engineType": "jdbc-4"
}
}

响应结果:

{
"method": "/api/entrance/submit",
"status": 0,
"message": "OK",
"data": {
"taskID": 93,
"execID": "exec_id018017linkis-cg-entrance000830fb1364:9104IDE_hadoop_jdbc_0"
}
}

管理台查看任务执行情况:

· 5 分钟阅读
aiceflower

背景

引擎物料管理是linkis引擎物料管理系统,主要用来管理Linkis的引擎物料文件,存储用户的各种引擎文件,包括引擎类型、引擎版本等信息。总体流程为压缩文件经前端浏览器上传至物料库(BML),物料压缩文件解压、校验,需要执行时如果发现本地不存在该引擎,则需要去物料库中寻找并下载安装注册从而执行。

具备以下功能点:

1)、支持上传打包好的引擎文件,上传文件大小受nginx的配置影响,文件类型为zip文件类型,在windows环境下自行打包zip压缩文件不支持。

2)、支持对已有的引擎物料进行更新,更新后在BML中新增一个bml引擎物料的存储版本,可以对当前的版本进行回滚和删除。

3)、一个引擎涉及两个引擎物料,分别是lib和conf,可以进行分别管理。

架构图

架构说明

1、引擎物料管理在Linkis web管理台中,需要管理员权限,在开发调试时需要设置测试环境下的管理员字段。

2、引擎物料管理涉及引擎物料文件的增加、更新、删除,物料文件分为lib和conf分别存储。文件中涉及两个版本的概念,一个是引擎本身的版本,另一个则是物料版本,在更新操作中物料如果存在修改则会新增一个物料版本并将其存储在BML中,支持物料版本的删除和回滚。

3、利用BML Service对引擎物料文件进行存储,通过RPC调用BML的服务对文件进行存储,得到存储的资源id和版本并保存。

核心流程

  1. 上传zip类型的引擎插件文件,先存储在引擎插件Home目录中并解压文件,之后进行启动刷新程序。
  2. 对解压后的引擎文件中的conf、lib目录进行压缩,上传至BML(物料管理系统)中,分别获取对应的BML的资源id和资源版本,读取对应引擎名称和版本信息。
  3. 在引擎物料资源表中,新增引擎物料的记录,每次上传都会分别产生lib和conf两条数据。除了记录这个引擎的名称和类型信息外,最重要的是记录了该引擎在物料管理系统中的信息,包括引擎的资源id和版本信息,关联至BML中的资源表。

数据库设计

引擎物料资源信息表(linkis_cg_engine_conn_plugin_bml_resources)

字段名作用备注
id引擎物料包标识idPrimary key
engine_conn_type存放资源的位置如Spark
version引擎的版本如Spark的v2.4.3
file_name引擎文件名如lib.zip
file_size引擎文件大小
last_modified文件最后的修改时间
bml_resource_id记录资源在BML(物料管理系统)中的id用于在BML中标识引擎文件的id
bml_resource_version记录资源在BML中的版本如v000001
create_time资源的创建时间
last_update_time资源最后的更新时间

· 6 分钟阅读
aiceflower

前言

随着业务的发展和社区产品的更新迭代,我们发现Linkis1.X服务过多,可以适当进行服务合并,减少服务数量,方便部署和调试。目前Linkis服务主要分为三大类,包括计算治理服务(CG: entrance/ecp/ecm/linkismanager)、公共增强服务(PS:publicservice/datasource/cs)和微服务治理服务(MG:Gateway/Eureka)。这三类服务延伸的子服务过多,可以进行服务合并,做到将PS的服务全部合并,CG服务支持全部合并,同时支持将ecm服务单独出去。

服务合并变动

本次服务合并主要变动如下:

  • 支持Restful服务转发:修改点主要为Gateway的转发逻辑,类似于现在publicservice服务合并参数:wds.linkis.gateway.conf.publicservice.list
  • 支持将RPC服务远程调用改为本地调用,类似LocalMessageSender,现在已经可以通过改Sender完成本地调用的返回
  • 配置文件变动
  • 服务启停脚本变动

待实现目标

  • 基本目标:合并PS服务为一个服务
  • 基本目标:合并CG服务为CG-Service和ECM
  • 进阶目标:合并CG服务为一个服
  • 终结目标:去掉eureka、gateway变为单体服务

具体变动

Gateway变动(org.apache.linkis.gateway.ujes.route.HaContextGatewayRouter)

//变动前
override def route(gatewayContext: GatewayContext): ServiceInstance = {

if (gatewayContext.getGatewayRoute.getRequestURI.contains(HaContextGatewayRouter.CONTEXT_SERVICE_STR) ||
gatewayContext.getGatewayRoute.getRequestURI.contains(HaContextGatewayRouter.OLD_CONTEXT_SERVICE_PREFIX)){
val params: util.HashMap[String, String] = gatewayContext.getGatewayRoute.getParams
if (!gatewayContext.getRequest.getQueryParams.isEmpty) {
for ((k, vArr) <- gatewayContext.getRequest.getQueryParams) {
if (vArr.nonEmpty) {
params.putIfAbsent(k, vArr.head)
}
}
}
if (gatewayContext.getRequest.getHeaders.containsKey(ContextHTTPConstant.CONTEXT_ID_STR)) {
params.putIfAbsent(ContextHTTPConstant.CONTEXT_ID_STR, gatewayContext.getRequest.getHeaders.get(ContextHTTPConstant.CONTEXT_ID_STR)(0))
}
if (null == params || params.isEmpty) {
dealContextCreate(gatewayContext)
} else {
var contextId : String = null
for ((key, value) <- params) {
if (key.equalsIgnoreCase(ContextHTTPConstant.CONTEXT_ID_STR)) {
contextId = value
}
}
if (StringUtils.isNotBlank(contextId)) {
dealContextAccess(contextId.toString, gatewayContext)
} else {
dealContextCreate(gatewayContext)
}
}
}else{
null
}
}
//变动后
override def route(gatewayContext: GatewayContext): ServiceInstance = {

if (
gatewayContext.getGatewayRoute.getRequestURI.contains(
RPCConfiguration.CONTEXT_SERVICE_REQUEST_PREFIX
)
) {
val params: util.HashMap[String, String] = gatewayContext.getGatewayRoute.getParams
if (!gatewayContext.getRequest.getQueryParams.isEmpty) {
for ((k, vArr) <- gatewayContext.getRequest.getQueryParams.asScala) {
if (vArr.nonEmpty) {
params.putIfAbsent(k, vArr.head)
}
}
}
if (gatewayContext.getRequest.getHeaders.containsKey(ContextHTTPConstant.CONTEXT_ID_STR)) {
params.putIfAbsent(
ContextHTTPConstant.CONTEXT_ID_STR,
gatewayContext.getRequest.getHeaders.get(ContextHTTPConstant.CONTEXT_ID_STR)(0)
)
}
if (null == params || params.isEmpty) {
dealContextCreate(gatewayContext)
} else {
var contextId: String = null
for ((key, value) <- params.asScala) {
if (key.equalsIgnoreCase(ContextHTTPConstant.CONTEXT_ID_STR)) {
contextId = value
}
}
if (StringUtils.isNotBlank(contextId)) {
dealContextAccess(contextId, gatewayContext)
} else {
dealContextCreate(gatewayContext)
}
}
} else {
null
}
}


//变动前
def dealContextCreate(gatewayContext:GatewayContext):ServiceInstance = {
val serviceId = findService(HaContextGatewayRouter.CONTEXT_SERVICE_STR, list => {
val services = list.filter(_.contains(HaContextGatewayRouter.CONTEXT_SERVICE_STR))
services.headOption
})
val serviceInstances = ServiceInstanceUtils.getRPCServerLoader.getServiceInstances(serviceId.orNull)
if (serviceInstances.size > 0) {
val index = new Random().nextInt(serviceInstances.size)
serviceInstances(index)
} else {
logger.error(s"No valid instance for service : " + serviceId.orNull)
null
}
}
//变动后
def dealContextCreate(gatewayContext: GatewayContext): ServiceInstance = {
val serviceId = findService(
RPCConfiguration.CONTEXT_SERVICE_NAME,
list => {
val services = list.filter(_.contains(RPCConfiguration.CONTEXT_SERVICE_NAME))
services.headOption
}
)
val serviceInstances =
ServiceInstanceUtils.getRPCServerLoader.getServiceInstances(serviceId.orNull)
if (serviceInstances.size > 0) {
val index = new Random().nextInt(serviceInstances.size)
serviceInstances(index)
} else {
logger.error(s"No valid instance for service : " + serviceId.orNull)
null
}
}

//变动前
def dealContextAccess(contextIdStr:String, gatewayContext: GatewayContext):ServiceInstance = {
val contextId : String = {
var tmpId : String = null
if (serializationHelper.accepts(contextIdStr)) {
val contextID : ContextID = serializationHelper.deserialize(contextIdStr).asInstanceOf[ContextID]
if (null != contextID) {
tmpId = contextID.getContextId
} else {
logger.error(s"Deserializate contextID null. contextIDStr : " + contextIdStr)
}
} else {
logger.error(s"ContxtIDStr cannot be deserialized. contextIDStr : " + contextIdStr)
}
if (null == tmpId) {
contextIdStr
} else {
tmpId
}
}
val instances = contextIDParser.parse(contextId)
var serviceId:Option[String] = None
serviceId = findService(HaContextGatewayRouter.CONTEXT_SERVICE_STR, list => {
val services = list.filter(_.contains(HaContextGatewayRouter.CONTEXT_SERVICE_STR))
services.headOption
})
val serviceInstances = ServiceInstanceUtils.getRPCServerLoader.getServiceInstances(serviceId.orNull)
if (instances.size() > 0) {
serviceId.map(ServiceInstance(_, instances.get(0))).orNull
} else if (serviceInstances.size > 0) {
serviceInstances(0)
} else {
logger.error(s"No valid instance for service : " + serviceId.orNull)
null
}
}

}
//变动后
def dealContextAccess(contextIdStr: String, gatewayContext: GatewayContext): ServiceInstance = {
val contextId: String = {
var tmpId: String = null
if (serializationHelper.accepts(contextIdStr)) {
val contextID: ContextID =
serializationHelper.deserialize(contextIdStr).asInstanceOf[ContextID]
if (null != contextID) {
tmpId = contextID.getContextId
} else {
logger.error(s"Deserializate contextID null. contextIDStr : " + contextIdStr)
}
} else {
logger.error(s"ContxtIDStr cannot be deserialized. contextIDStr : " + contextIdStr)
}
if (null == tmpId) {
contextIdStr
} else {
tmpId
}
}
val instances = contextIDParser.parse(contextId)
var serviceId: Option[String] = None
serviceId = findService(
RPCConfiguration.CONTEXT_SERVICE_NAME,
list => {
val services = list.filter(_.contains(RPCConfiguration.CONTEXT_SERVICE_NAME))
services.headOption
}
)
val serviceInstances =
ServiceInstanceUtils.getRPCServerLoader.getServiceInstances(serviceId.orNull)
if (instances.size() > 0) {
serviceId.map(ServiceInstance(_, instances.get(0))).orNull
} else if (serviceInstances.size > 0) {
serviceInstances(0)
} else {
logger.error(s"No valid instance for service : " + serviceId.orNull)
null
}
}

//变动前
object HaContextGatewayRouter{
val CONTEXT_ID_STR:String = "contextId"
val CONTEXT_SERVICE_STR:String = "ps-cs"
@Deprecated
val OLD_CONTEXT_SERVICE_PREFIX = "contextservice"
val CONTEXT_REGEX: Regex = (normalPath(API_URL_PREFIX) + "rest_[a-zA-Z][a-zA-Z_0-9]*/(v\\d+)/contextservice/" + ".+").r
}
//变动后
object HaContextGatewayRouter {

val CONTEXT_ID_STR: String = "contextId"

@deprecated("please use RPCConfiguration.CONTEXT_SERVICE_REQUEST_PREFIX")
val CONTEXT_SERVICE_REQUEST_PREFIX = RPCConfiguration.CONTEXT_SERVICE_REQUEST_PREFIX

@deprecated("please use RPCConfiguration.CONTEXT_SERVICE_NAME")
val CONTEXT_SERVICE_NAME: String =
if (
RPCConfiguration.ENABLE_PUBLIC_SERVICE.getValue && RPCConfiguration.PUBLIC_SERVICE_LIST
.exists(_.equalsIgnoreCase(RPCConfiguration.CONTEXT_SERVICE_REQUEST_PREFIX))
) {
RPCConfiguration.PUBLIC_SERVICE_APPLICATION_NAME.getValue
} else {
RPCConfiguration.CONTEXT_SERVICE_APPLICATION_NAME.getValue
}

val CONTEXT_REGEX: Regex =
(normalPath(API_URL_PREFIX) + "rest_[a-zA-Z][a-zA-Z_0-9]*/(v\\d+)/contextservice/" + ".+").r

}

RPC服务变动(org.apache.linkis.rpc.conf.RPCConfiguration)

//变动前
val BDP_RPC_BROADCAST_THREAD_SIZE: CommonVars[Integer] = CommonVars("wds.linkis.rpc.broadcast.thread.num", new Integer(25))
//变动后
val BDP_RPC_BROADCAST_THREAD_SIZE: CommonVars[Integer] = CommonVars("wds.linkis.rpc.broadcast.thread.num", 25)

//变动前
val PUBLIC_SERVICE_LIST: Array[String] = CommonVars("wds.linkis.gateway.conf.publicservice.list", "query,jobhistory,application,configuration,filesystem,udf,variable,microservice,errorcode,bml,datasource").getValue.split(",")
//变动后
val PUBLIC_SERVICE_LIST: Array[String] = CommonVars("wds.linkis.gateway.conf.publicservice.list", "cs,contextservice,data-source-manager,metadataquery,metadatamanager,query,jobhistory,application,configuration,filesystem,udf,variable,microservice,errorcode,bml,datasource").getValue.split(",")

配置文件变动

##去除部分

#删除如下配置文件
linkis-dist/package/conf/linkis-ps-cs.properties
linkis-dist/package/conf/linkis-ps-data-source-manager.properties
linkis-dist/package/conf/linkis-ps-metadataquery.properties

##修改部分

#修改linkis-dist/package/conf/linkis-ps-publicservice.properties
#restful修改前
wds.linkis.server.restful.scan.packages=org.apache.linkis.jobhistory.restful,org.apache.linkis.variable.restful,org.apache.linkis.configuration.restful,org.apache.linkis.udf.api,org.apache.linkis.filesystem.restful,org.apache.linkis.filesystem.restful,org.apache.linkis.instance.label.restful,org.apache.linkis.metadata.restful.api,org.apache.linkis.cs.server.restful,org.apache.linkis.bml.restful,org.apache.linkis.errorcode.server.restful

#restful修改后
wds.linkis.server.restful.scan.packages=org.apache.linkis.cs.server.restful,org.apache.linkis.datasourcemanager.core.restful,org.apache.linkis.metadata.query.server.restful,org.apache.linkis.jobhistory.restful,org.apache.linkis.variable.restful,org.apache.linkis.configuration.restful,org.apache.linkis.udf.api,org.apache.linkis.filesystem.restful,org.apache.linkis.filesystem.restful,org.apache.linkis.instance.label.restful,org.apache.linkis.metadata.restful.api,org.apache.linkis.cs.server.restful,org.apache.linkis.bml.restful,org.apache.linkis.errorcode.server.restful

#mybatis修改前
wds.linkis.server.mybatis.mapperLocations=classpath:org/apache/linkis/jobhistory/dao/impl/*.xml,classpath:org/apache/linkis/variable/dao/impl/*.xml,classpath:org/apache/linkis/configuration/dao/impl/*.xml,classpath:org/apache/linkis/udf/dao/impl/*.xml,classpath:org/apache/linkis/instance/label/dao/impl/*.xml,classpath:org/apache/linkis/metadata/hive/dao/impl/*.xml,org/apache/linkis/metadata/dao/impl/*.xml,classpath:org/apache/linkis/bml/dao/impl/*.xml

wds.linkis.server.mybatis.typeAliasesPackage=org.apache.linkis.configuration.entity,org.apache.linkis.jobhistory.entity,org.apache.linkis.udf.entity,org.apache.linkis.variable.entity,org.apache.linkis.instance.label.entity,org.apache.linkis.manager.entity,org.apache.linkis.metadata.domain,org.apache.linkis.bml.entity

wds.linkis.server.mybatis.BasePackage=org.apache.linkis.jobhistory.dao,org.apache.linkis.variable.dao,org.apache.linkis.configuration.dao,org.apache.linkis.udf.dao,org.apache.linkis.instance.label.dao,org.apache.linkis.metadata.hive.dao,org.apache.linkis.metadata.dao,org.apache.linkis.bml.dao,org.apache.linkis.errorcode.server.dao,org.apache.linkis.publicservice.common.lock.dao

#mybatis修改后
wds.linkis.server.mybatis.mapperLocations=classpath*:org/apache/linkis/cs/persistence/dao/impl/*.xml,classpath:org/apache/linkis/datasourcemanager/core/dao/mapper/*.xml,classpath:org/apache/linkis/jobhistory/dao/impl/*.xml,classpath:org/apache/linkis/variable/dao/impl/*.xml,classpath:org/apache/linkis/configuration/dao/impl/*.xml,classpath:org/apache/linkis/udf/dao/impl/*.xml,classpath:org/apache/linkis/instance/label/dao/impl/*.xml,classpath:org/apache/linkis/metadata/hive/dao/impl/*.xml,org/apache/linkis/metadata/dao/impl/*.xml,classpath:org/apache/linkis/bml/dao/impl/*.xml

wds.linkis.server.mybatis.typeAliasesPackage=org.apache.linkis.cs.persistence.entity,org.apache.linkis.datasourcemanager.common.domain,org.apache.linkis.datasourcemanager.core.vo,org.apache.linkis.configuration.entity,org.apache.linkis.jobhistory.entity,org.apache.linkis.udf.entity,org.apache.linkis.variable.entity,org.apache.linkis.instance.label.entity,org.apache.linkis.manager.entity,org.apache.linkis.metadata.domain,org.apache.linkis.bml.entity

wds.linkis.server.mybatis.BasePackage=org.apache.linkis.cs.persistence.dao,org.apache.linkis.datasourcemanager.core.dao,org.apache.linkis.jobhistory.dao,org.apache.linkis.variable.dao,org.apache.linkis.configuration.dao,org.apache.linkis.udf.dao,org.apache.linkis.instance.label.dao,org.apache.linkis.metadata.hive.dao,org.apache.linkis.metadata.dao,org.apache.linkis.bml.dao,org.apache.linkis.errorcode.server.dao,org.apache.linkis.publicservice.common.lock.dao

部署脚本变动(linkis-dist/package/sbin/linkis-start-all.sh)

#服务启动脚本去掉如下部分

#linkis-ps-cs
SERVER_NAME="ps-cs"
SERVER_IP=$CS_INSTALL_IP
startApp

if [ "$ENABLE_METADATA_QUERY" == "true" ]; then
#linkis-ps-data-source-manager
SERVER_NAME="ps-data-source-manager"
SERVER_IP=$DATASOURCE_MANAGER_INSTALL_IP
startApp

#linkis-ps-metadataquery
SERVER_NAME="ps-metadataquery"
SERVER_IP=$METADATA_QUERY_INSTALL_IP
startApp
fi

#linkis-ps-cs
SERVER_NAME="ps-cs"
SERVER_IP=$CS_INSTALL_IP
checkServer

if [ "$ENABLE_METADATA_QUERY" == "true" ]; then
#linkis-ps-data-source-manager
SERVER_NAME="ps-data-source-manager"
SERVER_IP=$DATASOURCE_MANAGER_INSTALL_IP
checkServer

#linkis-ps-metadataquery
SERVER_NAME="ps-metadataquery"
SERVER_IP=$METADATA_QUERY_INSTALL_IP
checkServer
fi


#服务停止脚本去掉如下部分
#linkis-ps-cs
SERVER_NAME="ps-cs"
SERVER_IP=$CS_INSTALL_IP
stopApp

if [ "$ENABLE_METADATA_QUERY" == "true" ]; then
#linkis-ps-data-source-manager
SERVER_NAME="ps-data-source-manager"
SERVER_IP=$DATASOURCE_MANAGER_INSTALL_IP
stopApp

#linkis-ps-metadataquery
SERVER_NAME="ps-metadataquery"
SERVER_IP=$METADATA_QUERY_INSTALL_IP
stopApp
fi

更多服务合并变动细节参见:https://github.com/apache/linkis/pull/2927/files

· 7 分钟阅读
kevinWdong

前言

随着业务的发展和社区产品的更新迭代,我们发现Linkis1.X在资源管理,引擎管理方面有极大的性能提升,可以更好的满足数据中台的建设。相较于0.9.3版本和我们之前使用的平台, 在用户体验方面也得到很大的提升,任务失败页面无法方便查看详情等问题也都得到改善,因此决定升级Linkis以及WDS套件,那么如下是具体的实践操作,希望给大家带来参考。

一、环境

CDH6.3.2 各组件版本

  • hadoop:3.0.0-cdh6.3.2
  • hive:2.1.1-cdh6.3.2
  • spark:2.4.8

硬件环境

2台 128G 云物理机

二、Linkis安装部署

2.1编译代码or release安装包?

本次安装部署采用的是release安装包方式部署。为了适配司内CDH6.3.2版本,hadoop和hive的相关依赖包需要替换成CDH6.3.2版本,这里采用的是直接替换安装包的方式。需要替换的依赖包与模块如下l列表所示。

--涉及到的模块
linkis-engineconn-plugins/spark
linkis-engineconn-plugins/hive
/linkis-commons/public-module
/linkis-computation-governance/
-----需要更换cdh包的列表
./lib/linkis-engineconn-plugins/spark/dist/v2.4.8/lib/hive-shims-0.23-2.1.1-cdh6.3.2.jar
./lib/linkis-engineconn-plugins/spark/dist/v2.4.8/lib/hive-shims-scheduler-2.1.1-cdh6.3.2.jar
./lib/linkis-engineconn-plugins/spark/dist/v2.4.8/lib/hadoop-annotations-3.0.0-cdh6.3.2.jar
./lib/linkis-engineconn-plugins/spark/dist/v2.4.8/lib/hadoop-auth-3.0.0-cdh6.3.2.jar
./lib/linkis-engineconn-plugins/spark/dist/v2.4.8/lib/hadoop-common-3.0.0-cdh6.3.2.jar
./lib/linkis-engineconn-plugins/spark/dist/v2.4.8/lib/hadoop-hdfs-3.0.0-cdh6.3.2.jar
./lib/linkis-engineconn-plugins/spark/dist/v2.4.8/lib/hadoop-hdfs-client-3.0.0-cdh6.3.2.jar
./lib/linkis-engineconn-plugins/hive/dist/v2.1.1/lib/hadoop-client-3.0.0-cdh6.3.2.jar
./lib/linkis-engineconn-plugins/hive/dist/v2.1.1/lib/hadoop-mapreduce-client-common-3.0.0-cdh6.3.2.jar
./lib/linkis-engineconn-plugins/hive/dist/v2.1.1/lib/hadoop-mapreduce-client-jobclient-3.0.0-cdh6.3.2.jar
./lib/linkis-engineconn-plugins/hive/dist/v2.1.1/lib/hadoop-yarn-api-3.0.0-cdh6.3.2.jar
./lib/linkis-engineconn-plugins/hive/dist/v2.1.1/lib/hadoop-yarn-client-3.0.0-cdh6.3.2.jar
./lib/linkis-engineconn-plugins/hive/dist/v2.1.1/lib/hadoop-yarn-server-common-3.0.0-cdh6.3.2.jar
./lib/linkis-engineconn-plugins/hive/dist/v2.1.1/lib/hadoop-hdfs-client-3.0.0-cdh6.3.2.jar
./lib/linkis-engineconn-plugins/hive/dist/v2.1.1/lib/hadoop-mapreduce-client-core-3.0.0-cdh6.3.2.jar
./lib/linkis-engineconn-plugins/hive/dist/v2.1.1/lib/hadoop-mapreduce-client-shuffle-3.0.0-cdh6.3.2.jar
./lib/linkis-engineconn-plugins/hive/dist/v2.1.1/lib/hadoop-yarn-common-3.0.0-cdh6.3.2.jar
./lib/linkis-engineconn-plugins/flink/dist/v1.12.2/lib/hadoop-annotations-3.0.0-cdh6.3.2.jar
./lib/linkis-engineconn-plugins/flink/dist/v1.12.2/lib/hadoop-auth-3.0.0-cdh6.3.2.jar
./lib/linkis-engineconn-plugins/flink/dist/v1.12.2/lib/hadoop-mapreduce-client-core-3.0.0-cdh6.3.2.jar
./lib/linkis-engineconn-plugins/flink/dist/v1.12.2/lib/hadoop-yarn-api-3.0.0-cdh6.3.2.jar
./lib/linkis-engineconn-plugins/flink/dist/v1.12.2/lib/hadoop-yarn-client-3.0.0-cdh6.3.2.jar
./lib/linkis-engineconn-plugins/flink/dist/v1.12.2/lib/hadoop-yarn-common-3.0.0-cdh6.3.2.jar
./lib/linkis-commons/public-module/hadoop-annotations-3.0.0-cdh6.3.2.jar
./lib/linkis-commons/public-module/hadoop-auth-3.0.0-cdh6.3.2.jar
./lib/linkis-commons/public-module/hadoop-common-3.0.0-cdh6.3.2.jar
./lib/linkis-commons/public-module/hadoop-hdfs-client-3.0.0-cdh6.3.2.jar
./lib/linkis-computation-governance/linkis-cg-linkismanager/hadoop-annotations-3.0.0-cdh6.3.2.jar
./lib/linkis-computation-governance/linkis-cg-linkismanager/hadoop-auth-3.0.0-cdh6.3.2.jar
./lib/linkis-computation-governance/linkis-cg-linkismanager/hadoop-yarn-api-3.0.0-cdh6.3.2.jar
./lib/linkis-computation-governance/linkis-cg-linkismanager/hadoop-yarn-client-3.0.0-cdh6.3.2.jar
./lib/linkis-computation-governance/linkis-cg-linkismanager/hadoop-yarn-common-3.0.0-cdh6.3.2.jar

2.2部署过程中遇到的问题

1、kerberos配置 需要在linkis.properties公共配置中添加 各个引擎conf也需要添加

wds.linkis.keytab.enable=true
wds.linkis.keytab.file=/hadoop/bigdata/kerberos/keytab
wds.linkis.keytab.host.enabled=false
wds.linkis.keytab.host=your_host

2、更换Hadoop依赖包后启动报错java.lang.NoClassDefFoundError:org/apache/commons/configuration2/Configuration

image

原因:Configuration类冲突,在linkis-commons模块下在添加一个commons-configuration2-2.1.1.jar解决冲突

3、script中运行spark、python等报错no plugin for XXX 现象:在配置文件中修改完spark/python的版本后,启动引擎报错no plugin for XXX image 原因:LabelCommonConfig.java和GovernaceCommonConf.scala这两个类中写死了引擎的版本,修改相应版本,编译后替换掉linkis以及其他组件(包括schedulis等)里面所有包含这两个类的jar(linkis-computation-governance-common-1.1.1.jar和linkis-label-common-1.1.1.jar)

4、python引擎执行报错,初始化失败

  • 修改python.py,移除引入pandas模块

  • 配置python加载目录,修改python引擎的linkis-engineconn.properties

    pythonVersion=/usr/local/bin/python3.6

5、运行pyspark任务失败报错 image 原因:未设置PYSPARK_VERSION 解决方法: 在/etc/profile下设置两个参数

export PYSPARK_PYTHON=/usr/local/bin/python3.6

export PYSPARK_DRIVER_PYTHON=/usr/local/bin/python3.6

6、执行pyspark任务报错 java.lang.NoSuchFieldError: HIVE_STATS_JDBC_TIMEOUT image 原因:spark2.4.8里面使用的是hive1.2.1的包,但是我们的hive升级到了2.1.1版本,hive2里面已经去掉了这个参数,然后spark-sql里面的代码依然是要调用hive的这个参数的,然后就报错了, 所以在spark-sql/hive代码中删除掉了HIVE_STATS_JDBC_TIMEOUT这个参数,重新编译后打包,替换spark2.4.8中的spark-hive_2.11-2.4.8.jar

7、jdbc引擎执行出现代理用户异常

现象:用A用户去执行一个jdbc任务1,引擎选了可以复用,然后我也用B用户去执行一个jdbc任务2,发现 任务2的提交人是A 分析原因: ConnectionManager::getConnection image 这里创建datasource的时候是根据key来判断是否创建,而这个key是jdbc url ,但这种粒度可能有点大,因为有可能是不同的用户去访问同一个数据源,比如说hive,他们的url是一样的,但是账号密码是不一样的,所以当第一个用户去创建datasource时,username已经指定了,第二个用户进来的时候,发现这个数据源存在,就直接拿这个数据源去用,而不是创建一个新的datasource,所以造成了用户B提交的代码通过A去执行了。
解决方法:数据源缓存map的key粒度降低,改成jdbc.url+jdbc.user。

三、DSS部署

安装过程参考官网文档进行安装配置,下面说明一下在安装调试过程中遇到的一些事项。

3.1 DSS 左侧数据库展示的数据库列表显示不全

分析:DSS数据源模块显示的数据库信息是来源于hive的元数据库,但由于CDH6中通过sentry进行权限控制,大部分的hive表元数据信息没有存在于hive metastore中,所以展示的数据存在缺失。 解决方法: 将原有逻辑改造成使用jdbc链接hive的方式,从jdbc中获取表数据展示。 简单逻辑描述: jdbc的properties信息通过linkis控制台配置的IDE-jdbc的配置信息获取。 DBS:通过connection.getMetaData()获取schema TBS:connection.getMetaData().getTables()获取对应db下的tables COLUMNS:通过执行describe table 获取表的columns信息

3.2 DSS 工作流中执行jdbc脚本报错 jdbc.name is empty

分析:dss workflow中默认执行的creator是Schedulis,由于在管理台中未配置Schedulis的相关引擎参数,导致读取的参数全为空。 在控制台中添加Schedulis的Category时报错,”Schedulis目录已存在“。由于调度系统中的creator是schedulis,导致无法添加Schedulis Category,为了更好的标识各个系统,所以将dss workflow中默认执行的creator改成nodeexcetion,该参数可以在dss-flow-execution-server.properties中添加wds.linkis.flow.job.creator.v1=nodeexecution一行配置即可。

· 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;
}
}