一、概述
團隊有需求要在頁面上同時使用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;
}
}
如何排查問題
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單獨啓動在服務器上以便於有足夠的資源給用戶執行。
像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。
如果要排查引擎日誌可以到 wds.linkis.enginecoon.root.dir 配置下的目錄去看,當然日誌信息也會在Scriptis頁面執行的日誌上展示,直接粘貼去查找即可。
本文分享自微信公衆號 - WeDataSphere(gh_273e85fce73b)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。