HDFS Java API的使用舉例

来源:http://www.cnblogs.com/huanongying/archive/2017/06/21/7061882.html
-Advertisement-
Play Games

HDFS是Hadoop應用程式使用的主要分散式存儲。HDFS集群主要由管理文件系統元數據的NameNode和存儲實際數據的DataNodes組成,HDFS架構圖描述了NameNode,DataNode和客戶端之間的基本交互。客戶端聯繫NameNode進行文件元數據或文件修改,並直接使用DataNod ...


  HDFS是Hadoop應用程式使用的主要分散式存儲。HDFS集群主要由管理文件系統元數據的NameNode和存儲實際數據的DataNodes組成,HDFS架構圖描述了NameNode,DataNode和客戶端之間的基本交互。客戶端聯繫NameNode進行文件元數據或文件修改,並直接使用DataNodes執行實際的文件I / O。

  Hadoop支持shell命令直接與HDFS進行交互,同時也支持JAVA API對HDFS的操作,例如,文件的創建、刪除、上傳、下載、重命名等。

  HDFS中的文件操作主要涉及以下幾個類:

    Configuration:提供對配置參數的訪問

    FileSystem:文件系統對象

    Path:在FileSystem中命名文件或目錄。 路徑字元串使用斜杠作為目錄分隔符。 如果以斜線開始,路徑字元串是絕對的

    FSDataInputStream和FSDataOutputStream:這兩個類分別是HDFS中的輸入和輸出流

 

下麵是JAVA API對HDFS的操作過程:

1.項目結構

 

 

2.pom.xml配置

 1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 2     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 3     <modelVersion>4.0.0</modelVersion>
 4 
 5     <groupId>com.zjl</groupId>
 6     <artifactId>myhadoop</artifactId>
 7     <version>0.0.1-SNAPSHOT</version>
 8     <packaging>jar</packaging>
 9 
10     <name>myhadoop</name>
11     <url>http://maven.apache.org</url>
12 
13     <properties>
14         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
15         <hadoop.version>2.5.0</hadoop.version>
16     </properties>
17 
18     <dependencies>
19         <dependency>
20             <groupId>org.apache.hadoop</groupId>
21             <artifactId>hadoop-client</artifactId>
22             <version>${hadoop.version}</version>
23         </dependency>
24         <dependency>
25             <groupId>junit</groupId>
26             <artifactId>junit</artifactId>
27             <version>3.8.1</version>
28         </dependency>
29     </dependencies>
30 </project>
View Code

3.拷貝hadoop安裝目錄下與HDFS相關的配置(core-site.xml,hdfs-site.xml,log4j.properties)到resource目錄下

1 [hadoop@hadoop01 ~]$ cd /opt/modules/hadoop-2.6.5/etc/hadoop/
2 [hadoop@hadoop01 hadoop]$ cp core-site.xml hdfs-site.xml log4j.properties /opt/tools/workspace/myhadoop/src/main/resource/
3 [hadoop@hadoop01 hadoop]$
View Code

(1)core-site.xml

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
 3 <!--
 4   Licensed under the Apache License, Version 2.0 (the "License");
 5   you may not use this file except in compliance with the License.
 6   You may obtain a copy of the License at
 7 
 8     http://www.apache.org/licenses/LICENSE-2.0
 9 
10   Unless required by applicable law or agreed to in writing, software
11   distributed under the License is distributed on an "AS IS" BASIS,
12   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   See the License for the specific language governing permissions and
14   limitations under the License. See accompanying LICENSE file.
15 -->
16 
17 <!-- Put site-specific property overrides in this file. -->
18 
19 <configuration>
20     <property>
21         <name>fs.defaultFS</name>
22         <!-- 如果沒有配置,預設會從本地文件系統讀取數據 -->
23         <value>hdfs://hadoop01.zjl.com:9000</value>
24     </property>
25     <property>
26         <name>hadoop.tmp.dir</name>
27         <!-- hadoop文件系統依賴的基礎配置,很多路徑都依賴它。如果hdfs-site.xml中不配置namenode和datanode的存放位置,預設就放在這個路徑中 -->
28         <value>/opt/modules/hadoop-2.6.5/data/tmp</value>
29     </property>
30 </configuration>
View Code

