Java 如何遠程調用 SPL 腳本

《Java 如何調用 SPL 腳本》中咱們介紹了在 Java 中能夠部署集算器 JDBC 來調用本地 SPL 腳本,那如何能在 Java 中遠程調用 SPL 腳本呢?這就是接下來要說的重點!html

實現思路經過下圖一目瞭然:java

1png

部署服務器

服務器是運行在 Java 平臺上面向分析型的高性能數據庫,做爲高性能計算數據倉庫,服務器能夠在離線跑批、在線查詢、多維分析和內存計算等方面提供高效的計算輸出,幫助用戶解決計算中的多種問題。node

下面咱們先來了解一下服務器的使用及配置,更多關於服務器的介紹可參考集算器在線文檔《教程》服務器小節。c++

1. 服務器配置

在集算器安裝目錄的 esProc\bin 路徑下,能夠找到 esprocs.exe 文件,能夠直接運行它來啓動或配置服務器。使用 esprocs 時,會自動在安裝路徑下加載所需的 jar 包,可是須要注意此時使用的配置文件 raqsoftConfig.xml 和 unitServer.xml 必須放置在集算器安裝目錄的 esProc\config 路徑下。運行後,打開窗口以下:web

1png

在 esprocs.exe 執行時,窗口中會顯示加載初始設定的信息,這些設定其實是由配置文件 raqsoftConfig.xml 決定的。在右側的菜單欄中點擊 Options,能夠配置服務器的相關信息,點擊後彈出服務器配置窗口以下:數據庫

2png

在頁面中,能夠配置受權文件、主路徑、尋址路徑、日期時間格式、默認字符編碼、日誌等級、文件緩存區字節數等信息。api

下面咱們繼續來了解服務器的配置,在右側的菜單欄中點擊 Config,能夠配置分機的相關信息,點擊後在 Unit 頁面中能夠配置分機信息,以下:緩存

3png

Temp file timeout 設定臨時文件的生命週期小時數;Check interval 必須設定爲正值或 0,爲檢查過時的間隔秒數;Proxy timeout 爲代理生命週期,即遠程遊標、任務空間的生命小時數。若是 Temp file timeout 或者 Proxy timeout 設定爲 0,則不檢查過時。服務器

分機列表 Host list 中,能夠配置本機上全部可能用來運行服務器的分機,配置它們的 IP 地址,在進程列表 Process list 中,能夠爲一個 IP 地址配置多個進程的端口 Port,其中第一個爲主進程。服務器啓動時,會自動在分機列表中,尋找有空閒進程的分機,而後再由分機將任務交由某個進程執行。須要注意的是,IP 地址須要是本機的真實 IP,在使用多網卡的狀況下能夠設定多個 IP。dom

分機配置中,Max task number 是該分機容許執行的最大做業數,而 Preferred task number 是該分機的適合做業數,當分機中使用了多個進程時,適合做業數就是分進程的總數。在 Partitions 一欄中,能夠選擇每一個分機上所使用的分區。

服務器的 Enable clients 頁面中能夠設定客戶端白名單,以下:

4png

選定 Check clients 後,能夠在 Clients hosts 列表中,設定容許調用服務器的 IP 地址白名單,不在設定範圍中的 IP 地址將沒法調用服務器執行計算。

服務器設定完成後,點擊 OK,此時能夠自動設定對應的配置文件 unitServer.xml 以下:

<?xml version="1.0" encoding="UTF-8"?>

<SERVER Version="3">

<TempTimeOut>12</TempTimeOut>

<Interval>1800</Interval>

<ProxyTimeOut>12</ProxyTimeOut>

<Hosts>

<Host ip="192.168.107.1" maxTaskNum="8" preferredTaskNum="3">

<Partitions>

<Partition name="0" path="d:/file/parallel/node1/0">

</Partition>

<Partition name="1" path="d:/file/parallel/node1/1">

</Partition>

</Partitions>

<Units>

<Unit port="8281">

</Unit>

<Unit port="8282">

</Unit>

</Units>

</Host>

</Hosts>

<EnabledClients check="true">

<Host start="192.168.107.1" end="192.168.107.1">

</Host>

</EnabledClients>

</SERVER><?xml version="1.0" encoding="UTF-8"?><SERVER Version="3"><TempTimeOut>12</TempTimeOut><Interval>1800</Interval><ProxyTimeOut>12</ProxyTimeOut><Hosts><Host ip="192.168.107.1" maxTaskNum="8" preferredTaskNum="3"><Partitions><Partition name="0" path="d:/file/parallel/node1/0"></Partition><Partition name="1" path="d:/file/parallel/node1/1"></Partition></Partitions><Units><Unit port="8281"></Unit><Unit port="8282"></Unit></Units></Host></Hosts><EnabledClients check="true"><Host start="192.168.107.1" end="192.168.107.1"></Host></EnabledClients></SERVER>

