Apache Linkis 1.3.0 適配 華爲MRS+Scriptis 實戰分享

一、概述

團隊有需求要在頁面上同時使用sql和python語法對數據進行分析,在調研過程中發現linkis可以滿足需要,遂將其引入內網,由於使用的是華爲MRS,與開源的軟件有所不同, 又進行了二次開發適配,本文將分享使用經驗,希望對有需要的同學有所幫助。

二、環境以及版本

  • jdk-1.8.0_112 , maven-3.5.2

  • hadoop-3.1.1,Spark-3.1.1,Hive-3.1.0,zookerper-3.5.9 (華爲MRS版本)

  • linkis-1.3.0

  • scriptis-web 1.1.0

三、依賴調整以及打包

首先從Linkis官網上下載1.3.0的源碼,然後調整依賴版本

linkis最外層調整pom文件

<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>

linkis-engineplugin-hive的pom文件

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

linkis-engineplugin-spark的pom文件

<spark.version>3.1.1</spark.version>

linkis-hadoop-common的pom文件

<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>

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.1.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.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

編譯錯誤

  • 如果你進行編譯的時候,出現了錯誤,嘗試單獨進入到一個模塊中進行編譯,看是否有錯誤,根據具體的錯誤來進行調整

  • 由於linkis中使用了scala語言進行代碼編寫,建議可以先在配置scala環境,便於閱讀源碼

  • jar包衝突是最常見的問題,特別是升級了hadoop之後,請耐心調整依賴版本

DataSphereStudio的pom文件

由於我們升級了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全量編譯完成,可以進行部署。


四、部署

  • 爲了讓引擎節點有足夠的資源執行腳本,我們採用了多服務器部署,大致部署結構如下

  • SLB 1臺 負載均衡爲輪詢

  • ECS-WEB 2臺 nginx,靜態資源部署,後臺代理轉發

  • ECS-APP 2臺 微服務治理,計算治理,公共增強等節點部署

  • ECS-APP 4臺 EngineConnManager節點部署

Linkis部署

  • 雖然採用了多節點部署,但是我們並沒有將代碼剝離,還是把全量包放在服務器上,只是修改了啓動腳本,使其只啓動所需要的服務

參考官網單機部署示例:https://linkis.apache.org/zh-CN/docs/1.3.0/deployment/deploy-quick

Linkis部署注意點

  • 1.部署用戶: linkis核心進程的啓動用戶,同時此用戶會默認作爲管理員權限,部署過程中會生成對應的管理員登錄密碼,位於conf/linkis-mg-gateway.properties文件中 Linkis支持指定提交、執行的用戶。linkis主要進程服務會通過sudo -u ${linkis-user} 切換到對應用戶下,然後執行對應的引擎啓動命令,所以引擎linkis-engine進程歸屬的用戶是任務的執行者

    該用戶默認爲任務的提交和執行者,如果你想改爲登錄用戶,需要修改 org.apache.linkis.entrance.restful.EntranceRestfulApi類下對應提交方法的代碼 json.put(TaskConstant.EXECUTE_USER, ModuleUserUtils.getOperationUser(req)); json.put(TaskConstant.SUBMIT_USER, SecurityFilter.getLoginUsername(req)); 將以上設置提交用戶和執行用戶改爲Scriptis頁面登錄用戶

  • 2.sudo -u ${linkis-user}切換到對應用戶下,如果使用登錄用戶,這個命令可能會失敗,需要修改此處命令。

    org.apache.linkis.ecm.server.operator.EngineConnYarnLogOperator.sudoCommands

  
  
  
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庫表中更新信息。

安裝web前端

  • web端是使用nginx作爲靜態資源服務器的,直接下載前端安裝包並解壓,將其放在nginx服務器對應的目錄即可

Scriptis工具安裝

  • scriptis 是一個純前端的項目,作爲一個組件集成在DSS的web代碼組件中,我們只需要將DSSweb項目進行單獨的scriptis模塊編譯,將編譯的靜態資源上傳至Linkis管理臺所在的服務器,既可訪問,注意:linkis單機部署默認使用的是session進行校驗,需要先登錄linkis管理臺,再登錄Scriptis就可以使用。

Nginx部署舉例

nginx.conf

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

如何排查問題

  1. linkis一共有100多個模塊,最終啓動的服務一共是7個,分別是 linkis-cg-engineconnmanager,linkis-cg-engineplugin,linkis-cg-entrance,linkis-cg-linkismanager, linkis-mg-gateway, linkis-mg-eureka,linkis-ps-publicservice,每一個模塊都有這不同的功能,其中linkis-cg-engineconnmanager 負責管理啓動引擎服務,會生成對應引擎的腳本來拉起引擎服務,所以我們團隊在部署時將linkis-cg-engineconnmanager單獨啓動在服務器上以便於有足夠的資源給用戶執行。

  2. 像jdbc,spark.hetu之類的引擎的執行需要一些jar包的支撐,在linkis種稱之爲物料,打包的時候這些jar包會打到linkis-cg-engineplugin下對用的引擎中,會出現conf 和lib目錄,啓動這個服務時,會將兩個打包上傳到配置的目錄,會生成兩個zip文件,我們使用的是OSS來存儲這些物料信息,所以首先是上傳到OSS,然後再下載到linkis-cg-engineconnmanager這個服務所在服務器上,然後如果配置了以下兩個配置 wds.linkis.enginecoon.public.dir 和 wds.linkis.enginecoon.root.dir ,那麼會把包拉到wds.linkis.enginecoon.public.dir這個目錄下來,wds.linkis.enginecoon.root.dir這個目錄是工作目錄,裏面存放日誌和腳本信息,還有一個lib和conf的軟連接到 wds.linkis.enginecoon.public.dir。

  3. 如果要排查引擎日誌可以到 wds.linkis.enginecoon.root.dir 配置下的目錄去看,當然日誌信息也會在Scriptis頁面執行的日誌上展示,直接粘貼去查找即可。

本文分享自微信公衆號 - WeDataSphere(gh_273e85fce73b)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章