1. 程式人生 > >大數據學習——java代碼實現對HDFS文件的read、append、write操作

大數據學習——java代碼實現對HDFS文件的read、append、write操作

導入 () 學習 ioe java 1.8 todo ever col

在之前的環節進行了HDFS 的搭建過程,接下來學習的內容是通過java代碼實現對HDFS中文件進行操作。

這部分學習是為了之後在使用到的MapRedce對HDFS 文件進行操作。

在eclipse上編寫java代碼對HDFS上的文件進行操作首先要在項目中進行jar包導入。這裏我們通過建立maven項目,方便jar包的導入。

需要註意的是在使用mave時導入本地不存在的jar包需要在有網的環境下進行

這裏我們導入的jar包有以下幾部分,在pom.xml中配置以下幾個部分,會自動下載相關jar包

<dependencies>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-common</artifactId>
            <version>2.7.3</version>
        </dependency>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-client</artifactId>
            <version>2.7.3</version>
        </dependency>
        <dependency>
            <groupId>jdk.tools</groupId>
            <artifactId>jdk.tools</artifactId>
            <version>1.8</version>
            <scope>system</scope>
            <systemPath>${JAVA_HOME}/lib/tools.jar</systemPath>
        </dependency>
    </dependencies>

建立HDFSClient類,進行操作其中:

write:寫入操作,文件不存在時自動創建文件並寫入數據

append:追加寫入操作,寫入文件需存在

read:讀取文件操作

代碼如下:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; public class HDFSClient { public static void main(String[] args) { write(); //append(); read(); } //主加寫入文件,必須是已有文件 public static void append(){ Configuration conf=new Configuration(); conf.set(
"fs.defaultFS", "hdfs://192.168.98.141:9000"); conf.set("dfs.support.append", "true"); conf.set("dfs.client.block.write.replace-datanode-on-failure.policy", "NEVER");//配置權限 conf.set("dfs.client.block.write.replace-datanode-on-failure.enable", "true");//配置權限 try { FileSystem fs=FileSystem.get(conf); FSDataOutputStream outpustream = fs.append(new Path("/hp/abc.txt"));//FSDataOutputStream文件輸出流 //追加文件 outpustream.writeBytes("xxxxxx");//追加內容 outpustream.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } //寫入文件 public static void write(){ Configuration conf=new Configuration(); conf.set("fs.defaultFS", "hdfs://192.168.98.141:9000"); try { FileSystem fs=FileSystem.get(conf); FSDataOutputStream outputStream = fs.create(new Path("/hp/abc.txt")); outputStream.writeBytes("abcde"); outputStream.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static void read(){ // 配置對象 Configuration conf=new Configuration(); // 在配置對象中設置 namenode conf.set("fs.defaultFS", "hdfs://192.168.98.141:9000"); try { // 創建 FileSystem FileSystem fs=FileSystem.get(conf) ; // 穿件輸入流 FSDataInputStream inputstream = fs.open(new Path("/hp/abc.txt")); // 字節流轉字符流 InputStreamReader isr=new InputStreamReader(inputstream); BufferedReader br=new BufferedReader(isr); String str=br.readLine(); while(str!=null){ System.out.println(str); str=br.readLine(); } br.close(); isr.close(); inputstream.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }

註:這裏不能write append方法同時使用會報出錯誤,具體如何解決和原因我也沒有弄清楚

大數據學習——java代碼實現對HDFS文件的read、append、write操作