Tuzibuluo 寫:
Jazz 大大,看了你给我的教程和wiki上的hadoop Stream那块,在你的mapper.sh 里 hadoop fs -get $input /tmp/$id/$filename 是把这个文件从HDFS文件系统get到本地再 运行的velveth命令(类似于ffmpeg)来处理文件,再将处理后的数据利用hadoop fs -put output-$filename /user/$id/.上传到HDFS这样子么,Linux的脚本的我不懂,我找到了个JAVE项目,封装的ffmpeg-java API,另外我利用fuse挂载了HDFS,我想在我的Map函数里面去处理转码,但是我不知道MapReduce的这个框架,怎么让每个视频分段对应一个Map,我应该是提供一个输入目录里面对应多个分段视频,这样子是不是每个视频就会产生一个Map了,呵呵,我自己有点晕了..
我寫的範例是用五個檔案,每個均內含 20 個待處理的輸入檔案 HDFS 路徑,因此根據 MapReduce 的原理,會得到五個 Mapper。
以影像壓縮、影像合併為例,則可以將欲處理的視頻影片 HDFS 路徑,依照所希望分散給幾台 Mapper ,將檔名路徑寫到不同的輸入文字檔案。
如此就可以對他們做處理。
Ex.
我有 100 個視頻影片,檔名分別為 001.avi 、002.avi 、.... 、100.avi
我有 5 台 TaskTracker 可以執行 MapReduce。
[1] 首先我將 001.avi 到 100.avi 上傳到 HDFS 的 /user/jazz/input_video
[2] 我產生五個檔案,檔名分別為 input_1.txt、input_2.txt、....、input_5.txt
input_1.txt 內容為
代碼:
/user/jazz/input_video/001.avi
/user/jazz/input_video/002.avi
........... 略 ...............
/user/jazz/input_video/020.avi
input_2.txt 內容為 021.avi 到 040.avi 的路徑,依此類推。
[3] 將 input_1.txt ~ input_5.txt 上傳至 HDFS 的 /user/jazz/input
[4] 撰寫轉檔的 Script = mapper.sh 裡面去下載 HDFS 的檔案到 Local,然後做轉檔動作,然後再度上傳至 HDFS
[5] 撰寫合併的 Script = reducer.sh 從 HDFS 取回轉檔的中間產物,呼叫合併動作,然後再度上傳至 HDFS
[6] 呼叫 Hadoop Streaming
代碼:
hadoop jar hadoop-streaming.jar -input input -output output -mapper mapper.sh -reducer reducer.sh
- Jazz