- 在Mac上调试Linkis
- 1. 代码调试环境
- 2. 准备代码并编译
- 3. 配置并启动服务
在Mac上调试Linkis
导语:本文详细记录了如何在IDEA中配置和启动Linkis的各个微服务,并实现JDBC、Python、Shell等脚本的提交和执行。
1. 代码调试环境
- Mac OS m1芯片,Linkis的
linkis-cg-engineplugin和linkis-cg-engineconnmanager两个服务暂不支持在Windows上进行调试,可参考官网的开发文档进行远程调试。 - Zulu openjdk 1.8
- maven3.6.3
- Linkis 1.1.x ,本篇文章理论上可支持对Linkis1.0.3和以上版本的本地开发调试
2. 准备代码并编译
1. git clone git@github.com:apache/incubator-linkis.git
2. cd incubator-linkis
3. git checkout dev-1.2.0
克隆Linkis的源码到本地,并用IDEA打开,首次打开项目会从maven仓库中下载Linkis项目编译所需的依赖jar包。当依赖jar包加载完毕之后,运行如下编译打包命令。
1. mvn -N install
2. mvn clean Install
编译命令运行成功之后,在目录incubator-linkis/linkis-dist/target/下可找到编译好的安装包:apache-linkis-版本号-incubating-bin.tar.gz
3. 配置并启动服务
3.1 add mysql-connector-java到classpath中
服务启动过程中如果遇到mysql驱动类找不到的情况,可以把mysql-connector-java-版本号.jar添加到对应服务模块的classpath下,详细操作请参考3.5小节。
目前依赖mysql的服务有:
- linkis-mg-gateway
- linkis-ps-publicservice
- linkis-cg-linkismanage
3.2 调整log4j2.xml配置
在Linkis源码文件夹下,子目录linkis-dist/package/conf中,是Linkis的一些默认配置文件,首先对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>
3.3 启动eureka服务
Linkis和DSS的服务都依赖Eureka,所以我们需要首先启动Eureka服务,Eureka服务可以在本地启动,也可以使用远程启动的服务。保证各个服务都能访问到Eureka的IP和端口之后,就可以开始着手启动其他微服务了。
在Linkis内部是通过-DserviceName参数设置应用名以及使用配置文件,所以-DserviceName是必须要指定的VM启动参数。
可以通过 “-Xbootclasspath/a:配置文件路径”命令,将配置文件追加到引导程序类的路径末尾,即将依赖的配置文件加到classpath中。
通过勾选Include dependencies with “Provided” scope ,可以在调试时,引入provided级别的依赖包。

参数解释:
1. [service name]
2. linkis-mg-eureka
5. [Use classpath of module]
6. linkis-eureka
9. [Main Class]
10. org.apache.linkis.eureka.SpringCloudEurekaApplication
13. [VM Opitons]
14. -DserviceName=linkis-mg-eureka -Xbootclasspath/a:/Users/leojie/other_project/apache/linkis/incubator-linkis/linkis-dist/package/conf
17. [Program arguments]
18. --spring.profiles.active=eureka --eureka.instance.preferIpAddress=true
如果不想默认的20303端口可以修改端口配置:
1. 文件路径:conf/application-eureka.yml
2. 修改端口:
3. server:
4. port: 8080 ##启动的端口
上述设置完成之后,直接运行此Application,成功启动后可以通过<http://localhost:20303/> 查看eureka服务列表。

3.4 启动linkis-mg-gateway
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

参数解释:
1. [Service Name]
2. linkis-mg-gateway
5. [Use classpath of module]
6. linkis-gateway-server-support
9. [VM Opitons]
10. -DserviceName=linkis-mg-gateway -Xbootclasspath/a:/Users/leojie/other_project/apache/linkis/incubator-linkis/linkis-dist/package/conf
13. [main Class]
14. org.apache.linkis.gateway.springcloud.LinkisGatewayApplication
上述设置完成之后,可直接运行此Application。
3.5 启动linkis-ps-publicservice
publicservice是Linkis的公共增强服务,为其他微服务模块提供统一配置管理、上下文服务、物料库、数据源管理、微服务管理和历史任务查询等功能的模块。
设置linkis-ps-publicservice的启动Application

参数解释:
1. [Service Name]
2. linkis-ps-publicservice
5. [Module Name]
6. linkis-public-enhancements
9. [VM Opitons]
10. -DserviceName=linkis-ps-publicservice -Xbootclasspath/a:/Users/leojie/other_project/apache/linkis/incubator-linkis/linkis-dist/package/conf
13. [main Class]
14. org.apache.linkis.filesystem.LinkisPublicServiceApp
17. [Add provided scope to classpath]
18. 通过勾选Include dependencies with “Provided” scope ,可以在调试时,引入provided级别的依赖包。
直接启动publicservice时,可能会遇到如下报错:

需要把public-module模块加到linkis-public-enhancements模块的classpath下,详细步骤如下:




做完上述配置后重新启动publicservice的Application
3.6 启动linkis-ps-cs
启动ps-cs服务之前,需要保证publicservice服务成功启动。

参数解释:
1. [Service Name]
2. linkis-ps-cs
5. [Use classpath of module]
6. linkis-cs-server
9. [VM Opitons]
10. -DserviceName=linkis-ps-cs -Xbootclasspath/a:/Users/leojie/other_project/apache/linkis/incubator-linkis/linkis-dist/package/conf
13. [main Class]
14. org.apache.linkis.cs.server.LinkisCSApplication
17. [Add provided scope to classpath]
18. 通过勾选Include dependencies with “Provided” scope ,可以在调试时,引入provided级别的依赖包。
3.7 启动linkis-cg-linkismanager

