调试指引

导语:本文详细记录了如何在IDEA中配置和启动Linkis的各个微服务,并实现JDBC、Python、Shell等脚本的提交和执行。在Mac OS上,Linkis的各个微服务都支持本地调试。 但在Windows OS上,linkis-cg-engineconnmanager服务暂不支持在本地进行调试,可参考下文第4小节的远程调试文档进行调试。

linkis 1.0.3版本前,还未进入apache孵化,组织还是归属webank,主类的包名为`com.webank.wedatasphere.linkis`,调试时,注意区分。

  • jdk1.8
  • maven3.5+
  1. git clone git@github.com:apache/linkis.git
  2. cd linkis
  3. git checkout dev-1.2.0

克隆Linkis的源码到本地,并用IDEA打开,首次打开项目会从maven仓库中下载Linkis项目编译所需的依赖jar包。当依赖jar包加载完毕之后,运行如下编译打包命令。

  1. ##如果对应版本已经发布,则可以跳过该步骤。发布的版本相关依赖已经deploy到maven中央仓库
  2. mvn -N install
  3. mvn clean install -DskipTests

编译命令运行成功之后,在目录linkis/linkis-dist/target/下可找到编译好的安装包:apache-linkis-版本号-incubating-bin.tar.gz

服务启动过程中如果遇到mysql驱动类找不到的情况,可以把mysql-connector-java-版本号.jar添加到对应服务模块的classpath下。

目前依赖mysql的服务有和对应的pom.xml路径如下:

  • linkis-mg-gateway:linkis-spring-cloud-services/linkis-service-gateway/linkis-gateway-server-support/pom.xml
  • linkis-ps-publicservice:linkis-public-enhancements/pom.xml
  • linkis-cg-linkismanage:linkis-computation-governance/linkis-manager/linkis-application-manager/pom.xml
  • linkis-cg-engineplugin: linkis-computation-governance/linkis-engineconn/linkis-engineconn-plugin-server/pom.xml

增加到依赖的方式如下,修改对应服务的pom.xml文件讲mysql依赖加入进去,

  1. <dependency>
  2. <groupId>mysql</groupId>
  3. <artifactId>mysql-connector-java</artifactId>
  4. <version>${mysql.connector.version}</version>
  5. </dependency>

同时需要留意 根pom.xml的<dependencyManagement>中是否将mysql-connector-java依赖的scope设置为test,如是,本地调试时需要注释掉

在Linkis源码文件夹下,子目录linkis-dist/package/conf中,是Linkis的一些默认配置文件,首先对log4j2.xml文件进行编辑,在其中增加日志输出到控制台的配置。

log4j2.xml

这里只贴出来需要新增的配置内容。

  1. <configuration status="error" monitorInterval="30">
  2. <appenders>
  3. <Console name="Console" target="SYSTEM_OUT">
  4. <ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
  5. <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%t] %logger{36} %L %M - %msg%xEx%n"/>
  6. </Console>
  7. </appenders>
  8. <loggers>
  9. <root level="INFO">
  10. <appender-ref ref="Console"/>
  11. </root>
  12. </loggers>
  13. </configuration>

注意: linkis.properties需要修改对应的jdbc的参数

Linkis的服务依赖Eureka作为注册中心,所以我们需要首先启动Eureka服务,Eureka服务可以在本地启动,也可以使用远程启动的服务。保证各个服务都能访问到Eureka的IP和端口之后,就可以开始着手启动其他微服务了。

在Linkis内部是通过-DserviceName参数设置应用名以及使用配置文件,所以-DserviceName是必须要指定的VM启动参数。

可以通过 “-Xbootclasspath/a:配置文件路径”命令,将配置文件追加到引导程序类的路径末尾,即将依赖的配置文件加到classpath中。

通过勾选Include dependencies with “Provided” scope ,可以在调试时,引入provided级别的依赖包。

eureka

