在Windows操作系統中,"link"命令用于創建符號鏈接或硬鏈接。
符號鏈接(Symbolic Link)是一種特殊的文件類型,它包含指向另一個文件或目錄的路徑。當訪問符號鏈接時,系統會跟隨路徑找到實際的文件或目錄。符號鏈接可以是相對路徑或絕對路徑,并且可以跨越不同的驅動器和文件系統。
硬鏈接(Hard Link)是在文件系統中創建一個新的文件名,與原文件名指向同一個索引節點(inode),實際上它們是同一個文件。對其中一個文件所做的更改都會反映在另一個文件上。與符號鏈接不同,硬鏈接只能鏈接到文件而不能鏈接到目錄,并且只能在同一個驅動器上創建。
"link"命令的原理和機制是基于文件系統的數據結構。在Windows文件系統中,每個文件都有一個唯一的File ID(文件標識符),用來表示文件的元數據信息。當創建一個硬鏈接時,實際上是在文件系統中創建了一個新的文件名,并將這個文件名與原文件的File ID 關聯起來,使它們指向同一個文件。創建符號鏈接時,也是在文件系統中創建一個新的文件名,并將這個文件名與指向的文件或目錄的路徑關聯起來。
link命令可以用于創建符號鏈接和硬鏈接,它們有各自的應用場景:
符號鏈接
符號鏈接適用于以下場景:
需要在不同的文件系統之間鏈接文件:由于符號鏈接可以跨越不同驅動器和文件系統,所以可以使用符號鏈接將一個文件鏈接到另一個文件系統中。
需要鏈接目錄:硬鏈接只能鏈接文件,而符號鏈接可以鏈接目錄,這使得它們在一些特定情況下非常有用。
需要鏈接到相對路徑:相對路徑是相對于當前位置而言的。符號鏈接可以鏈接到相對路徑,這使得它們在一些特定情況下非常有用。
硬鏈接
硬鏈接適用于以下場景:
需要在同一文件系統上鏈接文件:由于硬鏈接只能鏈接同一文件系統上的文件,因此它們通常用于在同一磁盤分區上鏈接文件。
需要多個文件名同時指向同一個文件:硬鏈接允許多個文件名指向同一個文件,這意味著可以在不同的位置上使用不同的文件名訪問同一個文件。
需要共享數據:當多個用戶需要同時訪問同一個文件時,使用硬鏈接可以避免復制多份相同的文件。這樣可以節省磁盤空間,并且保證數據一致性。
link命令
用法:link [OPTION]... TARGET LINK_NAME
創建一個名為LINK_NAME的硬鏈接,鏈接到文件TARGET。
選項:
-d, --directory 創建一個目錄的硬鏈接
-f, --force 如果LINK_NAME已經存在,則強制覆蓋它
-i, --interactive 覆蓋現有文件之前進行交互式確認
-n, --no-dereference 將符號鏈接視為常規文件
-s, --symbolic 創建一個符號鏈接而不是硬鏈接
-v, --verbose 顯示詳細輸出
-V, --version 顯示版本信息并退出
-h, --help 顯示幫助信息并退出
使用示例:
創建一個硬鏈接:link file1 link1
創建一個目錄的硬鏈接:link -d directory1 link1
創建一個符號鏈接:link -s file1 link1
參考:
參考【后端編譯 | Apache Linkis】】
<mysql.connector.scope>compile</mysql.connector.scope>
<!--<mysql.connector.scope>test</mysql.connector.scope>-->
如果您是本地第一次使用,必須在最外層工程pom.xml所在目錄先執行以下命令:
mvn -N install
在最外層工程pom.xml所在目錄執行以下命令
mvn clean install -DskipTests
參考【管理臺編譯 | Apache Linkis】
在 Linkis 源碼文件夾下,子目錄 linkis-dist/package/conf 中,是 Linkis 的一些默認配置文件,將配置文件復制到自己的配置文件目錄,如D:\linkis\linkis-package\conf
增加日志輸出到控制臺的配置,修改后內容如下:
<configuration status="error" monitorInterval="30">
<properties>
<property name="LOG_PATH">logs</property>
<property name="LOG_FILE">linkis</property>
</properties>
<appenders>
<RollingFile name="RollingFile" append="true" fileName="${LOG_PATH}/${LOG_FILE}.log"
filePattern="${LOG_PATH}/$${date:yyyy-MM}/${LOG_FILE}/linkis-log-%d{yyyy-MM-dd-hh}-%i.log">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] [%-40t] %c{1.} (%L) [%M] [JobId-%X{jobId}] - %msg%xEx%n"/>
<Policies>
<SizeBasedTriggeringPolicy size="100MB"/>
</Policies>
<DefaultRolloverStrategy max="10"/>
</RollingFile>
<console name="Console-Plain" target="SYSTEM_OUT">
<!--輸出日志的格式-->
<PatternLayout pattern="%m%n"/>
</console>
</appenders>
<loggers>
<root level="INFO">
<appender-ref ref="Console-Plain"/>
</root>
<logger name="com.netflix.loadbalancer.DynamicServerListLoadBalancer" level="warn" additivity="true">
<appender-ref ref="Console-Plain"/>
</logger>
</loggers>
</configuration>
創建數據庫,并執行linkis數據庫腳本,修改linkis.properties配置文件。
所有微服務名稱如下:
├── linkis-cg-engineconnmanager 引擎管理服務
├── linkis-cg-engineplugin 引擎插件管理服務
├── linkis-cg-entrance 計算治理入口服務
├── linkis-cg-linkismanager 計算治理管理服務
├── linkis-mg-eureka 微服務注冊中心服務
├── linkis-mg-gateway Linkis網關服務
├── linkis-ps-publicservice 公共服務
Linkis 和 DSS 的服務都依賴 Eureka,所以我們需要首先啟動 Eureka 服務,Eureka 服務可以在本地啟動,也可以使用遠程啟動的服務。保證各個服務都能訪問到 Eureka 的 IP 和端口之后,就可以開始著手啟動其他微服務了。
在 Linkis 內部是通過-DserviceName 參數設置應用名以及使用配置文件,所以-DserviceName 是必須要指定的 VM 啟動參數。
可以通過 “-Xbootclasspath/a:配置文件路徑”命令,將配置文件追加到引導程序類的路徑末尾,即將依賴的配置文件加到 classpath 中。
通過勾選 Include dependencies with “Provided” scope ,可以在調試時,引入 provided 級別的依賴包。
服務名:
linkis-mg-eureka
啟動類:
org.apache.linkis.eureka.SpringCloudEurekaApplication
VM參數:
-DserviceName=linkis-mg-eureka -Xbootclasspath/a\:D:\linkis\linkis-package\conf
program參數:
--spring.profiles.active=eureka --eureka.instance.preferIpAddress=true
直接運行此Application,成功啟動后可以通過http://localhost:20303/ 查看 eureka 服務列表。
附:如果服務器已有linkis-mg-eureka服務,可以使用nginx作為代理訪問(端口不能直接訪問)。修改nginx.conf,配置如下
upstream eureka-host {
server eurake服務器IP:20303;
}
location /eureka {
proxy_pass http://eurake服務器IP:20303;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location /eureka/js/wro.js {
proxy_pass http://eureka-host/eureka/js/wro.js;
}
location /eureka/css/wro.css {
proxy_pass http://eureka-host/eureka/css/wro.css;
}
location /eureka/images/spring-logo-eureka.png {
proxy_pass http://eureka-host/eureka/images/spring-logo-eureka.png;
}
location /eureka/fonts/montserrat-webfont.woff {
proxy_pass http://eureka-host/eureka/fonts/montserrat-webfont.woff;
}
location /eureka/fonts/varela_round-webfont.woff {
proxy_pass http://eureka-host/eureka/fonts/varela_round-webfont.woff;
}
location /eureka/fonts/montserrat-webfont.ttf {
proxy_pass http://eureka-host/eureka/fonts/montserrat-webfont.ttf;
}
location /eureka/fonts/varela_round-webfont.ttf {
proxy_pass http://eureka-host/eureka/fonts/varela_round-webfont.ttf;
}
location ^~/eureka-state {
proxy_pass http://eureka-host/;
}
可通過http://代理IP:代理端口/eureka-state 訪問eurake web
其他服務訪問eurake,修改application-linkis.yml中eurake配置
defaultZone: http://代理IP:代理端口/eureka
linkis-mg-gateway 是 Linkis 的服務網關,所有的請求都會經由 gateway 來轉發到對應的服務上。
啟動服務器前,首先需要編輯 conf/linkis-mg-gateway.properties 配置文件,增加管理員用戶名和密碼,【用戶名需要與你當前登錄的機器用戶名保持一致?待驗證】。我配置為如下,用于dss登錄。
wds.linkis.admin.user=hadoop
wds.linkis.admin.password=123456
設置 linkis-mg-gateway的啟動Application:
服務名:
linkis-mg-gateway
啟動類:
org.apache.linkis.gateway.springcloud.LinkisGatewayApplication
VM參數:
-DserviceName=linkis-mg-gateway -Xbootclasspath/a\:D:\linkis\linkis-package\conf
啟動服務,可正常啟動,不過,在服務調用時,會報gatewayParsers空異常?
參考【關于linkis-spring-cloud-gateway 服務的空指針以及gatewayProperties無法賦值問題 · Issue #1086 · apache/linkis (github.com)】,做如下調整:
1.修改linkis-spring-cloud-gateway模塊下的pom.xml。添加如下內容,并修改reactor-netty包版本,重新import。(不先import,下面修改Project Structure的修改會丟失)。
<!-- only for debug -->
<dependency>
<groupId>io.projectreactor.netty</groupId>
<artifactId>reactor-netty</artifactId>
<!-- <version>0.9.7.RELEASE</version>-->
<version>0.9.20.RELEASE</version>
</dependency>
<dependency>
<groupId>org.apache.linkis</groupId>
<artifactId>linkis-pes-common</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.apache.linkis</groupId>
<artifactId>linkis-jobhistory</artifactId>
<version>${project.version}</version>
</dependency>
<!-- instance label -->
<dependency>
<groupId>org.apache.linkis</groupId>
<artifactId>linkis-instance-label-server</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
<!-- only for debug -->
2.打開Project Structrue,刪除linkis-engineplugin-openlookeng、linkis-eureka、linkis-metadata模塊下重復的Source Folders和Resource Folders。【沒有重復則跳過此步驟】。
3.linkis-spring-cloud-gateway模塊添加linkis-gateway-server-support-1.5.0-SNAPSHOT.jar到classpath。
4.修改linkis-mg-gateway.properties文件,在mybatis包掃描配置中添加jobhistory模塊bean和entity包掃描。
5.保存設置,重新啟動linkis-mg-gateway服務。調試gatewayParsers不為null。
publicservice 是 Linkis 的公共增強服務,為其他微服務模塊提供統一配置管理、上下文服務、物料庫、數據源管理、微服務管理和歷史任務查詢等功能的模塊。
設置linkis-ps-publicservice的啟動Application:
服務名:
linkis-ps-publicservice
啟動類:
org.apache.linkis.filesystem.LinkisPublicServiceApp
VM參數:
-DserviceName=linkis-ps-publicservice -Xbootclasspath/a\:D:\linkis\linkis-package\conf
如果需要物料上傳需求,做以下調整:
<!-- only for debug -->
<dependency>
<groupId>org.apache.linkis</groupId>
<artifactId>linkis-datasource-manager-server</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.apache.linkis</groupId>
<artifactId>linkis-bmlserver</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.apache.linkis</groupId>
<artifactId>linkis-metadata</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.apache.linkis</groupId>
<artifactId>linkis-cs-server</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.apache.linkis</groupId>
<artifactId>linkis-instance-label-server</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.apache.linkis</groupId>
<artifactId>linkis-udf-service</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.apache.linkis</groupId>
<artifactId>linkis-jobhistory</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.apache.linkis</groupId>
<artifactId>linkis-configuration</artifactId>
<version>${project.version}</version>
</dependency>
<!-- only for debug -->
服務名:
linkis-cg-linkismanager
啟動類:
org.apache.linkis.manager.LinkisManagerApplication
VM參數:
-DserviceName=linkis-cg-linkismanager -Xbootclasspath/a:D:\linkis\linkis-package\conf
修改linkis-cg-linkismanager.properties,配置wds.linkis.engineconn.home參數【需解壓linkis安裝包到指定目錄】
#wds.linkis.engineconn.home=/appcom/Install/LinkisInstall/lib/linkis-engineconn-plugins
#wds.linkis.engineconn.plugin.loader.store.path=/appcom/Install/LinkisInstall/lib/linkis-engineconn-plugins
wds.linkis.engineconn.home=D:\\linkis\\linkis-package\\lib\\linkis-engineconn-plugins
服務名:
linkis-cg-entrance
啟動類:
org.apache.linkis.entrance.LinkisEntranceApplication
VM參數:
-DserviceName=linkis-cg-entrance -Xbootclasspath/a:D:\linkis\linkis-package\conf
服務名:
linkis-cg-engineconnmanager
啟動類:
org.apache.linkis.ecm.server.LinkisECMApplication
VM參數:
-DserviceName=linkis-cg-engineconnmanager -Xbootclasspath/a:D:\linkis\linkis-package\conf
linkis-cg-engineconnmanager模塊調試暫只支持Mac OS 和 Linux系統?!究蓞⒖脊俜轿臋n調試 Debug 指引 | Apache Linkis進行遠程調試】
啟動控制臺可以看到如下異常:
start register ecm
RPC-Sender-Asyn-Thread-ListenerBus add a new listener=> class org.apache.linkis.rpc.BaseRPCSender$$anon$1
Flipping property: linkis-cg-linkismanager.ribbon.ActiveConnectionsLimit to use NEXT property: niws.loadbalancer.availabilityFilteringRule.activeConnectionsLimit=2147483647
Shutdown hook installed for: NFLoadBalancer-PingTimer-linkis-cg-linkismanager
Client: linkis-cg-linkismanager instantiated a LoadBalancer: DynamicServerListLoadBalancer:{NFLoadBalancer:name=linkis-cg-linkismanager,current list of Servers=[],Load balancer stats=Zone stats: {},Server stats: []}ServerList:null
Flipping property: linkis-cg-linkismanager.ribbon.ActiveConnectionsLimit to use NEXT property: niws.loadbalancer.availabilityFilteringRule.activeConnectionsLimit=2147483647
Start to linkis-ec-clear shell
Shell linkis-ec-clear.sh execution failed, msg:Cannot run program "sh": CreateProcess error=2, 系統找不到指定的文件。
End to linkis-ec-clear shell
Flipping property: linkis-cg-linkismanager.ribbon.ActiveConnectionsLimit to use NEXT property: niws.loadbalancer.availabilityFilteringRule.activeConnectionsLimit=2147483647
org.apache.linkis.ecm.server.service.impl.DefaultECMHealthService@251b3e8a changed status Starting=> Running.
ECM:ServiceInstance(linkis-cg-engineconnmanager, DIGITAL-MAYANJ:9102, 0) is ready
SpringCloudInstanceLabelClient app state ACCEPTING_TRAFFIC
SpringCloudInstanceLabelClient init
至此,查看eureka界面,查看服務列表:
新建數據庫dss,前后執行db目錄下的dss_ddl.sql、dss_dml.sql腳本文件
如果您是本地第一次使用,必須在最外層工程pom.xml所在目錄先執行以下命令:
mvn -N install
在最外層工程pom.xml所在目錄執行以下命令
mvn clean install -DskipTests
在 DSS 源碼文件夾下,子目錄conf 中,是 dss 的一些默認配置文件,將配置文件復制到自己的配置文件目錄,如D:\dss\dss-1.1.2\conf
增加日志輸出到控制臺的配置,修改內容如下:
<configuration status="error" monitorInterval="30">
<appenders>
<Console name="Console" target="SYSTEM_OUT">
<ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%t] %logger{36} %L %M - %msg%xEx%n"/>
</Console>
</appenders>
<loggers>
<root level="INFO">
<appender-ref ref="Console"/>
</root>
</loggers>
</configuration>
服務名:
dss-server
啟動類:
com.webank.wedatasphere.dss.DSSServerApplication
VM參數:
-DserviceName=dss-framework-orchestrator-server -DDSS\_HOME=D:\\dss\\dss-1.1.2 -Xbootclasspath/a\:D:\\dss\\dss-1.1.2\\conf
修改dss-server模塊下的pom.xml,添加如下內容:
<!-- only for debug -->
<dependency>
<groupId>org.apache.linkis</groupId>
<artifactId>linkis-rpc</artifactId>
<version>${linkis.version}</version>
</dependency>
<dependency>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
<groupId>org.springframework.cloud</groupId>
<version>${spring.cloud.version}</version>
</dependency>
<dependency>
<groupId>com.webank.wedatasphere.dss</groupId>
<artifactId>dss-sender-service</artifactId>
<version>${dss.version}</version>
</dependency>
<dependency>
<groupId>com.squareup.okio</groupId>
<artifactId>okio</artifactId>
<version>2.2.2</version>
<scope>compile</scope>
</dependency>
<!-- only for debug -->
由于dss-server啟動,com.webank.wedatasphere.dss.common.utils.ZipHelper會使用到zip命令,需要安裝zip和unzip命令【下載地址zip and unzip for the windows command line (stahlworks.com)】,直接下載安裝即可。
修改com.webank.wedatasphere.dss.common.utils.ZipHelper 源碼。將源碼中String[] strArr=dirPath.split(File.separator);修改為如下代碼:
String[] strArr=null;
if (FsPath.WINDOWS) {
strArr=dirPath.split("\\" + File.separator);
} else {
strArr=dirPath.split(File.separator);
}
修改linkis項目中org.apache.linkis.storage.fs.impl.LocalFileSystem源碼:
@Override
public boolean create(String dest) throws IOException {
LOG.info("try to create file with path:" + dest);
File file=new File(dest);
if (!FsPath.WINDOWS && !isOwner(file.getParent())) {
throw new IOException("you have no permission to create file " + dest);
}
try {
boolean created=file.createNewFile();
if (created && !FsPath.WINDOWS) {
setPermission(new FsPath(dest), this.getDefaultFilePerm());
if (!user.equals(getOwner(dest))) {
setOwner(new FsPath(dest), user, null);
}
}
return created;
} catch (Throwable e) {
file.delete();
if (e instanceof IOException) {
throw (IOException) e;
} else {
throw new IOException(e);
}
}
}
服務名:
dss-apps-server
啟動類:
com.webank.wedatasphere.dss.apps.DSSAppsServerApplication
VM參數:
-DserviceName=dss-apps-server -DDSS\_HOME=D:\\dss\\dss-1.1.2 -Xbootclasspath/a\:D:\\dss\\dss-1.1.2\\conf
修改dss-server模塊下的pom.xml,添加如下內容:
<!-- only for debug -->
<dependency>
<groupId>org.apache.linkis</groupId>
<artifactId>linkis-rpc</artifactId>
<version>${linkis.version}</version>
</dependency>
<dependency>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
<groupId>org.springframework.cloud</groupId>
<version>${spring.cloud.version}</version>
</dependency>
<dependency>
<groupId>com.webank.wedatasphere.dss</groupId>
<artifactId>dss-sender-service</artifactId>
<version>${dss.version}</version>
</dependency>
<dependency>
<groupId>com.squareup.okio</groupId>
<artifactId>okio</artifactId>
<version>2.2.2</version>
<scope>compile</scope>
</dependency>
<!-- only for debug -->
至此,查看eurake服務列表:
參考【DataSphereStudio-Doc/zh_CN/開發文檔/前端編譯文檔.md at main · WeDataSphere/DataSphereStudio-Doc (github.com)】
本地編譯node版本為16.15.1 ,learna版本為 6.4.0
編譯啟動,瀏覽器打開http://localhost:8080。使用1.4.2中配置的用戶名和密碼登錄。
本文中調試過程基于linkis和DSS的master分支,由于社區活躍,代碼變化頻繁,部分內容會有一些出入,可按需和調試日志做適當調整。還有很多功能沒有進行調試,如任務創建、執行等,各種appcon集成等。