采用maven来编写程序,功能为合并多个文件为一个文件
package hadoop;
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();
//Hadoop api的起点是FileSystem.使用工厂方法获取实例
FileSystem hdfs=FileSystem.get(conf);
//获取专用于本地文件系统的FileSystem对象
FileSystem local=FileSystem.getLocal(conf);
//使用Path独享编制文件和目录
Path inputDir=new Path(args[0]);
Path hdfsFile=new Path(args[1]);
try{
//FileStatus存储文件和目录的元数据,得到目录中的文件列表
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 byteRead=0;
while((byteRead=in.read(buffer))>0)
{
out.write(buffer, 0, byteRead);
}
in.close();
}
out.close();
}
catch(IOException e)
{
e.printStackTrace();
}
}
}
程序的大体流程为:1.根据用户定义的参数设置本地目录和HDFS目录;2.提取本地输入目录的每个文件信息;3.创建一个流写入HDFS文件;4.遍历目录下的每一个文件,打开一个流来读入文件,剩下就是标准的JAVA复制了。
Hadoop的数据类型
可序列化的键值对,数据类型实现了WriteableComaraple<T>,可以自定义类型,只要实现了该接口
maper和reducer均为MapReduceBase子类,均含有一下方法:
Mapper接口主要负责数据的处理,采用形式为Map<k1,v1,k2,v2>java泛型,由于键是排序,实现WriteableComparable,值是需要传递的,实现Writeable。Mapper只有一个接口方法即map,如下:
Reducer,实现Reducer接口,该接口也只有一个方法:
Partitioner:重定向Mapper输出
Combine:本地reduce