GaussDB(DWS)《通過JDBC,實現遠程COPY導入數據到DWS》
通過JDBC,實現遠程COPY導入數據到DWS
1???? ??前言
DWS云數倉的用戶,因為業務需要或者進行如TPC-DS等模型性能摸底時。存在從文件導入大量數據到DWS,或從DWS導出數據到ECS上的數據文件的使用需求。DWS云數倉支持JDBC的遠程連接,并且管理界面提供DWS數倉對應JDBC驅動的下載。用戶僅需下載對應DWS版本的驅動,和java源碼同時上傳到ECS,進行編譯打包后,即可通過JDBC實現COPY導入或者導出。如果用shell對JDBC調用進行二次封裝,可以更進一步簡化使用步驟,降低維護成本。
當然,JDBC接口不限于COPY的執行,任何DWS支持的sql語法都可執行。本文以最常用的COPY作為實例,詳細描述JDBC使用每一步的實現和注意事項。
長篇大論前,先給出整體思路的流程圖,讓大家擁有共同的邏輯基礎,方便對后續環節的理解。
2?? ??必要文件上傳ECS,及ECS上JAVA JDK檢查
2.1????? 上傳必要文件到ECS目錄
root用戶在ECS創建目錄dws_copy, mkdir /data1/dws_copy
root用戶上傳java源碼和JDBC驅動jar包到ECS的/data1/dws_copy目錄
Copy.java源碼如下,
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import org.postgresql.copy.CopyManager;
import org.postgresql.core.BaseConnection;
public class Copy {
public Copy() {
}
public static void main(String[] args) {
if (args.length != 9) {
System.out.println("arguments number is not right");
System.out.println("we need hostname port user password in|out database table file delimiter");
} else {
String hostname = args[0];
String port = args[1];
String username = args[2];
String password = args[3];
String action = args[4];
String dataBase = args[5];
String tableName = args[6];
String file = args[7];
String delimiter = args[8];
String urls = new String("jdbc:postgresql://" + hostname + ":" + port + "/" + dataBase);
String driver = "org.postgresql.Driver";
Connection conn = null;
try {
Class.forName(driver);
conn = DriverManager.getConnection(urls, username, password);
} catch (ClassNotFoundException var18) {
var18.printStackTrace(System.out);
} catch (SQLException var19) {
var19.getSQLState();
var19.printStackTrace(System.out);
}
if (action.equals("out")) {
try {
copyToFile(conn, file, tableName, delimiter);
} catch (SQLException var16) {
var16.printStackTrace();
} catch (IOException var17) {
var17.printStackTrace();
}
} else if (action.equals("in")) {
try {
copyFromFile(conn, file, tableName, delimiter);
} catch (SQLException var14) {
var14.printStackTrace();
} catch (IOException var15) {
var15.printStackTrace();
}
} else {
System.out.println("please input the corrent action ,in or out");
}
}
}
public static void copyFromFile(Connection connection, String filePath, String tableName, String delimiter) throws SQLException, IOException {
FileInputStream fileInputStream = null;
try {
CopyManager copyManager = new CopyManager((BaseConnection)connection);
fileInputStream = new FileInputStream(filePath);
copyManager.copyIn("COPY " + tableName + " FROM STDIN DELIMITER '" + delimiter + "'", fileInputStream);
} finally {
if (fileInputStream != null) {
try {
fileInputStream.close();
} catch (IOException var11) {
var11.printStackTrace();
}
}
}
}
public static void copyToFile(Connection connection, String filePath, String tableOrQuery, String delimiter) throws SQLException, IOException {
FileOutputStream fileOutputStream = null;
try {
CopyManager copyManager = new CopyManager((BaseConnection)connection);
fileOutputStream = new FileOutputStream(filePath);
copyManager.copyOut("COPY " + tableOrQuery + " TO STDOUT DELIMITER '" + delimiter + "'", fileOutputStream);
} finally {
if (fileOutputStream != null) {
try {
fileOutputStream.close();
} catch (IOException var11) {
var11.printStackTrace();
}
}
}
}
}
注1:代碼中,String urls = new String("jdbc:postgresql://" + hostname + ":" + port + "/" + dataBase) 代碼段
是DWS集群的JDBC連接字符串,可以從管理面的集群連接頁獲取具體對應的字符串;
注2:以上代碼主要包括參數校驗和copy功能實現兩部分,更多開發信息,請參考華為云官網文檔JDBC開發章節,https://support.huaweicloud.com/devg2-dws/dws_0402_0065.html;
創建目錄/data1/data_file,上傳或生成用于copy的數據文件
2.2????? 檢查部署ECS java jdk
root用戶,在ECS上執行java –version;javac –version;jar –version;
檢查java JDK
若有缺少的JDK組件,請自行下載部署
3?? ??制作可執行jar包并進行shell二次封裝
進入/data1/dws_copy目錄,編譯java源碼,javac Copy.class –cp driver.jar
進入/data1/dws_copy目錄,打包java源碼為jar包,
2.1,編寫保存manifest文件:
Manifest-Version: 1.0
Main-Class: Copy
Class-Path: [JDBC驅動jar包名稱]
注:manifest文件中, ’:’后有一個空格
生成jar包jar, jar cvfm Copy.jar manifest ./Copy.class ./manifest
java –jar執行時,需要大量的入參,命令長且不易維護。固使用shell對java –jar命令執行進行二次封裝,達到簡化執行和維護的目的(入參寫到到配置文件讀取執行)。
示例shell腳本run_jdbc_copy.sh代碼如下,主要用于單表或多表并發COPY ECS上本地文件的數據到DWS集群內的表中,用戶可以根據自己的需求,自行設計
#!/bin/bash
script_path=$(cd `dirname
script_path=$(cd `dirname $0`;pwd)
`;pwd)source ${script_path}/jdbc_copy.conf
function usage()
{
echo "This srcipt is used to copy tpch/tpcds data to remote database.Before running the script,u must configured the file: jdbc_copy.conf."
echo -e " "
echo "u can run the script as following:"
echo -e " "
echo "? 1.copy data in batch mode: sh run_jdbc_copy.sh batch"
echo -e " "
echo "? 2.copy data in single mode: sh run_jdbc_copy.sh single [tablename]"
}
function batch_copy()
{
echo "[INFO]: Batch mode copying data to ${remote_ip} database ${db_name} by JDBC started."
for t in `cat ${table_list}`
do
table_name=`echo "${t}"|awk -F '.' {'print'}`
echo "[INFO]: Copying data to ${table_name}."
java -jar ${script_path}/Copy.jar ${remote_ip} ${db_port} ${db_user} ${user_passwd} in ${db_name} ${table_name} ${data_abs_path}/${t} "|" > /dev/null 2>&1
if [ $? -eq 0 ]
then? echo "[INFO]: Successfully copied data to ${table_name}."
else
echo "[WARNIG]: Something unexpected happened.plz using single mode to check."
fi
done
echo "[INFO]: Batch mode copyed data to ${remote_ip} database ${db_name} by JDBC done."
}
function single_copy()
{
echo "[INFO]: Single mode copying data to ${remote_ip} database ${db_name} by JDBC started."
java -jar ${script_path}/Copy.jar ${remote_ip} ${db_port} ${db_user} ${user_passwd} in ${db_name} ${data_abs_path}/.* "|"
echo "[INFO]: Single mode copyed data to done."
}
case in
batch)batch_copy;;
single)single_copy ;;
*)echo "[ERROR]: Invalid para.";usage;;
esac
注:其中jdbc_copy.conf配置文件,內容如下:
remote_ip=192.168.xxx.xxx? (dws集群連接域名或內網IP)
db_port=8000? (C連接端口號)
db_user=user? (數據庫用戶)
user_passwd=passwd? (數據庫用戶密碼)
db_name=gaussdb? (連接的目標數據庫名稱)
data_abs_path=/data1/data_file/? (Copy from數據文件的本地路徑)
delimiter="|"? (讀取數據文件的分隔符)
table_list="/data1/dws_copy/table.lst"? (要執行copy的目標表清單,格式為每行schema.tablename)
4?? ??執行shell,通過JDCB實現COPY功能
4.1????? 執行shell,實現從ECS對DWS集群的Copy操作
root用戶,
cd /data1/dws_copy;
copy數據到單張表:
sh run_jdbc_copy.sh single_copy ss.col_t
copy數據到多張表:
添加如下到/data1/dws_copy/table.lst,
ss.t1
ss.t2
ss.t3
保存后執行,
sh run_jdbc_copy.sh batch_copy
EI企業智能 Gauss AP JDBC 數據倉庫服務 GaussDB(DWS)
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。