hdfs 多个文件合并_hadoop学习笔记3 hadoop程序将本地文件夹中多个文件,合并为一个文件并上传到hdfs中--梦飞翔的地方(梦翔天空)...
今天夢翔兒,成功實現hadoop編程,將本地文件夾中多個文件,合并為一個文件并上傳到hdfs中
直接上代碼:PutMerge.java
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
public class PutMerge {
public static void main(String[] args) throws IOException {
Configuration conf = new Configuration();
FileSystem hdfs = FileSystem.get(conf);???//獲得hdfs文件系統設置
//FileSystem hdfs? = DistributedFileSystem.get(conf);
FileSystem local = FileSystem.getLocal(conf); //獲得本地文件系統設置
Path inputDir = new Path(args[0]);??//本地輸入目錄
Path hdfsFile = new Path(args[1]);? //遠程輸出文件
try {
FileStatus[] inputFiles = local.listStatus(inputDir);?? //數組,用來循環保存本地文件目錄信息
FSDataOutputStream out = hdfs.create(hdfsFile); //創新輸出hdfs文件
for (int i = 0; i < inputFiles.length; i++) {????//循環取出本地文件目錄信息
System.out.println(inputFiles[i].getPath().getName());? //主要關心文件名
FSDataInputStream in = local.open(inputFiles[i].getPath()); //打開本地文件
byte buffer[] = new byte[256];
int bytesRead = 0;
while ((bytesRead = in.read(buffer)) > 0) {
out.write(buffer,0, bytesRead);??//合并文件
}
in.close();
}
out.close();
} catch (IOException e) {
// TODO: handle exception
e.printStackTrace();
}
}
}
=========
手動編譯并執行過程:
cd /usr/lib/hadoop
sudo mkdir putmerge
sudo mkdir putmerge/src
sudo mkdir putmerge/classes
sudo cp ~/workspace/PutMerge/src/PutMerge.java putmerge/src??? //源碼拷進
cd putmerge/
ls
cd src
ls
cd ../..
sudo javac -classpath hadoop-0.20.2-cdh3u0-core.jar:lib/commons-cli-1.2.jar -d putmerge/classes putmerge/src/PutMerge.java?? //編譯
sudo jar -cvf putmerge/PutMerge.jar -C putmerge/classes/ .
sudo mkdir input2
sudo nano input2/test1.txt?? //兩個輸入文件
111-111
111-222
111-333
sudo nano input2/test2.txt
222-111
222-222
222-333
hadoop jar putmerge/PutMerge.jar PutMerge input2 hdfs://localhost/usr/cloud/output2? //執行程序
夢翔兒最終通過50070的hdfs web查看輸出:
hdfs://localhost/usr/cloud/output2
222-111
222-222
222-333
111-111
111-222
111-333
=========
注:在ubuntu的eclipse中兩個參數如果都是本地,成功。但第二個參數設為hdfs時執行出錯,提示:Wrong FS: hdfs://localhost/user/cloud,expected: file:///,不知何故。
但如上進行手動編譯,執行是成功的。看起來無論是本地還是遠程,執行的過程都是相同的。也就是說hdfs 的接口也是一種標準的java類,在本地也是可以執行的。
在夢翔兒的實驗中,是按本地的一大堆出租車軌跡日志,合并成一個大文件,送到hdfs(因為hdfs對大文件的處理效率比較好,一堆小文件效率差)上后用mapreduce來分析查詢。
原始程序參考于 《hadoop in action 》 P36-37 關于其它的算法,以后再具體實踐。
總結
以上是生活随笔為你收集整理的hdfs 多个文件合并_hadoop学习笔记3 hadoop程序将本地文件夹中多个文件,合并为一个文件并上传到hdfs中--梦飞翔的地方(梦翔天空)...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微软Edge浏览器神优化:28天内帮玩家
- 下一篇: HDMI 2.1a标准升级:再也不用拖一