HDFS文件操作
首先在进行文件操作之前,要确定防火墙是否关闭,否则写文件会失败
hadoop fs -mkdir /user/root,创建一个当前用户的默认工作目录。
hadoop fs -put 111.txt .
hadoop fs -ls .
hadoop fs -lsr / 列出所有文件
hadoop fs -cat 111.txt
hadoop fs -get 111.txt .
hadoop fs -rm 111.txt
观察命令可以看出,其基本命令和linux命令很像,只是在前面多了hadoop fs。
HDFS JAVA API示例
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); 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); 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) { e.printStackTrace(); } } }
MapReduce
hadoop jar hadoop-0.20.2-examples.jar wordcount ./1.mp4 ./mp2
MapReduce运行原理如上图所示,运行hadoop自带的example,wordcount,可以得到上面所示report。这个地方只是给出一个感性认识,如果一个文件比较大,hdfs会先将文件分片,然后分别提交到若干个datanode上,当执行MapReduce时,每个节点都会执行map,用于计算本节点的数据,当文件较大,产生分片,分不到多台机器上,自然就产生了并发处理,生成结果之后在递交给reduce,而reduce的运行个数,则要看运算量了,可以1个,也可能若干个,如下图所示。
并且在map之后reduce之前,有时候还需要再本地reduce一下,更准确的说是combine,如统计单词,可以输出100次[a: 1]或1次[a: 100]。
由于hdfs会出现数据复制,而实现数据备份,MapReduce处理时,仅会处理一个副本。