Hadoop之旅--Hadoop的一些经验总结
1.map/reduce
map:
子任务,一个map/reduce任务首先会分解成多个map子任务,会被分配到多个节点运行;
每一个map任务执行计算作业的一部分;
每个map任务执行完成之后,会产生中间文件;
reduce的任务就是将map任务产生的中间文件作为输入数据,将所有的map任务汇总输出;
2.编写JAVA代码出现如下问题
2012-4-20 19:36:55 org.apache.hadoop.util.NativeCodeLoader <clinit>
璀﹀憡: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Hadoop是使用Java语言开发的,但是有一些需求和操作并不适合使用java,所以就引入了本地库(Native Libraries)的概念,通过本地库,Hadoop可以更加高效地执行某一些操作。
上述意思是说不能再如本地类库,处理的方式也比较简单:
在Hadoop的配置文件core-site.xml中可以设置是否使用本地库:
<property>
<name>hadoop.native.lib</name>
<value>true</value>
<description>Should native hadoop libraries, if present, be used.</description>
</property>
3.HIVE的使用
HIVE中是等值JOIN的,也支持左右连接;
在使用写有 Join 操作的查询语句时有一条原则:应该将条目少的表/子查询放在 Join 操作符的左边。
原因是在 Join 操作的 Reduce 阶段,位于 Join 操作符左边的表的内容会被加载进内存,将条目少的表放在左边,可以有效减少发生 OOM 错误的几率。
4.hadoop原生默认的压缩文件的解析
hadoop中的文件是默认压缩的,在hadoop中的API中是根据文件后缀名成来判断该文件的压缩类型的
例如test.deflate文件,其hadoop的文件压缩格式就是deflate,这种是默认的hadoop文件格式,当然还支持其他好几种压缩格式,比如Gzip,bzip2,zlib等
下面是hadoop解压文件,并输出成string的代码:
CompressionCodecFactory factory = new CompressionCodecFactory(conf);CompressionCodec codec = factory.getCodec(p);if (codec == null) {throw new IOException(String.format("Can't find any suitable CompressionCodec to this file:%s",p.toString()));}in = fs.open(p);CompressionInputStream cin = codec.createInputStream(in);br = new BufferedReader(new InputStreamReader(cin, encoding),bufferSize);