综合性HDFS实战: 使用HDFS java API 完成HDFS文件系统上的文件的词频统计
:wordcount
/path/1.txt
hello world hello
/path/2.txt
hello world hello
==> (hello,4) (world,2)
将统计完的结果输出到HDFS上去
本实战的要求:只允许使用HDFS API进行操作
目的:
1)掌握HDFS API的操作
2)通过这个案例,对后续要学习的mapreduce 有一个好的认识
//需求:统计HDFS上的wc ,然后将统计结果输出到HDFS
功能拆解:
1)读取HDFS上的文件 :Hadoop fs -text /test/a.txt
2)业务处理(词频统计): 队伍文件中的每一行数据都进行业务处理(按分隔符分割)===》Mapper
3)将处理结果缓存起来 ==>Context
4)将结果输出到HDFS ==>HDFS API
public static void main(String [] args)
{
Path input=new Path("/test/hello.txt");
Path output=new Path("/test/output/");
FileSystem fs= FileSytem.get(new URI("hdfs:192.168.57.168:8020"),new Configuration(),new USER());
String line="";
while((line=reader.readLine())!=null)
{
//业务处理(词频统计)
}
reader.close();
in.close();
}
//ImoocContext
private Map<Object,Object> cacheMap =new HashMap<Object,Object>();
public Map<Object,Object> getCacheMap()
{
return cacheMap;
}
public void write(Object key,Object value)
{
cacheMap.put(key,value);
}
public void get(Object key){
return cacheMap.get(key);
}
//class Mapper
// line :读取到每一行数据
// context:上下文/缓存
自定义类:
客户端写数据到HDFS的流程:
客户端读数据的过程:
HDFS的元数据的管理:
元数据:HDFS的目录结构以及每个文件的BLOCK信息(id,副本系数,block存放在哪个)
存在什么地方:hdfs-site.xml ${hadoop.tmp.dir}/name/…
元素据存放在文件中:
/test1
/test1/a.txt
/test2/1.txt
/test2/2.txt
/test2/xxx
hadoop fs -put xxx /test2/
checkPoints: 保证内存中的数据不会丢
hadoop fs -put xxx /test2/