参数解释:

  1. [service name]
  2. linkis-mg-eureka
  3. [Use classpath of module]
  4. linkis-eureka
  5. [Main Class]
  6. org.apache.linkis.eureka.SpringCloudEurekaApplication
  7. [VM Opitons]
  8. -DserviceName=linkis-mg-eureka -Xbootclasspath/a:{YourPathPrefix}/linkis/linkis-dist/package/conf
  9. [Program arguments]
  10. --spring.profiles.active=eureka --eureka.instance.preferIpAddress=true

注意调试配置中涉及到的本地路径,需要要修改成自己设置的路径; 在Windows中路径书写规则是:D:{YourPathPrefix}\linkis\linkis-dist\package\conf (针对以下微服务同样适用)

如果不想默认的20303端口可以修改端口配置:

  1. 文件路径:conf/application-eureka.yml
  2. 修改端口:
  3. server:
  4. port: 8080 ##启动的端口

上述设置完成之后,直接运行此Application,成功启动后可以通过http://localhost:20303/ 查看eureka服务列表。

eureka-web

linkis-mg-gateway是Linkis的服务网关,所有的请求都会经由gateway来转发到对应的服务上。 启动服务器前,首先需要编辑conf/linkis-mg-gateway.properties配置文件,增加管理员用户名和密码,用户名需要与你当前登录的mac用户名保持一致。

  1. wds.linkis.admin.user=leojie
  2. wds.linkis.admin.password=123456

设置 linkis-mg-gateway的启动Application

gateway-app

参数解释:

  1. [Service Name]
  2. linkis-mg-gateway
  3. [Use classpath of module]
  4. linkis-gateway-server-support
  5. [VM Opitons]
  6. -DserviceName=linkis-mg-gateway -Xbootclasspath/a:{YourPathPrefix}/linkis/linkis-dist/package/conf
  7. [main Class]
  8. org.apache.linkis.gateway.springcloud.LinkisGatewayApplication

上述设置完成之后,可直接运行此Application。

publicservice是Linkis的公共增强服务,为其他微服务模块提供统一配置管理、上下文服务、物料库、数据源管理、微服务管理和历史任务查询等功能的模块。

设置linkis-ps-publicservice的启动Application

publicservice-app

参数解释:

  1. [Service Name]
  2. linkis-ps-publicservice
  3. [Module Name]
  4. linkis-public-enhancements
  5. [VM Opitons]
  6. -DserviceName=linkis-ps-publicservice -Xbootclasspath/a:{YourPathPrefix}/linkis/linkis-dist/package/conf
  7. [main Class]
  8. org.apache.linkis.filesystem.LinkisPublicServiceApp
  9. [Add provided scope to classpath]
  10. 通过勾选Include dependencies with Provided scope ,可以在调试时,引入provided级别的依赖包。

直接启动publicservice时,可能会遇到如下报错:

publicservice-debug-error

需要把公共依赖的模块加到linkis-public-enhancements模块的classpath下,修改pes的pom增加以下依赖: linkis-public-enhancements/pom.xml

  1. <dependency>
  2. <groupId>org.apache.linkis</groupId>
  3. <artifactId>linkis-dist</artifactId>
  4. <version>${project.version}</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>mysql</groupId>
  8. <artifactId>mysql-connector-java</artifactId>
  9. <version>${mysql.connector.version}</version>
  10. </dependency>

做完上述配置后重新启动publicservice的Application

cg-linkismanager-APP

参数解释:

  1. [Service Name]
  2. linkis-cg-linkismanager
  3. [Use classpath of module]
  4. linkis-application-manager
  5. [VM Opitons]
  6. -DserviceName=linkis-cg-linkismanager -Xbootclasspath/a:{YourPathPrefix}/linkis/linkis-dist/package/conf
  7. [main Class]
  8. org.apache.linkis.manager.am.LinkisManagerApplication
  9. [Add provided scope to classpath]
  10. 通过勾选Include dependencies with Provided scope ,可以在调试时,引入provided级别的依赖包。

cg-entrance-APP

参数解释:

  1. [Service Name]
  2. linkis-cg-entrance
  3. [Use classpath of module]
  4. linkis-entrance
  5. [VM Opitons]
  6. -DserviceName=linkis-cg-entrance -Xbootclasspath/a:D:\yourDir\linkis\linkis-dist\package\conf
  7. [main Class]
  8. org.apache.linkis.entrance.LinkisEntranceApplication
  9. [Add provided scope to classpath]
  10. 通过勾选Include dependencies with Provided scope ,可以在调试时,引入provided级别的依赖包。

