本文目錄一覽:
- 1、如何用java程序把本地文件拷貝到hdfs上並顯示進度
- 2、關於用java寫程序把本地文件上傳到HDFS中的問題
- 3、如何使用Java API讀寫HDFS
- 4、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