(2)hdfs-site.xml

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
 3 <!--
 4   Licensed under the Apache License, Version 2.0 (the "License");
 5   you may not use this file except in compliance with the License.
 6   You may obtain a copy of the License at
 7 
 8     http://www.apache.org/licenses/LICENSE-2.0
 9 
10   Unless required by applicable law or agreed to in writing, software
11   distributed under the License is distributed on an "AS IS" BASIS,
12   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   See the License for the specific language governing permissions and
14   limitations under the License. See accompanying LICENSE file.
15 -->
16 
17 <!-- Put site-specific property overrides in this file. -->
18 
19 <configuration>
20     <property>
21         <!-- default value 3 -->
22         <name>dfs.replication</name>
23         <value>1</value>
24     </property>
25 </configuration>
View Code

(3)採用預設即可,列印hadoop的日誌信息所需的配置文件。如果不配置,運行程式時eclipse控制台會提示警告

4.啟動hadoop的hdfs的守護進程,併在hdfs文件系統中創建文件(文件共步驟5中java程式讀取)

 1 [hadoop@hadoop01 hadoop]$ cd /opt/modules/hadoop-2.6.5/
 2 [hadoop@hadoop01 hadoop-2.6.5]$ sbin/start-dfs.sh
 3 17/06/21 22:59:32 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
 4 Starting namenodes on [hadoop01.zjl.com]
 5 hadoop01.zjl.com: starting namenode, logging to /opt/modules/hadoop-2.6.5/logs/hadoop-hadoop-namenode-hadoop01.zjl.com.out
 6 hadoop01.zjl.com: starting datanode, logging to /opt/modules/hadoop-2.6.5/logs/hadoop-hadoop-datanode-hadoop01.zjl.com.out
 7 Starting secondary namenodes [0.0.0.0]
 8 0.0.0.0: starting secondarynamenode, logging to /opt/modules/hadoop-2.6.5/logs/hadoop-hadoop-secondarynamenode-hadoop01.zjl.com.out
 9 17/06/21 23:00:06 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
10 [hadoop@hadoop01 hadoop-2.6.5]$ jps
11 3987 NameNode
12 4377 Jps
13 4265 SecondaryNameNode
14 4076 DataNode
15 3135 org.eclipse.equinox.launcher_1.3.201.v20161025-1711.jar
16 [hadoop@hadoop01 hadoop-2.6.5]$ bin/hdfs dfs -mkdir -p /user/hadoop/mapreduce/wordcount/input
17 17/06/21 23:07:21 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
18 [hadoop@hadoop01 hadoop-2.6.5]$ cat wcinput/wc.input 
19 hadoop yarn
20 hadoop mapreduce
21 hadoop hdfs
22 yarn nodemanager
23 hadoop resourcemanager
24 [hadoop@hadoop01 hadoop-2.6.5]$ bin/hdfs dfs -put wcinput/wc.input /user/hadoop/mapreduce/wordcount/input/
25 17/06/21 23:20:40 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
26 [hadoop@hadoop01 hadoop-2.6.5]$
View Code

5.java代碼

 1 package com.zjl.myhadoop;
 2 
 3 import java.io.File;
 4 import java.io.FileInputStream;
 5 
 6 import org.apache.hadoop.conf.Configuration;
 7 import org.apache.hadoop.fs.FSDataInputStream;
 8 import org.apache.hadoop.fs.FSDataOutputStream;
 9 import org.apache.hadoop.fs.FileSystem;
