目錄
?
文件傳輸步驟
windows的本機文件傳輸
linux的虛擬機文件傳輸
?
?
文件傳輸步驟
建立連接
在connect2HDFS()方法中,通過設置Configuration對象來指定HDFS的URI(在這個例子中為hdfs://192.168.12.133:9000),并初始化一個FileSystem實例fs,用于后續的所有HDFS操作。
關閉連接
close()方法用于在完成所有HDFS操作后關閉與HDFS的連接,確保資源被正確釋放。
上傳文件并分類 (uploadAndClassify(File file)):方法接收一個本地文件作為參數。
將本地文件上傳到HDFS上的相應目錄中。
業務邏輯
該方法接受一個字符串類型的目錄路徑作為參數,將其轉換為Path對象,并檢查該路徑是否已存在。如果不存在,則創建新的目錄。
主函數執行
首先調用connect2HDFS()方法與HDFS建立連接。指定一個本地目錄(在這個例子中是/home/covid_data),然后遍歷這個目錄下的所有.json文件。對每個符合條件的文件調用uploadAndClassify(File file)方法進行處理。
package hdfs.demo;import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;import java.io.File;
import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;public class HDFSApiDemo {private static FileSystem fs = null;// 用于和HDFS建立連接public static void connect2HDFS() throws IOException {Configuration conf = new Configuration();conf.set("fs.defaultFS","hdfs://192.168.12.133:9000");// 顯式指定本地文件系統的實現類conf.set("fs.file.impl", "org.apache.hadoop.fs.LocalFileSystem");System.out.println("111");fs = FileSystem.get(conf);}// 關閉客戶端和HDFS的連接public static void close(){if(fs != null){try{fs.close();} catch (IOException e){e.printStackTrace();}}}/*** 上傳文件并分類* @param file* @throws IOException*/public static void uploadAndClassify(File file) throws IOException {// 提取所有漢字作為省份名稱Pattern pattern = Pattern.compile("([\\p{IsHan}]+).*\\.json");// 匹配所有漢字Matcher matcher = pattern.matcher(file.getName());// 匹配漢字成功if (matcher.find()) {String province = matcher.group(1); // 獲取所有漢字組成的字符串String targetDir = "/covid_data/" + province + "/"; // 使用全部漢字作為目錄名String fileName = file.getName();System.out.println("Processing file: " + fileName);// 創建省份目錄(如果不存在)mkdir(targetDir);// HDFS目的路徑Path dst = new Path(targetDir + fileName);// 上傳文件fs.copyFromLocalFile(new Path(file.getAbsolutePath()), dst);System.out.println("Uploaded: " + fileName + " to " + targetDir);} else {System.out.println("File does not match the expected pattern: " + file.getName());}}// 重載mkdir()方法,支持String類型參數public static void mkdir(String dir) throws IOException {Path path = new Path(dir);if (!fs.exists(path)) {fs.mkdirs(path); // 創建目錄}}public static void main(String[] args) throws IOException {try {connect2HDFS();// 虛擬機上的本地目錄File localDir = new File("/home/covid_data");// 遍歷目錄下的所有文件for (File file : localDir.listFiles()) {if (file.isFile() && file.getName().endsWith(".json")) {uploadAndClassify(file);}}close();} catch (IOException e) {e.printStackTrace();}}}
windows的本機文件傳輸
對于上述代碼只需要更改上傳路徑即可
遭遇問題1:端口無法訪問
// 第一步 cd /usr/local/hadoop(安裝路徑)
// 第二步 ?vi ./etc/hadoop/hdfs-site.xml
// 第三步 加入下列配置 目的:讓NameNode監聽所有網絡接口上的9000端口
<property>
? ? <name>dfs.namenode.rpc-bind-host</name>
? ? <value>0.0.0.0</value>
</property>
// 第四步 讓配置生效?
? ?先關閉HDFS命令 ? ? ?./sbin/stop-dfs.sh
? ?在重啟HDFS命令 ? ? ?./sbin/start-dfs.sh
遭遇問題2:用戶權限不足
// 改變hadoop用戶權限 這會將/data目錄的權限設置為rwxrwxrwx,允許所有用戶讀寫執行
// hdfs dfs -chmod 777 /data
linux的虛擬機文件傳輸
遭遇問題1:無法找到主類
<!-- ?添加maven-shade-plugin插件 -->
? ? ? ? ? ? <plugin>
? ? ? ? ? ? ? ? <groupId>org.apache.maven.plugins</groupId>
? ? ? ? ? ? ? ? <artifactId>maven-shade-plugin</artifactId>
? ? ? ? ? ? ? ? <version>3.2.4</version>
? ? ? ? ? ? ? ? <executions>
? ? ? ? ? ? ? ? ? ? <execution>
? ? ? ? ? ? ? ? ? ? ? ? <phase>package</phase>
? ? ? ? ? ? ? ? ? ? ? ? <goals>
? ? ? ? ? ? ? ? ? ? ? ? ? ? <goal>shade</goal>
? ? ? ? ? ? ? ? ? ? ? ? </goals>
? ? ? ? ? ? ? ? ? ? ? ? <configuration>
? ? ? ? ? ? ? ? ? ? ? ? ? ? <transformers>
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <mainClass>hdfs.demo.HDFSApiDemo</mainClass>
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? </transformer>
? ? ? ? ? ? ? ? ? ? ? ? ? ? </transformers>
? ? ? ? ? ? ? ? ? ? ? ? </configuration>
? ? ? ? ? ? ? ? ? ? </execution>
? ? ? ? ? ? ? ? </executions>
? ? ? ? ? ? </plugin>
// 這段Maven配置的作用是使用maven-shade-plugin插件在打包階段創建一個包含所有依賴的可執行JAR文件,并指定hdfs.demo.HDFSApiDemo作為JAR文件的主類(即包含main方法的入口類)
遭遇問題1:Hadoop嘗試使用file:// URI方案時找不到對應的文件系統實現
// 顯式指定本地文件系統的實現類
conf.set("fs.file.impl", "org.apache.hadoop.fs.LocalFileSystem");
?