新建工具類:
package com.lrhealth.mappingintegration.utils; import com.jcraft.jsch.Channel; import com.jcraft.jsch.ChannelExec; import com.jcraft.jsch.ChannelSftp; import com.jcraft.jsch.JSch; import com.jcraft.jsch.Session; import com.jcraft.jsch.UserInfo; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileStatus; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.FileUtil; import org.apache.hadoop.fs.Path; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import com.jcraft.jsch.ChannelExec; import org.springframework.web.multipart.MultipartFile; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.LineNumberReader; import java.io.OutputStream; import java.net.URI; import java.net.URISyntaxException; /** * ClassName: UDFUtils * Description: * * @author pangyq * date: 2021/9/17 14:12 */ @Component public class UDFUtils { public static String host; public static int port; public static String user; public static String password; @Value("${server.host}") public void setHost(String serverHost) { host = serverHost; } @Value("${server.user}") public void setUser(String serverUser) { user = serverUser; } @Value("${server.password}") public void setPassword(String serverPassword) { password = serverPassword; } @Value("${server.upport}") public void setPort(Integer serverPort) { port = serverPort; } private Session session; /** * 創建一個連接 */ private void initialSession() throws Exception { if (session == null) { JSch jsch = new JSch(); session = jsch.getSession(user, host, port); session.setUserInfo(new UserInfo() { @Override public String getPassphrase() { return null; } @Override public String getPassword() { return null; } @Override public boolean promptPassword(String arg0) { return false; } @Override public boolean promptPassphrase(String arg0) { return false; } @Override public boolean promptYesNo(String arg0) { return true; } @Override public void showMessage(String arg0) { } }); session.setPassword(password); session.connect(); } } /** * 上傳文件 * * @param localPath 本地路徑,若為空,表示當前路徑 * @param localFile 本地文件名,若為空或是“*”,表示目前下全部文件 * @param remotePath 遠程路徑,若為空,表示當前路徑,若服務器上無此目錄,則會自動創建 * @throws Exception */ public void putFile(String localPath, String localFile, String remotePath) throws Exception { ChannelExec openChannel = null; this.initialSession(); Channel channelSftp = session.openChannel("sftp"); channelSftp.connect(); ChannelSftp c = (ChannelSftp) channelSftp; String remoteFile = null; if (remotePath != null && remotePath.trim().length() > 0) { try { c.mkdir(remotePath); } catch (Exception e) { } remoteFile = remotePath + "/."; } else { remoteFile = "."; } String file = null; if (localFile == null || localFile.trim().length() == 0) { file = "*"; } else { file = localFile; } if (localPath != null && localPath.trim().length() > 0) { if (localPath.endsWith("/")) { file = localPath + file; } else { file = localPath + "/" + file; } } c.put(file, remoteFile); //把jar包放到hdfs目錄 openChannel = (ChannelExec) session.openChannel("exec"); openChannel.setCommand("su - hdfs"); openChannel.setCommand("hdfs dfs -put " + remotePath + localFile + " /udfjar"); int exitStatus = openChannel.getExitStatus(); openChannel.connect(); channelSftp.disconnect(); }
}
配置文件:
#服務器信息 server.host=服務器IP地址 server.upport=端口號 server.user=用戶 server.password=密碼
控制層:
自己根據需要寫,我把內容掏空了嘿嘿!
@PostMapping("/createFuction")
public ResponseResult createFuction(參數自己寫吧,我方的實體類@RequestbodyTmpDbUploadJarDTO tmpDbUploadJarDTO
) throws IOException {
try {
boolean uploadUDF = tmpDbInfoService.uploadUDF(tmpDbUploadJarDTO);
if (uploadUDF == true) {
// tmpDbInfoService.addJarToHive(tmpDbUploadJarDTO);
// tmpDbInfoService.makeFunction(tmpDbUploadJarDTO);
}
} catch (Exception e) {
return ResponseResult.createErrorResponse("創建失敗");
}
return ResponseResult.createSuccessResponse("創建成功");
}
postman測試:
{ // "localPath":"E:\\UDFutil", // "localFile":"UDF-tolower0922test.jar", // "remotePath":"/root/zgw/hive/udf/", "functionName":"toLower", "classPath":"" }
好了,拿去用吧,這個需要本地文件路徑,本地文件名,遠程服務器路徑,等下發個我正使用的版本!