10 import org.apache.hadoop.fs.Path;
11 import org.apache.hadoop.io.IOUtils;
12 
13 /**
14  * 
15  * @author hadoop
16  *
17  */
18 public class HdfsApp {
19     
20     /**
21      * get file system
22      * @return
23      * @throws Exception
24      */
25     public static FileSystem getFileSystem() throws Exception{
26         //read configuration
27         //core-site.xml,core-default-site.xml,hdfs-site.xml,hdfs-default-site.xml
28         Configuration conf = new Configuration();
29         //create file system
30         FileSystem fileSystem = FileSystem.get(conf);
31         return fileSystem;
32     }
33     
34     /**
35      * read file from hdfs file system,output to the console
36      * @param fileName
37      * @throws Exception
38      */
39     public static void read(String fileName) throws Exception {
40         //read path
41         Path readPath = new Path(fileName);
42         //get file system
43         FileSystem fileSystem = getFileSystem();
44         //open file
45         FSDataInputStream inStream = fileSystem.open(readPath);
46         try{
47             //read file
48             IOUtils.copyBytes(inStream, System.out, 4096, false);
49         }catch (Exception e) {
50             e.printStackTrace();
51         }finally {
52             //io close
53             IOUtils.closeStream(inStream);
54         }
55     }
56     
57     public static void upload(String inFileName, String outFileName) throws Exception {
58         
59         //file input stream,local file
60         FileInputStream inStream = new FileInputStream(new File(inFileName));
61         
62         //get file system
63         FileSystem fileSystem = getFileSystem();
64         //write path,hdfs file system
65         Path writePath = new Path(outFileName);
66         
67         //output stream
68         FSDataOutputStream outStream = fileSystem.create(writePath);
69         try{
70             //write file
71             IOUtils.copyBytes(inStream, outStream, 4096, false);
72         }catch (Exception e) {
73             e.printStackTrace();
74         }finally {
75             //io close
76             IOUtils.closeStream(inStream);
77             IOUtils.closeStream(outStream);
78         }
79     }
80     public static void main( String[] args ) throws Exception {
81         //1.read file from hdfs to console
82 //        String fileName = "/user/hadoop/mapreduce/wordcount/input/wc.input";
83 //        read(fileName);
84         
85         //2.upload file from local file system to hdfs file system
86         //file input stream,local file
87         String inFileName = "/opt/modules/hadoop-2.6.5/wcinput/wc.input";
88         String outFileName = "/user/hadoop/put-wc.input";
89         upload(inFileName, outFileName);
90     }
91 }
View Code

 6.調用方法 read(fileName)

7.進入hdfs文件系統查看/user/hadoop目錄

8.調用upload(inFileName, outFileName),然後刷新步驟7的頁面,文件上傳成功

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 日了狗啦,剛剛雞哥辛苦碼了那麼多字全丟了又要重新寫,這是第二遍寫了...今天雞哥給小白寫個不需要寫js原生代碼,只需要幾個插件和一段通俗易懂得jquery代碼就能搞定的輪播圖,當然js原生代碼寫著也不算很繁瑣,但是有些浪費時間,更何況很多人並不會用js直接寫包括雞哥,當年在學校還是研究過一段時間js ...
  • [1]標題 [2]段落 [3]內聯文本 [4]對齊 [5]大小寫 [6]縮略語 [7]地址 [8]引用 [9]列表 [10]代碼 ...
  • 一、Validate插件描述 Validate是基於jQuery的一款輕量級驗證插件,內置豐富的驗證規則,還有靈活的自定義規則介面,HTML、CSS與JS之間的低耦合能讓您自由佈局和豐富樣式,支持input,select,textarea的驗證。 二、配置方法 需要先導入Jquery庫,然後導入Va ...
  • 昨天咱們說了封裝ajax,今天咱們說一下 自己創建一個建議的node伺服器: 話不多說直接上代碼: //對URL 解析為對象//1.導入模塊 URl模塊 好啦!大概就是這個樣子! 有不懂得 留言問我哦! ...
  • 分享一段用canvas和JS製作刮刮樂的代碼,JS部分去掉註釋不到20行代碼效果如下 蓋倫.jpg 蓋倫.jpg 刮刮樂.gif 刮刮樂.gif 沒什麼要特別註意的為了效果加了些CSS樣式 1.為了清除瀏覽器自帶效果加了 2.img需要在灰佈下面,加了z-index;3.圖片絕對定位 js部分分析下 ...
  • 測試提了一個bug,在360瀏覽器相容模式下,刪除頁面數據需要手動刷新瀏覽器才能看到最新的數據。首先要復現當時的問題,很容易就復現了,但是發現在360瀏覽器相容模式下無法打開開發者工具。好在經過反覆重裝之後,終於打開了開發者工具,經過跟蹤發現,第一次刪除數據時可以正常刷新,第二次或以後的刪除將無法刷 ...
  • Vue實戰Vue-cli項目構建(Vue+webpack系列之一) ...
  • 最近在研究 stm32f429i disc0 的 device tree source code, 並且 參造 Devicetree Specification Release 0.1, 在 dts source code 中發現有一個 clock cells property, 但在 dts sp ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...