Apache Seatunnel本地源碼構(gòu)建編譯運(yùn)行調(diào)試
1. 環(huán)境準(zhǔn)備
??本文使用的是windows10-64位專業(yè)版的電腦,需要安裝環(huán)境如下
1.1 Java環(huán)境
??jdk>=1.8 - 64 位的jdk、
1.2 Maven
??使用的是idea自帶的maven,最好是安裝一個方便源碼編譯構(gòu)建,使用idea自帶的maven無法執(zhí)行mvnw,但是可以復(fù)制mvnw后面的在idea的maven中的run maven中的new goal里面執(zhí)行即可。
1.3 IDEA
??代碼編輯調(diào)試運(yùn)行器
1.4 Docker環(huán)境
??mysql8.0.28的安裝是使用docker安裝部署
1.5 Mysql8.0.28
Docker部署Mysql5.7x和Myslq8.x
https://mp.weixin.qq.com/s/5PC_VXtNc8689ag8b8cYLA
??以上那幾個步驟省略
1.6 其它環(huán)境準(zhǔn)備
??還需要如下的如下環(huán)境:
Windows10安裝Node.js環(huán)境
https://mp.weixin.qq.com/s/qHHcbl6AMmdEbZLKnhz_tA
Windows10安裝Hadoop3.1.3環(huán)境
https://mp.weixin.qq.com/s/BaXK0dMu4whOrnKQbb6G-A
Windows10之wsl-Linux子系統(tǒng)安裝JDK、Maven環(huán)境
https://mp.weixin.qq.com/s/Lq30469wZgikM72s8tv1ZA
在閱讀本文需要對Apache SeaTunne有一點(diǎn)了解
Apache SeaTunne簡介
https://mp.weixin.qq.com/s/uHZ-29OF-NawOL4oZW6z2A
2. 源碼包下載
https://seatunnel.apache.org/download
https://github.com/apache/seatunnel
https://github.com/apache/seatunnel-web
??seatunnel可以在官方的download下載源碼包或者在github上下載tag2.3.3包,不要下載2.3.3-release,不要下載xxx-release的分支,就拿2.3.3-release分支來說,里面的項目版本有2.3.3、又有2.3.4的版本,項目模塊之前的版本不統(tǒng)一,就會導(dǎo)致編譯版本沖突,下載tag中的2.3.3或者是download源碼Source Code包,本文使用的tag2.3.3的包來本地編譯構(gòu)建運(yùn)行的,使用2.3.3-release分支版本不統(tǒng)一導(dǎo)致沖突,我懷疑這個2.3.3-release分支估計是他們的開發(fā)分支,所以這里是需要注意的,不然很難在本地搞起來,seatunnel-web項目拉取的是1.0.0-release分支的代碼。
3. idea項目配置
3.1 項目導(dǎo)入
??seatunnel解壓路徑如下:
??seatunnel-web路徑如下:
git clone https://github.com/apache/seatunnel-web.git
git checkout 1.0.0-release
或者使用git拉取,git環(huán)境可要可不要
3.2 maven配置
??setting.xml配置
??配置成阿里的maven倉庫方便編譯構(gòu)建是下載拉取項目所需的依賴包
<localRepository>D:\developer\repository</localRepository> <!--改為自己的本地maven倉庫的路徑即可-->
<mirrors>
<mirror>
<id>aliyunmaven</id>
<mirrorOf>*</mirrorOf>
<name>阿里云公共倉庫</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>
<mirror>
<id>aliyunmaven2</id>
<mirrorOf>*</mirrorOf>
<name>阿里云公共倉庫2</name>
<url>https://maven.aliyun.com/repository/apache-snapshots</url>
</mirror>
<mirror>
<id>aliyunmaven3</id>
<mirrorOf>*</mirrorOf>
<name>阿里云公共倉庫3</name>
<url>https://maven.aliyun.com/repository/central</url>
</mirror>
</mirrors>
??idaea的maven配置
??兩個項目都是這種配置,這里選擇一個演示即可。
3.3 項目JDK配置
??在project和SDKs選項中選擇配置下jdk,兩個項目都是這種配置,這里選擇一個演示即可。
3.4 項目啟動參數(shù)配置
3.4.1 seatunnel項目啟動參數(shù)配置
??jvm參數(shù)如下:編譯的壓縮包的解壓路徑
-DSEATUNNEL_HOME=D:\developer\other-code\other\seatunnel\seatunnel-dist\target\apache-seatunnel-2.3.3
??項目編譯后會輸出到seatunnel-dist的target下
3.4.2 seatunnel-web項目啟動參數(shù)配置
??jvm參數(shù)和環(huán)境變量如下:
jvm參數(shù)
-DSEATUNNEL_HOME=D:\developer\other-code\other\seatunnel\seatunnel-dist\target\apache-sea
環(huán)境變量
ST_WEB_BASEDIR_PATH=D:\developer\other-code\other\seatunnel-web\seatunnel-web-dist\target\apache-seatunnel-web-1.0.1-SNAPSHOT\apache-seatunnel-web-1.0.1-SNAPSHOT
??項目編譯后會輸出到seatunnel-web-dist的target下
4. 源碼編譯運(yùn)行
4.1 sql腳本執(zhí)行
??腳本如下,復(fù)制出來執(zhí)行即可:
??數(shù)據(jù)庫執(zhí)行如下:
4.2 編譯構(gòu)建
4.2.1 seatunnel編譯構(gòu)建
??jindodata先關(guān)的jar需要自行下載導(dǎo)入,在seatunnel-connectors-v2–>connector-file–>connector-file-jindo-oss的pom文件修改依賴如下:
<dependency>
<groupId>com.aliyun.jindodata</groupId>
<artifactId>jindo-core</artifactId>
<version>${jindo-sdk.version}</version>
<scope>system</scope>
<systemPath>${project.basedir}/src/main/resources/lib/jindo-core-4.6.1.jar</systemPath>
</dependency>
<dependency>
<groupId>com.aliyun.jindodata</groupId>
<artifactId>jindosdk</artifactId>
<version>${jindo-sdk.version}</version>
<scope>system</scope>
<systemPath>${project.basedir}/src/main/resources/lib/jindo-sdk-4.6.1.jar</systemPath>
</dependency>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.4.2</version>
<configuration>
<includeSystemScope>true</includeSystemScope>
</configuration>
</plugin>
</plugins>
</build>
??引入jindodata相關(guān)的本地依賴和打包插件,jindodata相關(guān)包會在文末分享給大家
??修改seatunnel-hadoop3-3.1.4-uber的maven如下:
??該包如果不修改直接引入會導(dǎo)致下面的類死活依賴不到,后面將改包放入到taget的解壓路徑下的lib里面不生效導(dǎo)致報錯如下:
??加入mysql8.x的連接驅(qū)動包,這里不加的話,可以在解壓的target目錄下的lib中把這個jar包放進(jìn)去,因為本文要進(jìn)行的是mysql-jdbc—>mysql-jdbc的單表數(shù)據(jù)同步,所以需要這個jar包
??seatunnel.yaml配置,這個基本默認(rèn)即可
??如果下載的是release支付的包或代碼,需要在整個項目的pom中加入如下的配置:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-gpg-plugin</artifactId>
<version>3.0.1</version>
<executions>
<execution>
<id>sign-artifacts</id>
<phase>verify</phase>
<goals>
<goal>sign</goal>
</goals>
</execution>
</executions>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
??該插件配置是或略打包時候的gpg簽名校驗,不然會編譯不通過,好多開源正規(guī)的項目都有這種簽名校驗的,所以需要加入這個插件才可以編譯通過
4.2.3 seatunnel-web編譯構(gòu)建
??seatunnel-server–>seatunnel-app–>pom加入mysql8.x的連接驅(qū)動包,可以使用8.0.28的包
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version>
</dependency>
??修改seatunnel-app下的application.yml
??將seatunnel項目里面編譯到seatunnel-dist下target里面的解壓文件里面的的hazelcast-client.yaml文件和connectors文件下的plugin-mapping.properties(這個文件已經(jīng)包含了,可以修改,注釋里面的一些插件,放入自己需要的插件即可)文件拷貝到seatunnel-app的rusources里面,如上圖所示.
??plugin-mapping.properties配置文件修改只包含如下兩個插件:
seatunnel.source.Jdbc = connector-jdbc
seatunnel.sink.Jdbc = connector-jdbc
4.3 編譯打包命令
seatunnel項目運(yùn)行這個:
mvn clean package -pl seatunnel-dist -am -Dmaven.test.skip=true
seatunnel打包插件命令實例如下:
mvn clean package -pl seatunnel-connectors-v2/connector-jdbc -am -DskipTests -T 1C
seatunnel-web項目運(yùn)行這個:
mvn clean package -pl seatunnel-web-dist -am -Dmaven.test.skip=true
或者可以直接點(diǎn)擊右側(cè)maven的package打包即可
??關(guān)于這個編譯構(gòu)建的官方也有講,下面兩個連接打開就有,需要仔細(xì)的閱讀
https://seatunnel.apache.org/docs/2.3.3/contribution/setup
https://github.com/apache/seatunnel-web
4.4 啟動運(yùn)行
??在啟動前需要先啟動本地的mysql8.x、hadoop3.1.3
??在啟動之前將如下的jar包放入到seatunnel和seatunnel-web編譯構(gòu)建的target的lib目錄下,以免啟動由于缺少jar依賴而報錯
??或者是把項目中編譯好的插件或數(shù)據(jù)源jar復(fù)制到這個兩個項目的target的lib目錄下也是可以的,上面的是我去阿里云maven倉庫下載的
??然后先啟動seatunnel在啟動seatunnel-web
??前端ui編譯啟動
??ui源碼構(gòu)建發(fā)布前需要修改訪問后端的端口號:
??cmd進(jìn)入到seatunnel-web—>seatunnel-ui
??路徑執(zhí)行如下命令:
npm install
npm run dev
4.5 訪問首頁
??訪問地址:
http://localhost:5173/
用戶名/密碼都是admin
5. mysql-jdbc 到mysql-jdbc的單表數(shù)據(jù)同步
5.1 添加數(shù)據(jù)源
??如果創(chuàng)建不可以選擇說明是對應(yīng)的lib下面沒有放入對應(yīng)的數(shù)據(jù)源的插件jar包
5.2 同步任務(wù)定義
??這里我們添加的是兩個mysql-jdbc的數(shù)據(jù)源,這里采用任務(wù)類型是“數(shù)據(jù)集成”,mysql的單表同步到mysql的單表
??將seatunnel庫中的表role表同步到seatunnel_copy數(shù)據(jù)庫中的role表中,seatunnel_copy數(shù)據(jù)庫中的role表的結(jié)構(gòu)和seatunnel庫中的表role表結(jié)構(gòu)一模一樣
??任務(wù)的source和sink的數(shù)據(jù)源如果不可以選,說明是lib下沒有數(shù)據(jù)源相關(guān)的jar,需要放入指定的jar重啟項目才可以選數(shù)據(jù)源
??source配置如下:
??sink配置如下:
5.3 同步任務(wù)執(zhí)行
??保存選擇任務(wù)的類型使用的流式任務(wù):(保存可以選擇流式任務(wù)也可以選擇批任務(wù))
??配置好任務(wù)之后,就可以點(diǎn)擊運(yùn)行按鈕,執(zhí)行完之后在“同步任務(wù)實例”列表中就可以看到之前的任務(wù),狀態(tài)是已完成
5.4 同步任務(wù)執(zhí)行遇到的問題
??如果狀態(tài)執(zhí)行不是已完成就會是一個以失敗的狀態(tài),原因可能是缺少jar包或者是本地缺少hadoop3.1.3的環(huán)境,hadoop的環(huán)境官方的大佬說不是必須的,但是我在本地做這個案例的時候沒有hadoop會執(zhí)行報錯的,所以上面seatunnel引擎的公共模塊中的seatunnel.yaml配置里面配置了hdfs相關(guān)存儲的信息,所以還需要去hdfs上新建一個目錄如下:
??這個目錄不建立沒有試過會不會報錯,反正是有總比沒有好,本地沒有hapood會報如下錯誤:
??大致上是任務(wù)在執(zhí)行的時候需要做一些任務(wù)的檢查點(diǎn)或保存點(diǎn)的數(shù)據(jù)狀態(tài)的存儲,上面那個報錯感覺是執(zhí)行了兩次或者是多個線程執(zhí)行過導(dǎo)致數(shù)據(jù)本來第一次是已經(jīng)同步過去了,后面有搞了一次就主鍵沖突導(dǎo)致任務(wù)狀態(tài)變成失敗了,有了hdfs就不會有這個報錯的,也是很神奇。
5.5 同步任務(wù)執(zhí)行的結(jié)果
??可以看到seatunnel庫中role表數(shù)據(jù)同步到seatunnel_copy數(shù)據(jù)庫中的role表中了
6. 總結(jié)
??本地源碼編譯運(yùn)行已經(jīng)分享完了,這樣做是為了更好的理解這個項目,你可以跑起來在idea中本地兩邊的項目打上斷點(diǎn),使用debug調(diào)試跟蹤源碼,可以開發(fā)一個插件或者是為這個項目貢獻(xiàn)源碼,或者是用于學(xué)習(xí),通過欣賞項目的源碼來學(xué)習(xí)項目中的一些好的設(shè)計思路,我個人覺得這個項目的亮點(diǎn)有一下幾點(diǎn):
??第一:使用hazelcast(底層基于netty和socket)實現(xiàn)了內(nèi)核集群,同時也可以使用hazelcast的代client向hazelcast引擎服務(wù)提交一個任務(wù),然后該任務(wù)由web端或者是linux的控制臺提交到引擎服務(wù)上(提交的任務(wù)是一個json的文件,里面定義好了input、transform和sink這三個階段的信息),引擎服務(wù)又有master和work,主節(jié)點(diǎn)負(fù)責(zé)管理work節(jié)點(diǎn)的狀態(tài)和任務(wù)調(diào)度(任務(wù)需要下發(fā)到那個work節(jié)點(diǎn)上執(zhí)行,利用多機(jī)分布式來跑任務(wù)),并且會對任務(wù)做保存點(diǎn)or檢查點(diǎn)(有點(diǎn)像fink的保存點(diǎn)和檢查點(diǎn)的概念)。
??第二是插件機(jī)制:一個插件就是一個jar包,把公共的流程步驟高度抽象封裝到上層的api中,差異化的實現(xiàn)各種場景下的數(shù)據(jù)同步需求,數(shù)據(jù)源和插件是很豐富的
??第三是類加載器:實現(xiàn)了自己的類加載器,項目啟動就通過自己實現(xiàn)的類加載器加載指定路徑下的插件jar包,就是通過這種插件的加載機(jī)制來完成按需加載,插件的機(jī)制就是上一個插件的輸出作為下一個插件的輸入,數(shù)據(jù)在一個插件鏈條上滾動傳遞,有點(diǎn)像設(shè)計模式中的責(zé)任鏈模式。
??第四是三套引擎:默認(rèn)使用的是自研的SeaTunnelEngine,還支持flink和spark兩大引擎。
??上面只是我個人看到的一些優(yōu)點(diǎn),也沒有細(xì)細(xì)的看,就隨便看了下,或許還有我不曉得的新東西,上面的hazelcast可以研究學(xué)下下,插件機(jī)制和自定義類加載機(jī)制是可以應(yīng)用于我們平時的業(yè)務(wù)代碼開發(fā)中。
??有優(yōu)點(diǎn)同樣也存在缺點(diǎn),她是一個閃亮的星星還處于發(fā)展階段,相對來說還不是那么成熟,所以選型得慎重考慮,官方的文檔雖然是比較全的,但是基本是英文的并且篇幅比較短,字少事多,趕腳寫的不是那么詳細(xì),有的影藏的細(xì)節(jié)的東西,需要查看官方的公眾號的文章或者是看源碼中才能找到答案的,在遇到問題的時候最好的方法是找官方,尋求官方的幫助,加入官方的群聊,可以直接和大佬溝通,或者是你自己改源碼解決,感覺不太靠譜還是不要使用以免背鍋,本地構(gòu)建編譯如果你實在是編譯運(yùn)行不起來的話,多花一點(diǎn)時間是可以搞出來的,這個玩意我搞了有一個星期了吧,實在是有點(diǎn)蛋疼遇到各種奇葩的問題,在搞不出來,都有點(diǎn)想不搞了,放棄吧,但是一想在試一試結(jié)果還是被我搞出來了,堅持向下鑿水源距離你可能就差一步之遙了,其實也是可以不編譯構(gòu)建,欣賞下源碼也是不錯的選擇,然后不用把時間浪費(fèi)在這個構(gòu)建編譯上,其實是為了打斷點(diǎn)好調(diào)試一點(diǎn),光看代碼的話,也是只能瀏覽下看個大概,在學(xué)習(xí)研究這種開源的項目,也在只能是看他的官方文檔和其他的一些博客資料,邊搞邊猜,邊猜邊搞,慢慢的也基本上能搞通,需要參看好多的文章或信息,然后從中實踐出真知,所以我就寫了這篇文章總結(jié)了下,下一篇文章分享在centOs上的安裝部署實踐mysql-jdbc==>mysql-jdbc同步例子中遇到的坑,敬請期待下一篇文章,希望我的分享對你有所幫助,請一鍵三連,么么么噠!文章來源:http://www.zghlxwxcb.cn/news/detail-794912.html
7.資料分享
鏈接:https://pan.baidu.com/s/1DWKpX2j5nyvDT3UucVc1Sg
提取碼:ip7p
??seatunnel-2.3.3.zip是tag的源碼包, apache-seatunnel-2.3.3-src.tar.gz這個是官網(wǎng)的download下載的sourceCode包。文章來源地址http://www.zghlxwxcb.cn/news/detail-794912.html
到了這里,關(guān)于Apache Seatunnel本地源碼構(gòu)建編譯運(yùn)行調(diào)試的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!