团队有需求要在页面上同时使用sql和python语法对数据进行分析,在调研过程中发现linkis可以满足需要,遂将其引入内网,由于使用的是华为MRS,与开源的软件有所不同, 又进行了二次开发适配,本文将分享使用经验,希望对有需要的同学有所帮助。
首先从linkis官网上下载1.3.0的源码,然后调整依赖版本
<hadoop.version>3.1.1</hadoop.version> <zookerper.version>3.5.9</zookerper.version> <curaor.version>4.2.0</curaor.version> <guava.version>30.0-jre</guava.version> <json4s.version>3.7.0-M5</json4s.version> <scala.version>2.12.15</scala.version> <scala.binary.version>2.12</scala.binary.version>
<hive.version>3.1.2</hive.version>
<spark.version>3.1.1</spark.version>
<dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-hdfs</artifactId> <!-- 只需要将该行替换即可,替换为 <artifactId>hadoop-hdfs-client</artifactId>--> <version>${hadoop.version}</version> </dependency> 将hadoop-hdfs修改为: <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-hdfs-client</artifactId> <version>${hadoop.version}</version> </dependency>
org.apache.linkis.manager.label.conf.LabelCommonConfig 修改默认版本,便于后续的自编译调度组件使用
public static final CommonVars<String> SPARK_ENGINE_VERSION = CommonVars.apply("wds.linkis.spark.engine.version", "3.1.1"); public static final CommonVars<String> HIVE_ENGINE_VERSION = CommonVars.apply("wds.linkis.hive.engine.version", "3.1.2");
org.apache.linkis.governance.common.conf.GovernanceCommonConf 修改默认版本,便于后续的自编译调度组件使用
val SPARK_ENGINE_VERSION = CommonVars("wds.linkis.spark.engine.version", "3.1.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
由于我们升级了scala的版本,在部署时会报错,engineplugin启动失败,dss-gateway-support-1.1.0 conn to bml now exit java.net.socketException:Connection reset,这里需要修改scala版本,重新编译。 1.删除掉低版本的 dss-gateway-support jar包, 2.将DSS1.1.0中的scala版本修改为2.12,重新编译,获得新的dss-gateway-support-1.1.0.jar,替换linkis_installhome/lib/linkis-spring-cloud-service/linkis-mg-gateway中原有的jar包
<!-- scala 环境一致 --> <scala.version>2.12.15</scala.version>
按照上面的依赖版本调整,就能解决大部分问题,如果还有问题则需要对应日志仔细调整。 如果能编译出完整的包,则代表linkis全量编译完成,可以进行部署。
参考官网单机部署示例:https://linkis.apache.org/zh-CN/docs/1.3.0/deployment/deploy-quick
private def sudoCommands(creator: String, command: String): Array[String] = { Array( "/bin/bash", "-c", "sudo su " + creator + " -c \"source ~/.bashrc 2>/dev/null; " + command + "\"" ) } 修改为 private def sudoCommands(creator: String, command: String): Array[String] = { Array( "/bin/bash", "-c", "\"source ~/.bashrc 2>/dev/null; " + command + "\"" ) }
3.Mysql的驱动包一定要copy到/lib/linkis-commons/public-module/和/lib/linkis-spring-cloud-services/linkis-mg-gateway/
4.默认是使用静态用户和密码,静态用户即部署用户,静态密码会在执行部署是随机生成一个密码串,存储于${LINKIS_HOME}/conf/linkis-mg-gateway.properties
5 数据库脚本执行,linkis本身需要用到数据库,但是我们再执行linkis1.3.0版本的插入数据的脚本时,发现了报错,我们当时时直接删掉了报错部分的数据
6 Yarn的认证,执行spark任务时会将任务提交到队列上去,会首先获取队列的资源信息,进行判断是否有资源可以提交,这里需要配置是否开启kerberos模式认证和是否使用keytab文件 进行认证,如果开启了文件认证需要将文件放入到服务器对应目录,并且在linkis_cg_rm_external_resource_provider库表中更新信息。
upstream linkisServer{ server ip:port; server ip:port; } server { listen 8088;# 访问端口 server_name localhost; #charset koi8-r; #access_log /var/log/nginx/host.access.log main; #scriptis静态资源 location /scriptis { # 修改为自己的前端路径 alias /home/nginx/scriptis-web/dist; # 静态文件目录 #root /home/hadoop/dss/web/dss/linkis; index index.html index.html; } #默认资源路径指向管理台前端静态资源 location / { # 修改为自己的前端路径 root /home/nginx/linkis-web/dist; # 静态文件目录 #root /home/hadoop/dss/web/dss/linkis; index index.html index.html; } location /ws { proxy_pass http://linkisServer/api #后端Linkis的地址 proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection upgrade; } location /api { proxy_pass http://linkisServer/api; #后端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; } }