engineplugin-app

参数解释:

  1. [Service Name]
  2. linkis-cg-engineplugin
  3. [Use classpath of module]
  4. linkis-engineconn-plugin-server
  5. [VM Opitons]
  6. -DserviceName=linkis-cg-engineplugin -Xbootclasspath/a:{YourPathPrefix}/linkis/linkis-dist/package/conf
  7. [main Class]
  8. org.apache.linkis.engineplugin.server.LinkisEngineConnPluginServer
  9. [Add provided scope to classpath]
  10. 通过勾选Include dependencies with Provided scope ,可以在调试时,引入provided级别的依赖包。

启动engineplugin的时候可能会遇到如下报错:

engineplugin-debug-error

需要把公共依赖的模块加到ecp模块的classpath下,修改pes的pom增加以下依赖: linkis-computation-governance/linkis-engineconn/linkis-engineconn-plugin-server/pom.xml

  1. <dependency>
  2. <groupId>org.apache.linkis</groupId>
  3. <artifactId>linkis-dist</artifactId>
  4. <version>${project.version}</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>mysql</groupId>
  8. <artifactId>mysql-connector-java</artifactId>
  9. <version>${mysql.connector.version}</version>
  10. </dependency>

engineconnmanager-app

参数解释:

  1. [Service Name]
  2. linkis-cg-engineconnmanager
  3. [Use classpath of module]
  4. linkis-engineconn-manager-server
  5. [VM Opitons]
  6. -DserviceName=linkis-cg-engineconnmanager -Xbootclasspath/a:{YourPathPrefix}/linkis/linkis-dist/package/conf -DJAVA_HOME=/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/
  7. [main Class]
  8. org.apache.linkis.ecm.server.LinkisECMApplication
  9. [Add provided scope to classpath]
  10. 通过勾选Include dependencies with Provided scope ,可以在调试时,引入provided级别的依赖包。

-DJAVA_HOME是为了指定ecm启动引擎时所使用的java命令所在的路径,如果你默认JAVA环境变量中的版本满足需要,此配置可以不加

针对linkis-cg-engineconnmanager模块调试暂只支持Mac OS 和 Linux系统

以上操作只是完成了对Linkis各个微服务启动Application的配置,除此之外,Linkis服务启动时所加载的配置文件中,有些关键配置也需要做针对性地修改,否则启动服务或脚本执行的过程中会遇到一些报错。关键配置的修改归纳如下:

  1. # linkis底层数据库连接参数配置
  2. wds.linkis.server.mybatis.datasource.url=jdbc:mysql://yourip:3306/linkis?characterEncoding=UTF-8
  3. wds.linkis.server.mybatis.datasource.username=your username
  4. wds.linkis.server.mybatis.datasource.password=your password
  5. # 设置bml物料存储路径不为hdfs
  6. wds.linkis.bml.is.hdfs=false
  7. wds.linkis.bml.local.prefix=/Users/leojie/software/linkis/data/bml
  8. wds.linkis.home=/Users/leojie/software/linkis
  9. # 设置管理员用户名,你的本机用户名
  10. wds.linkis.governance.station.admin=leojie

在配置linkis底层数据库连接参数之前,请创建linkis数据库,并运行linkis-dist/package/db/linkis_ddl.sql和linkis-dist/package/db/linkis_dml.sql来初始化所有表和数据。

其中wds.linkis.home={YourPathPrefix}/linkis的目录结构如下,里面只放置了lib目录和conf目录。引擎进程启动时会把wds.linkis.home中的conf和lib路径,加到classpath下,如果wds.linkis.home不指定,可能会遇到目录找不到的异常。

linkis-home

  1. # entrance服务执行任务的日志目录
  2. wds.linkis.entrance.config.log.path=file:///{YourPathPrefix}/linkis/data/entranceConfigLog
  3. # 结果集保存目录,本机用户需要读写权限
  4. wds.linkis.resultSet.store.path=file:///{YourPathPrefix}/linkis/data/resultSetDir
  1. wds.linkis.engineconn.root.dir={YourPathPrefix}/linkis/data/engineconnRootDir