2. 運行服務器

服務器配置完成後,在分機運行窗口中,點擊 Start 便可開始運行服務器,須要中止服務能夠點擊 Stop,服務器中止後能夠點擊 Quit 退出。若是點擊 Reset,服務將初始化從新啓動,清除全部的全局變量以及內存區。

1png

在分機啓動時,設置的各個進程會同時啓動,能夠點擊 Main 查看分機主進程的執行狀況,或者點擊對應的端口號查看分機的其它分進程執行頁面。

在 Linux 系統中,能夠運行 ServerConsole.sh 來啓動服務器類:

2png

打開的分機運行窗口和在 Windows 下是相同的:

3png

此外,還能夠在執行命令時添加 -p 參數,非圖形啓動服務器,此時服務器將直接執行:

4png

部署集算器 JDBC

將啓動 JAVA 應用程序時加載集算器所需的 jar 包及配置文件放到項目中。須要注意的是,集算器 JDBC 所要求的 JDK 版本不得低於 1.6。

1. 加載驅動 jar

集算器 JDBC 相似一個不帶物理表的數據庫 JDBC 驅動,能夠把它簡單的當作是一個只有存儲過程的數據庫。另外,集算器 JDBC 是個徹底嵌入式計算引擎,已經在 JDBC 中完成了全部運算,不象數據庫那樣 JDBC 只是個接口,實際運算在獨立的數據庫服務器完成。

若是在 web 應用項目下,能夠把這些 jar 包放在 WEB-INF/lib 目錄下。集算器 JDBC 須要三個基礎 jar 包,均可以在 [安裝目錄]\esProc\lib 目錄下找到:

dm.jar //集算器計算引擎及JDBC驅動包

icu4j_3_4_5.jar //處理國際化

jdom.jar  //解析配置文件dm.jar //集算器計算引擎及JDBC驅動包icu4j_3_4_5.jar //處理國際化jdom.jar  //解析配置文件

除了以上的必需 jar,還有一些爲完成特定功能的 jar 包:

好比數據庫做爲數據源,那麼還須要相應數據庫的驅動 jar 包;
要讀寫 Office 文件,則須要加入 poi*.jar 和 xmlbeans.jar; 要使用繪製圖形功能,則須要加入 SVG 圖形處理相關的 jar 包,包括 batik*.jar、js.jar、pdf-transcoder.jar、xalan-2.6.0.jar、xercesImpl.jar、xml-apis.jar、xml-apis-ext.jar。

2. 部署 raqsoftConfig.xml

集算器還有個重要的配置文件 raqsoftConfig.xml,能夠在 [安裝目錄]\esProc\config 下找到,需複製後放置在應用項目的類路徑下,配置文件的名稱不可改變。

在 raqsoftConfig.xml 文件中,配置了受權信息、集算器主路徑、dfx 文件尋址路徑、JDBC 遠程訪問的服務器地址等各種信息。咱們先看下最基本的配置,即集算器受權文件和服務器地址的配置:

<?xml version="1.0" encoding=" UTF-8"?>  
<Config Version="2">  
 <Runtime>  
 <Esproc>  
    <!--集算器受權文件配置,能夠是絕對路徑,也能夠是相對路徑,使用相對路徑時是相對於類路徑-->  
    <license>esproc.xml</license>  
    <!--試用受權文件可從潤乾公司官網中下載-->  
 </Esproc>  
 </Runtime>  
<JDBC>  
<!--配置JDBC需遠程訪問的服務器地址-->  
<Units>  
<!--爲方便多機熱備,可配置多臺服務器地址,添加多個<Unit></Unit>節點-->  
<Unit>192.168.107.1:8281</Unit>  
</Units>                
 </JDBC>  
</Config><?xml version="1.0" encoding=" UTF-8"?>  <Config Version="2">   <Runtime>   <Esproc>      <!--集算器受權文件配置,能夠是絕對路徑,也能夠是相對路徑,使用相對路徑時是相對於類路徑-->      <license>esproc.xml</license>      <!--試用受權文件可從潤乾公司官網中下載-->   </Esproc>   </Runtime>  <JDBC>  <!--配置JDBC需遠程訪問的服務器地址-->  <Units>  <!--爲方便多機熱備,可配置多臺服務器地址,添加多個<Unit/>節點-->  <Unit>192.168.107.1:8281</Unit>  </Units>                
 </JDBC>  </Config>

Java 調用

接下來咱們以訪問服務器上的數據文件爲例,介紹如何在 Java 中遠程訪問服務器。

Java 經過 SPL 不只能夠訪問本地文件,還能遠程訪問服務器上的數據文件,其中包括 Txt、Excel、Json、Csv、Ctx 等多種類型的文件。

