首页 > > > 重读 《Hadoop 权威指南》
最近在看 Flink 相关的东西,重读了下《Hadoop 权威指南》,以下内容作为学习笔记,版本为第四版(代码已经根据最新的官网文档调整)。
很多人对 Hadoop 有一种误解,觉得 Hadoop 慢,而 Spark、Storm、Flink 很快,实际上它们并不是一个层面的东西。
Hadoop 是一个很大的生态,包含了一系列的数据处理工具,最基础的是 HDFS 和 MapReduce,前者可以简单理解为分布式文件系统,用来存数据,后者用来做计算。
Spark 等实现的是 MapReduce 的功能,或者说 MapReduce 的优化。此外 Hadoop 还有一个常见的组件是资源调度框架 YARN ,Spark 等都可以运行在 YARN 上。关联的项目就更多了,构建于 HDFS 上的 HBase,类 SQL 的 Hive 数据操纵语言,构建于 MapReduce 之上的 Mahout 机器学习框架,序列化数据的 Avro,日志收集 Flume 等等。
小数据情况下,数据库的 B 树很快,但数据量一多,涉及大量的排序和合并,MapReduce 的优势就上来了。
MapReduce 的原理网上很多,这里不过多介绍,有兴趣的可以看看谷歌的原始论文 MapReduce: Simplified Data Processing on Large Clusters。(以下的 MapReduce 不特别强调都是指 Hadoop 组件)。
MapReduce 的优势:
以下代码省略了基础的包引入,需要懂基础的 Java
一个 Mapper 需要实现以下接口:
Class Mapper<KEYIN,VALUEIN,KEYOUT,VALUEOUT>分别对应输入key 类型,输入value 类型,输出key类型,输出value类型,代码来自官网:
public class TokenCounterMapper
extends Mapper<Object, Text, Text, IntWritable>{
private final static IntWritable one = new IntWritable(1);
private Text word = new Text();
public void map(Object key, Text value, Context context) throws IOException, InterruptedException {
StringTokenizer itr = new StringTokenizer(value.toString());
while (itr.hasMoreTokens()) {
word.set(itr.nextToken());
context.write(word, one);
}
}
}其中的 context 用于输出写入(磁盘、HDFS等), Reducer 代码类似,都需要匹配对应的输入输出类型。
启动 job 的代码(含义很明确了,不过多解释):
Job job = Job.getInstance();
job.setJarByClass(MyJob.class);
job.setJobName("myjob");
job.setInputPath(new Path("in"));
job.setOutputPath(new Path("out"));
job.setMapperClass(MyJob.MyMapper.class);
job.setReducerClass(MyJob.MyReducer.class);
job.waitForCompletion(true);当然需要先安装 Hadoop,然后一堆路径配置,然后就可以运行了:
hadoop 类名 输入路径 输出路径 文件系统检查:
hdfs fsck / -files -blocks其它的命令类似,常用的是 hdfs fs , 可以进行一些类似本地文件系统的操作:
hdfs fs -ls / 合并远程文件目录到本地文件,一般用于聚合 reduce 任务结果
hadoop fs -getmerge 目录 文件名另外了解到有一个新的数据分析引擎 ClickHouse 据说非常之快,并且不依赖于 Hadoop,有兴趣的可以了解下。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31509949/viewspace-3167792/ ,如需转载,请注明出处,否则将追究法律责任。