参数解释:
1. [Service Name]
2. linkis-cg-linkismanager
5. [Use classpath of module]
6. linkis-application-manager
9. [VM Opitons]
10. -DserviceName=linkis-cg-linkismanager -Xbootclasspath/a:/Users/leojie/other_project/apache/linkis/incubator-linkis/linkis-dist/package/conf
13. [main Class]
14. org.apache.linkis.manager.am.LinkisManagerApplication
17. [Add provided scope to classpath]
18. 通过勾选Include dependencies with “Provided” scope ,可以在调试时,引入provided级别的依赖包。
3.8 启动linkis-cg-entrance

参数解释:
1. [Service Name]
2. linkis-cg-entrance
5. [Use classpath of module]
6. linkis-entrance
9. [VM Opitons]
10. -DserviceName=linkis-cg-entrance -Xbootclasspath/a:D:\yourDir\incubator-linkis\assembly-combined-package\assembly-combined\conf
13. [main Class]
14. org.apache.linkis.entrance.LinkisEntranceApplication
17. [Add provided scope to classpath]
18. 通过勾选Include dependencies with “Provided” scope ,可以在调试时,引入provided级别的依赖包。
3.9 启动cg-engineconnmanager

参数解释:
1. [Service Name]
2. linkis-cg-engineconnmanager
5. [Use classpath of module]
6. linkis-engineconn-manager-server
9. [VM Opitons]
10. -DserviceName=linkis-cg-engineconnmanager -Xbootclasspath/a:/Users/leojie/other_project/apache/linkis/incubator-linkis/linkis-dist/package/conf -DJAVA_HOME=/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/
13. [main Class]
14. org.apache.linkis.ecm.server.LinkisECMApplication
17. [Add provided scope to classpath]
18. 通过勾选Include dependencies with “Provided” scope ,可以在调试时,引入provided级别的依赖包。
-DJAVA_HOME是为了指定ecm启动引擎时所使用的java命令所在的路径
3.10 启动linkis-cg-engineplugin

参数解释:
1. [Service Name]
2. linkis-cg-engineplugin
5. [Use classpath of module]
6. linkis-engineconn-plugin-server
9. [VM Opitons]
10. -DserviceName=linkis-cg-engineplugin -Xbootclasspath/a:/Users/leojie/other_project/apache/linkis/incubator-linkis/linkis-dist/package/conf
13. [main Class]
14. org.apache.linkis.engineplugin.server.LinkisEngineConnPluginServer
17. [Add provided scope to classpath]
18. 通过勾选Include dependencies with “Provided” scope ,可以在调试时,引入provided级别的依赖包。
启动engineplugin的时候可能会遇到如下报错:

解决办法是把public-module模块加到linkis-engineconn-plugin-server模块的classpath下,参考3.5小节
3.11 关键配置修改
以上操作只是完成了对Linkis各个微服务启动Application的配置,除此之外,Linkis服务启动时所加载的配置文件中,有些关键配置也需要做针对性地修改,否则启动服务或脚本执行的过程中会遇到一些报错。关键配置的修改归纳如下:
3.11.1 conf/linkis.properties
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
7. # 设置bml物料存储路径不为hdfs
8. wds.linkis.bml.is.hdfs=false
9. wds.linkis.bml.local.prefix=/Users/leojie/software/linkis/data/bml
12. wds.linkis.home=/Users/leojie/software/linkis
15. # 设置管理员用户名,你的本机用户名
16. 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=/Users/leojie/software/linkis的目录结构如下,里面只放置了lib目录和conf目录。引擎进程启动时会把wds.linkis.home中的conf和lib路径,加到classpath下,如果wds.linkis.home不指定,可能会遇到目录找不到的异常。

3.11.2 conf/linkis-cg-entrance.properties
1. # entrance服务执行任务的日志目录
2. wds.linkis.entrance.config.log.path=file:///Users/leojie/software/linkis/data/entranceConfigLog
5. # 结果集保存目录,本机用户需要读写权限
6. wds.linkis.resultSet.store.path=file:///Users/leojie/software/linkis/data/resultSetDir
3.11.3 conf/linkis-cg-engineconnmanager.properties
1. wds.linkis.engineconn.root.dir=/Users/leojie/software/linkis/data/engineconnRootDir
不修改可能会遇到路径不存在异常。
3.11.4 conf/linkis-cg-engineplugin.properties
1. wds.linkis.engineconn.home=/Users/leojie/other_project/apache/linkis/incubator-linkis/linkis-engineconn-plugins/shell/target/out
4. wds.linkis.engineconn.plugin.loader.store.path=/Users/leojie/other_project/apache/linkis/incubator-linkis/linkis-engineconn-plugins/shell/target/out
这里两个配置主要为了指定引擎存储的根目录,指定为target/out的主要目的是,引擎相关代码或配置改动后可以直接重启engineplugin服务后生效。
3.12 为当前用户设置sudo免密
引擎拉起时需要使用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. 保存文件退出
3.13 服务测试
保证上述服务都是成功启动状态,然后在postman中测试提交运行shell脚本作业。
首先访问登录接口来生成Cookie:

然后提交执行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-entrance192.168.3.13:9104IDE_leojie_shell_0"
8. }
9. }
最后检查任务运行状态和获取运行结果集:
GET <http://127.0.0.1:9001/api/rest_j/v1/entrance/exec_id018017linkis-cg-entrance192.168.3.13:9104IDE_leojie_shell_0/progress>
1. {
2. "method": "/api/entrance/exec_id018017linkis-cg-entrance192.168.3.13:9104IDE_leojie_shell_0/progress",
3. "status": 0,
4. "message": "OK",
5. "data": {
6. "progress": 1,
7. "progressInfo": [],
8. "execID": "exec_id018017linkis-cg-entrance192.168.3.13: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. }