訪問時能夠經過絕對路徑查文件位置,也能夠經過相對路徑查找。這裏的絕對路徑和相對路徑都是會到服務器上去找。使用相對路徑時,則是相對於服務器中 raqsoftConfig.xml 配置文件中的主目錄,因此,首先咱們來配置下服務器上的主目錄:

在 raqsoftConfig.xml 文件的節點中添加如下節點:

<!--集算器主路徑,該路徑爲單一的絕對路徑-->

 <mainPath>D:\\mainFile</mainPath><!--集算器主路徑,該路徑爲單一的絕對路徑-->

 <mainPath>D:\\mainFile</mainPath>

咱們把要調用的文件 employee.txt 放到服務器的主目錄下面,Java 代碼以下:

public  void runSPL() throws ClassNotFoundException, SQLException{  
    Connection con = null;  
    PreparedStatement st;  
    ResultSet set ;  
    //創建鏈接  
    Class.forName("com.esproc.jdbc.InternalDriver");  
//onlyServer用於控制當前jdbc是否對服務器進行遠程計算,爲true表示遠程計算;false時表示本地計算  
//注意:屬性值爲false,當SPL語句使用call dfx或dfx時,會先使用本地計算,如未計算成功則會進行遠程計算  
    con= DriverManager.getConnection("jdbc:esproc:local://?onlyServer=true");  
    //直接執行SPL語句,返回結果集  
    st = (PreparedStatement)con.createStatement();  
    ResultSet rs = st.executeQuery("$select * from employee.txt");  
     
    //簡單處理結果集,將結果集中的字段名與數據輸出   
    ResultSetMetaData rsmd = rs.getMetaData();  
    int colCount = rsmd.getColumnCount();  
    for ( int  c = 1; c <= colCount;c++) {  
    String title = rsmd.getColumnName(c);  
    if( c > 1 ) {  
        System.out.print("\t");  
    }  
    else {  
        System.out.print("\n");  
    }  
        System.out.print(title);  
  }  
    while (rs.next()) {  
     for(int c = 1; c<= colCount; c++) {  
       if ( c > 1 ) {  
            System.out.print("\t");  
  }  
       else {  
            System.out.print("\n");  
  }  
     Object o = rs.getObject(c);  
     System.out.print(o.toString());  
  }  
  }  
   //關閉鏈接  
   if (con!=null) {  
        con.close();  
   }  
}public  void runSPL() throws ClassNotFoundException, SQLException{  
    Connection con = null;  
    PreparedStatement st;  
    ResultSet set ;  
    //創建鏈接      Class.forName("com.esproc.jdbc.InternalDriver");  
//onlyServer用於控制當前jdbc是否對服務器進行遠程計算,爲true表示遠程計算;false時表示本地計算  //注意:屬性值爲false,當SPL語句使用call dfx或dfx時,會先使用本地計算,如未計算成功則會進行遠程計算      con= DriverManager.getConnection("jdbc:esproc:local://?onlyServer=true");  
    //直接執行SPL語句,返回結果集      st = (PreparedStatement)con.createStatement();  
    ResultSet rs = st.executeQuery("$select * from employee.txt");  
     
    //簡單處理結果集,將結果集中的字段名與數據輸出       ResultSetMetaData rsmd = rs.getMetaData();  
    int colCount = rsmd.getColumnCount();  
    for ( int  c = 1; c <= colCount;c++) {  
    String title = rsmd.getColumnName(c);  
    if( c > 1 ) {  
        System.out.print("\t");  
    }  
    else {  
        System.out.print("\n");  
    }  
        System.out.print(title);  
  }  
    while (rs.next()) {  
     for(int c = 1; c<= colCount; c++) {  
       if ( c > 1 ) {  
            System.out.print("\t");  
  }  
       else {  
            System.out.print("\n");  
  }  
     Object o = rs.getObject(c);  
     System.out.print(o.toString());  
  }  
  }  
   //關閉鏈接     if (con!=null) {  
        con.close();  
   }  
}

執行結果:

1png

總結

經過上面的使用,相信您已經瞭解遠程訪問服務器的部署核心了吧,沒錯!Java 程序中調用服務器上的運算與調用本地的 SPL 運算操做步驟其實大致相同,總結下主要有以下三點區別:

1,部署服務器

2,JDBC 的 raqsoftConfig.xml 中添加服務器地址

3,在 JDBC 的 url 中添加 onlyServer 屬性,屬性值爲 true,始終訪問服務器進行遠程計算;屬性值爲 false,進行本地計算,但當 SPL 語句爲 call dfx 或 dfx 時,會先在本地計算,如未計算成功則會進行遠程計算

到此,對於遠程調用 SPL 腳本的介紹就完了,Java 中調用時更多 SPL 的用法可參見《Java 如何調用 SPL 腳本》這裏就再也不贅述了,固然,想要更深刻的學習 SPL 的小夥伴兒還能夠去官網上的在線教程中查看。

相關文章
相關標籤/搜索