不修改可能会遇到路径不存在异常。

  1. wds.linkis.engineconn.home={YourPathPrefix}/linkis/linkis-engineconn-plugins/shell/target/out
  2. wds.linkis.engineconn.plugin.loader.store.path={YourPathPrefix}/linkis/linkis-engineconn-plugins/shell/target/out

这里两个配置主要为了指定引擎存储的根目录,指定为target/out的主要目的是,引擎相关代码或配置改动后可以直接重启engineplugin服务后生效。

引擎拉起时需要使用sudo来执行启动引擎进程的shell命令,mac上当前用户使用sudo时一般都需要输入密码,因此,需要为当前用户设置sudo免密,设置方法如下:

  1. sudo chmod u-w /etc/sudoers
  2. sudo visudo
  3. 将#%admin ALL=(ALL) AL替换为 %admin ALL=(ALL) NOPASSWD: ALL
  4. 保存文件退出

保证上述服务都是成功启动状态,然后在postman中测试提交运行shell脚本作业。

首先访问登录接口来生成Cookie:

login

然后提交执行shell代码

POST: http://127.0.0.1:9001/api/rest_j/v1/entrance/submit

body参数:

  1. {
  2. "executionContent": {
  3. "code": "echo 'hello'",
  4. "runType": "shell"
  5. },
  6. "params": {
  7. "variable": {
  8. "testvar": "hello"
  9. },
  10. "configuration": {
  11. "runtime": {},
  12. "startup": {}
  13. }
  14. },
  15. "source": {
  16. "scriptPath": "file:///tmp/hadoop/test.sql"
  17. },
  18. "labels": {
  19. "engineType": "shell-1",
  20. "userCreator": "leojie-IDE"
  21. }
  22. }

执行结果:

  1. {
  2. "method": "/api/entrance/submit",
  3. "status": 0,
  4. "message": "OK",
  5. "data": {
  6. "taskID": 1,
  7. "execID": "exec_id018017linkis-cg-entrance127.0.0.1:9104IDE_leojie_shell_0"
  8. }
  9. }

最后检查任务运行状态和获取运行结果集:

GET http://127.0.0.1:9001/api/rest_j/v1/entrance/exec_id018017linkis-cg-entrance127.0.0.1:9104IDE_leojie_shell_0/progress

  1. {
  2. "method": "/api/entrance/exec_id018017linkis-cg-entrance127.0.0.1:9104IDE_leojie_shell_0/progress",
  3. "status": 0,
  4. "message": "OK",
  5. "data": {
  6. "progress": 1,
  7. "progressInfo": [],
  8. "execID": "exec_id018017linkis-cg-entrance127.0.0.1:9104IDE_leojie_shell_0"
  9. }
  10. }

GET http://127.0.0.1:9001/api/rest_j/v1/jobhistory/1/get

GET http://127.0.0.1:9001/api/rest_j/v1/filesystem/openFile?path=file:///Users/leojie/software/linkis/data/resultSetDir/leojie/linkis/2022-07-16/214859/IDE/1/1_0.dolphin

  1. {
  2. "method": "/api/filesystem/openFile",
  3. "status": 0,
  4. "message": "OK",
  5. "data": {
  6. "metadata": "NULL",
  7. "totalPage": 0,
  8. "totalLine": 1,
  9. "page": 1,
  10. "type": "1",
  11. "fileContent": [
  12. [
  13. "hello"
  14. ]
  15. ]
  16. }
  17. }

明确需要调试的包所在的服务,并根据需要调试的代码位置,确定其所属的服务

c-port

  1. sh linkis-daemon.sh restart ps-publicservice

(如果不确定服务名称,在 ${LINKIS_HOME}/sbin/linkis-start-all.sh 内查询)

如下图所示打开窗口并配置远程调试的端口,服务,以及模块
c-debug

点击调试按钮,出现如下信息代表可以开始调试
debug