hdfs的java程序(java訪問hdfs)

本文目錄一覽:

如何用java程序把本地文件拷貝到hdfs上並顯示進度

把程序打成jar包放到Linux上

轉到目錄下執行命令 hadoop jar mapreducer.jar /home/clq/export/java/count.jar hdfs://ubuntu:9000/out06/count/

上面一個是本地文件,一個是上傳hdfs位置

成功後出現:列印出來,你所要列印的字元。

package com.clq.hdfs;

import java.io.BufferedInputStream;

import java.io.FileInputStream;

import java.io.IOException;

import java.io.InputStream;

import java.net.URI;

import org.apache.hadoop.conf.Configuration;

import org.apache.hadoop.fs.FSDataOutputStream;

import org.apache.hadoop.fs.FileSystem;

import org.apache.hadoop.fs.Path;

import org.apache.hadoop.io.IOUtils;

import org.apache.hadoop.util.Progressable;

public class FileCopyWithProgress {

//********************************

//把本地的一個文件拷貝到hdfs上

//********************************

public static void main(String[] args) throws IOException {

String localSrc = args[0];

String dst = args[1];

InputStream in = new BufferedInputStream(new FileInputStream(localSrc));

Configuration conf = new Configuration();

FileSystem fs = FileSystem.get(URI.create(dst), conf);

FSDataOutputStream out = fs.create(new Path(dst), new Progressable() {

@Override

public void progress() {

System.out.print(“.”);

}

});

IOUtils.copyBytes(in, out, conf, true);

}

}

可能出現異常:

Exception in thread “main” org.apache.hadoop.ipc.RemoteException: java.io.IOException: Cannot create /out06; already exists as a directory

at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.startFileInternal(FSNamesystem.java:1569)

at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.startFile(FSNamesystem.java:1527)

at org.apache.hadoop.hdfs.server.namenode.NameNode.create(NameNode.java:710)

at org.apache.hadoop.hdfs.server.namenode.NameNode.create(NameNode.java:689)

at sun.reflect.GeneratedMethodAccessor7.invoke(Unknown Source)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

at java.lang.reflect.Method.invoke(Method.java:606)

at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:587)

at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:1432)

at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:1428)

at java.security.AccessController.doPrivileged(Native Method)

at javax.security.auth.Subject.doAs(Subject.java:415)

說明你這個路徑在hdfs上已經存在,換一個即可。

關於用java寫程序把本地文件上傳到HDFS中的問題

將這FileSystem hdfs = FileSystem.get(config);

改成FileSystem hdfs = FileSystem.get(URI.create(“hdfs://master:9000”),config)

上面那句取得的是本地文件系統對象,改成下面這個才是取得hdfs文件系統對象,當你要操作本地文件對象的時候就要用上面那句取得本地文件對象,我在2.7.4剛開始也是跟你一樣的錯誤,改為下面的就可以了

如何使用Java API讀寫HDFS

//流讀入和寫入

InputStream in=null;

//獲取HDFS的conf

//讀取HDFS上的文件系統

FileSystem hdfs=FileSystem.get(conf);

//使用緩衝流,進行按行讀取的功能

BufferedReader buff=null;

//獲取日誌文件的根目錄

Path listf =new Path(“hdfs://10.2.143.5:9090/root/myfile/”);

//獲取根目錄下的所有2級子文件目錄

FileStatus stats[]=hdfs.listStatus(listf);

//自定義j,方便查看插入信息

int j=0;

for(int i = 0; i stats.length; i++){

//獲取子目錄下的文件路徑

FileStatus temp[]=hdfs.listStatus(new Path(stats[i].getPath().toString()));

for(int k = 0; k temp.length;k++){

System.out.println(“文件路徑名:”+temp[k].getPath().toString());

//獲取Path

Path p=new Path(temp[k].getPath().toString());

//打開文件流

in=hdfs.open(p);

//BufferedReader包裝一個流

buff=new BufferedReader(new InputStreamReader(in));

String str=null;

while((str=buff.readLine())!=null){

System.out.println(str);

}

buff.close();

in.close();

}

Java程序訪問不了HDFS下的文件,報缺失塊的異常,請高手解決一下

現在我們來深入了解一下Hadoop的FileSystem類。這個類是用來跟Hadoop的文件系統進行交互的。雖然我們這裡主要是針對HDFS,但是我們還是應該讓我們的代碼只使用抽象類FileSystem,這樣我們的代碼就可以跟任何一個Hadoop的文件系統交互了。在寫測試代碼時,我們可以用本地文件系統測試,部署時使用HDFS,只需配置一下,不需要修改代碼了。

在Hadoop 1.x以後的版本中引入了一個新的文件系統介面叫FileContext,一個FileContext實例可以處理多種文件系統,而且介面更加清晰和統一。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/153423.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-14 03:05
下一篇 2024-11-14 03:06

相關推薦

  • java client.getacsresponse 編譯報錯解決方法

    java client.getacsresponse 編譯報錯是Java編程過程中常見的錯誤,常見的原因是代碼的語法錯誤、類庫依賴問題和編譯環境的配置問題。下面將從多個方面進行分析…

    編程 2025-04-29
  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • Java騰訊雲音視頻對接

    本文旨在從多個方面詳細闡述Java騰訊雲音視頻對接,提供完整的代碼示例。 一、騰訊雲音視頻介紹 騰訊雲音視頻服務(Cloud Tencent Real-Time Communica…

    編程 2025-04-29
  • Python程序需要編譯才能執行

    Python 被廣泛應用於數據分析、人工智慧、科學計算等領域,它的靈活性和簡單易學的性質使得越來越多的人喜歡使用 Python 進行編程。然而,在 Python 中程序執行的方式不…

    編程 2025-04-29
  • Java Bean載入過程

    Java Bean載入過程涉及到類載入器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean載入的過程。 一、類載入器 類載入器是Java虛擬機…

    編程 2025-04-29
  • python強行終止程序快捷鍵

    本文將從多個方面對python強行終止程序快捷鍵進行詳細闡述,並提供相應代碼示例。 一、Ctrl+C快捷鍵 Ctrl+C快捷鍵是在終端中經常用來強行終止運行的程序。當你在終端中運行…

    編程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介紹

    本文將詳細介紹Java Milvus SearchParam withoutFields的相關知識和用法。 一、什麼是Java Milvus SearchParam without…

    編程 2025-04-29
  • Python程序文件的拓展

    Python是一門功能豐富、易於學習、可讀性高的編程語言。Python程序文件通常以.py為文件拓展名,被廣泛應用於各種領域,包括Web開發、機器學習、科學計算等。為了更好地發揮P…

    編程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java語言中的一個版本,於2014年3月18日發布。本文將從多個方面對Java 8中某一周的周一進行詳細的闡述。 一、數組處理 Java 8新特性之一是Stream…

    編程 2025-04-29
  • Java判斷字元串是否存在多個

    本文將從以下幾個方面詳細闡述如何使用Java判斷一個字元串中是否存在多個指定字元: 一、字元串遍歷 字元串是Java編程中非常重要的一種數據類型。要判斷字元串中是否存在多個指定字元…

    編程 2025-04-29

發表回復

登錄後才能評論