Hadoop in Action简单笔记(一)
转载请标明出处: http://fuliang.iteye.com/blog/1136669
第一部分 Hadoop 分布式的编程框架
第一章 Hadoop 简介
1、philosophy: move-code-to-data,适合数据密集性应用。
2、SQL database VS Hadoop:
1) SCALE-OUT INSTEAD VS SCALE-UP
2) Key/value对 VS 关系表:无结构、半结构数据 VS 结构化的数据
3)函数式编程(MapReduce) VS 声明式编程(SQL):hive can map the sql to the job
4)离线批处理 VS 在线事务处理
3、理解MapReduce
1)2个阶段:
map:转换+过滤数据: <k1, v1> -> list(<k2, v2>)
reduce:<k2, list(v2)> -> list(<k3, v3>)
map和reduce之间按照key进行group,hadoop负责处理、只需要写map和reduce程序
2)word count 例子
第二章 Starting Hadoop
1、Blocks of Hadoop:
NameNode: Master, bookkeeper of the HDFS,keeps track of how your fi les are broken down into file blocks, which nodes store those blocks, and the overall health of the distributed filesystem
内存、I/O密集型。单点,但SNN可以作为master的备用
DataNode: Slave of the HDFS, 存储数据的节点、冗余备份、向NameNode报告本地数据的变化。
Secondary NameNode(SNN):作为master的备用节点、获得NameNode的HDFS元数据的快照、集群的配置
JobTracker:分配提供的job成为多个task,监控各个task,检测各个task的心跳,重启动失败的任务。计算中的master
TaskTracker:负责执行JobTracker分配的单个任务,像JobTracker发送心跳信息。每个DN节点一个TaskTracker,但它可以创建多个jvm实例,并行的处理多个map和reduce的任务。
计算中的slave
2、安装Hadoop
三种模式: Local (standalone) mode、Pseudo-distributed mode、Fully distributed mode
3、Web-based cluster UI查看节点和job的信息
第三章 Hadoop各个组件
这章主要从程序员的角度介绍了Hadoop的计算框架。
3.1 在HDFS文件系统下工作
HDFS是为分布式计算框架设计的大规模的分布式数据处理而设计的。
Hadoop shell提供了很多类似Unix的命令行工具,是HDFS系统的主要接口。
Hadoop也提供了HDFS的编程接口。
3.1.1基本的文件命令
基本形式: hadoop fs -cmd <args>
hadoop fs -ls
hadoop fs -lsr #相当于linux 的ls -r
hadoop fs -put example.txt . #将example.txt从本地文件系统copy到HDFS上。
hadoop fs -get example.txt . #从HDFS将example get到本地
hadoop fs -cat example.txt #相当于linux的cat
hadoop fs -tail example.txt #linux tail
可以结合Unix管道:
hadoop fs -cat example.txt | head -n 10
hadoop fs -rm example.txt #linux rm
查看帮助,比如ls的帮助:
hadoop fs -help ls
可以使用URI来制定精确的文件和目录位置:
hadoop fs -cat hdfs://localhost:9000/user/chunk/example.txt
如果处理本地文件系统,那么可以通过配置fs.default.name来配置默认的file://scheme部分。
3.2.1 Hadoop数据类型
MapReduce的key,value不能是普通的class,它需要key/value实现序列化的方法,
key还需要具有可比较性。所以MapReduce对基本类型进行了封装。
一般key/value会实现WritableComparable<T>接口,value会Writable接口。
Hadoop预定义了一些对基本类型封装的类型:BooleanWritable,ByteWritable,
DoubleWritable,FloatWritable,IntWritable,LongWritable,Text,NullWritable。
你可以自己定义类型,实现Writable或者WritableComparable接口。
3.2.2 Mapper
作为一个Mapper,一般实现了Mapper接口并且继承了MapReduceBase类。MapReduceBase从名字可以看出,作为Mapper和Reducer的基类。
有两个方法作为构造和析构:
void configure(JobConf job) 在数据处理之前调用,加载配置项
void close() 在map任务结束调用,进行资源回收,比如数据库连接、打开文件关闭。
Mapper接口负责数据处理阶段,他有一个map方法,来处理key/value对:
public interface RecordReader<K,V>{ boolean next(K key, V value) throws IOException; K createKey(); V createValue(); long getPos() throws IOException; void close() throws IOException; float getProgress() throws IOException;}Hadoop有一些实现好的RecordReader,比如LineRecordReader<LongWritable,Text>
它在TextInputFormat被使用,KeyValueLineRecordReader在KeyValueTextInputFormat被使用。
3.3.2 输出格式。
和InputFormat对应,输出有OutputFormat类,输出没有splits,每个reducer写入自己的文件。
Hadoop提供了一些预定义的输出格式实现,可以通过JobConf的setOutputFormat来指定。
TextOutputFormat<K,V> 将每个记录写成一行,key和value用\t分割,可以在mapred.textoutputformat.separator中指定分隔符。
SequenceFileOutputFormat<K,V> 将key/value写入hadoop的sequence 文件格式。和
SequenceFileInputFormat对应。
NullOutputFormat<K,V> 不输出。