hadoop in action 读书笔记-第123章
2016-03-16 10:28
225 查看
第一章
需要处理的数据变的超多,且增长速度也在增长,一种利用多机器的分布式和可扩展计算框架是迫切需求。这个大数据的时代的程序员必须有拥有处理大数据的能力
pc组成的服务器矩阵比大型机小型机廉价且易得
hadoop对其硬件基础-pc矩阵-采取了硬件容错策略,容许某个节点的不可用.包括数据节点和计算阶段。
hadoop的架构可以直接添加硬件,以获得线性的计算能力
MapReduce框架能容易开发出高效的并行程序
不必自行分割数据
不必分配调度执行节点
在pc集群基础上,hadoop讲计算和数据都分作多个部分,多台机器同时参与数据IO和计算。而且,考虑到大数据之大,pc间传递的是计算任务不是被计算的数据。这个被称为计算向数据移动。
比较传统的数据库应用,
1数据库数据向计算移动
2吞吐的提升采用替换高级硬件,扩容有限
3关系数据模型不够灵活
4查询sql,但mapreduce可以完成更复杂的数据查询功能
5实时随机读写,离线批量读取
hadoop的底层文件系统设计决定了hadoop处理的以一次写入多次读取为主。
理解Map和Reduce 编程模型
将一个对数据的计算任务拆作两部,map和reduce。
map是将一个数据源分作多个数据源,在小规模数据上进行计算,同时过滤与转换
reduce接过map的输出,将接过并归,输出最终的形式,这一步也是同时聚合
工业上在map和reduce中间一般加入分区和归约阶段,进一步降低处理数据的规模。
第二章
Hadoop结构
在Hadoop集群中,有的角色仅仅对应单个服务器,有的角色对应多个服务器
hadoop的计算和存储都采用主从结构。
角色NameNode|Secondary NameNode
NameNode在HDFS的主端,指导从端的DataNode执行IO任务。
跟踪文件分割成block,大小
block又被哪些从端存储
监控整个分布文件系统的运行状态
为了防止NameNode的单点失效,SecondaryNameNode
角色DataNode
DataNode存在于集群上的每个机器。
负责在HDFS读取block,或者将block写入本地文件系统的实际文件中
NameNode告知客户端一个文件的block分布哪些DataNode中。
客户端直接访问DataNode,进行读取或写入。一个DataNode写入完毕,会负制两份,其中一份在本机架上。写入和复制是一个事务有完成性保证。
角色JobTracker
JobTracker执行提交的作业。
决定处理那些文件
为不同的任务分配节点
监控任务运行
如果任务失败,重新启动任务
任务过慢,安排新的执行
集群中只有一个JobTracker,小型集群和NameNode在一个个机器上,大型集群各自独立
角色TaskTracker
和DataNode一样,存在于集群中的每台机器。意思就是说有数据的地方就有计算,要计算的时候,身边必须有数据。牢记一句话,在大数据语境下计算向数据移动。
执行JobTracker分配的单项任务。
虽然每台机器仅有一个TaskTracker,但一个TaskTracker可以启动多个jvm进程
管理任务在从节点上的执行情况。
向JobTracker心跳通信
3种工作模式
安装Hadoop集群,需要专门一个主节点。存在NameNode和JobTracker
Hadoop集群机器之间的通信,依赖SSH协议,不是普通的tcp协议
主节点和从节点的通信依赖无口令的SSH协议。公钥存在每个节点,私钥在主节点。
定义一个公共账号,集群中每台机器都使用这个账号执行管理Hadoop
安装OpenSSH
在主节点生成SSH密钥对 不输入口令
ssh-keygen -t rsa
enter file in which to the key {/home/$USER/.ssh/id_rsa}
私钥为 /home/$USER/.ssh/id_rsa
公钥为 /home/$USER/.ssh/id_rsa.pub
逐一将公钥复制到主节点及每个从节点上
scp ~/.ssh/id_rsa.pub $USER/@target:~/master_key
在目标节点上将刚刚的公钥设置为授权密钥
cat ~/master_key >> ~/.ssh/authorized_keys
从主节点上连接从节点作测试
ssh target
必要配置
HADOOP_HOME/conf/hadoop-env.sh
export JAVA_HOME=/usr/share/jdk
单机配置
最小配置,不需要和其他节点交互,也不需要HDFS,主要用户开发调试
HADOOP_HOME/conf/core-site.xml
HADOOP_HOME/conf/hdfs-site.xml
HADOOP_HOME/conf/mapred-site.xml
伪集群配置
在一台机器上模拟一个集群,允许检查内存使用,使用HDFS IO,允许节点之间相交互
as 从节点
HADOOP_HOME/conf/core-site.xml
<property>
<name>fs.default.name
<value>hdfs://localhost:9000
<description>
</property>
as 从节点
HADOOP_HOME/conf/hdfs-site.xml
<property>
<name>dfs.replication
<value>1
<description>
</property>
as 从节点
HADOOP_HOME/conf/mapred-site.xml
<property>
<name>mapred.job.tracker
<value>localhost:9001
<description>
</property>
as 从节点
在文件masters中指定SNN的位置
as 主节点
在文件slaves中指定从节点的位置
集群配置
HADOOP_HOME/conf/core-site.xml
<property>
<name>fs.default.name
<value>hdfs://$master:9000
<description>
</property>
HADOOP_HOME/conf/hdfs-site.xml
<property>
<name>dfs.replication
<value>3
<description>
</property>
HADOOP_HOME/conf/mapred-site.xml
<property>
<name>mapred.job.tracker
<value>$master:9001
<description>
</property>
在文件masters中指定SNN的位置
在文件slaves中指定从节点的位置
复制配置到每台机器
master$ HADOOP_HOME/bin/hadoop namenode-format
master$ HADOOP_HOME/bin/start-all.sh
web工具
集群监控
第三章
管理HDFS
数据文件在别处生成
合成大文件,HDFS存储,被分割成N个block分散在集群内部
JobTracker根据文件所在,安排Mapreduce的工作地址,所谓计算向数据移动嘛
对于mapreduce任务来说,其输入数据也就是对文件的读取一般是由Hadoop框架完成的
通常来说处理一个大文件要比处理若干小文件有效率。
Hadoop Api
FileSystem hdfs=FileSystem.get();
FileSystem disk=FileSystem.getLocal();
Path uri= new Path("schema://path");
FileStatus file;
FSDataInputStream stream = filesystem.open(path);
stream.close();
FSDataOutputStream stream = filesystem.create(path);
stream.close();
MapReduce框架
MapReduce框架 输入数据和输出数据都是以键值对为基础
其中键要求实现WritableComparable可以序列化可以比较
其中值要求实现Writable可以序列化
文件被分割成若干小块,离散存储在集群内
选择输入格式,来执行数据分割
InputFormat<K,V>
InputSplit[] getSplits(JobConf,int numSplits);
RecordReader<K,V> getRecordRead(InputSplit,JobConf,Reporter);
确定了对输入数据何如分片,小于HDFS中一个块的大小大于mapred.min.split.size字节,一般一个分片就是一个块
每个MapReduce任务被分配一个分片
循环提取分片中的记录,解析为预定义的键值对
TextInputFormat 一行为一个记录 <字节偏要,行文本>
KeyValueTextInputFormat 一行为一个记录 <分隔符前文本,分隔符后文本>
SequenceFileInputFormat<K,V> Hadoop专用的压缩二进制文件,专用作业 间的传递
NLineInputFormat TextInputFormat相同,每个分片有N行
conf.setInputFormat(xxxFormat.class);
开始map过程 void map(K1,V1,OutputCollection<K2,V2>,Report)throw IOException;
该函数处理一个给定的键值对
生成一个键值对列表,这是输出的结果
report是对任务的报告
IdentityMapper 直接映射
InverseMapper 反转
RegexMapper 为每个表达式的匹配生成一个计数为1的对
TokenCountMapper
在输出键值对列表前,我们可以将一个键的多项值进行合并
可以求合
也可以其他计算
OutputFormat<K,V>
分区,重定向mapper的输出,
如何确定map的输出分给哪一个节点?
默认是对键是默认的散列取值,相同的hash值分配到同一个节点
Interface Partitioner<Key,Writable>
public int getPartition(Key,Writable,int numberPartitions);
洗牌 这个过程是各个job节点间唯一通信的阶段,是扩展的瓶颈所在
在经过合并和分区之后,Reduce节点要拉取数据进入reduce计算
数据通过http从JobTracker获取,
在map阶段我们为了reduce能快速计算,对每个输出的keyvalue做了分区,标记了keyvalue属于哪个reduce节点
jobTracker告知reduce节点,在哪个DataNode上去拉取哪些keyvalue。
如果在map阶段有过排序,那么reduce的拉取就会集中在某一range,减少随机读,可以提高效率
reduce节点将拉取到的数据merge成一个文件可能在内存也可能在磁盘,将这个文件应用于reduce计算
整个过程表现 没有对map节点的结果全盘接受,而是不同reduce节点在每个map节点选择的性的拉取了部分数据,看上去像洗牌
合并,减小数据量
排序,减少随机读,促成批量顺序读
尽量将一个map节点的数据,对应一个reduce节点,避免两组机器通信的笛卡尔乘积
开始reduce过程 void reduce(K2,Iterator<V2>,OutputCollection<K3,V3>,Report)throw IOException;
接受来吧各个Mapper的数据,按照键进行排序,并对相同键的值进行归并。
然后再调用reduce函数,迭代处理相关的值列表
report报告任务进度
需要处理的数据变的超多,且增长速度也在增长,一种利用多机器的分布式和可扩展计算框架是迫切需求。这个大数据的时代的程序员必须有拥有处理大数据的能力
pc组成的服务器矩阵比大型机小型机廉价且易得
hadoop对其硬件基础-pc矩阵-采取了硬件容错策略,容许某个节点的不可用.包括数据节点和计算阶段。
hadoop的架构可以直接添加硬件,以获得线性的计算能力
MapReduce框架能容易开发出高效的并行程序
不必自行分割数据
不必分配调度执行节点
在pc集群基础上,hadoop讲计算和数据都分作多个部分,多台机器同时参与数据IO和计算。而且,考虑到大数据之大,pc间传递的是计算任务不是被计算的数据。这个被称为计算向数据移动。
比较传统的数据库应用,
1数据库数据向计算移动
2吞吐的提升采用替换高级硬件,扩容有限
3关系数据模型不够灵活
4查询sql,但mapreduce可以完成更复杂的数据查询功能
5实时随机读写,离线批量读取
hadoop的底层文件系统设计决定了hadoop处理的以一次写入多次读取为主。
理解Map和Reduce 编程模型
将一个对数据的计算任务拆作两部,map和reduce。
map是将一个数据源分作多个数据源,在小规模数据上进行计算,同时过滤与转换
reduce接过map的输出,将接过并归,输出最终的形式,这一步也是同时聚合
工业上在map和reduce中间一般加入分区和归约阶段,进一步降低处理数据的规模。
第二章
Hadoop结构
在Hadoop集群中,有的角色仅仅对应单个服务器,有的角色对应多个服务器
hadoop的计算和存储都采用主从结构。
角色NameNode|Secondary NameNode
NameNode在HDFS的主端,指导从端的DataNode执行IO任务。
跟踪文件分割成block,大小
block又被哪些从端存储
监控整个分布文件系统的运行状态
为了防止NameNode的单点失效,SecondaryNameNode
角色DataNode
DataNode存在于集群上的每个机器。
负责在HDFS读取block,或者将block写入本地文件系统的实际文件中
NameNode告知客户端一个文件的block分布哪些DataNode中。
客户端直接访问DataNode,进行读取或写入。一个DataNode写入完毕,会负制两份,其中一份在本机架上。写入和复制是一个事务有完成性保证。
角色JobTracker
JobTracker执行提交的作业。
决定处理那些文件
为不同的任务分配节点
监控任务运行
如果任务失败,重新启动任务
任务过慢,安排新的执行
集群中只有一个JobTracker,小型集群和NameNode在一个个机器上,大型集群各自独立
角色TaskTracker
和DataNode一样,存在于集群中的每台机器。意思就是说有数据的地方就有计算,要计算的时候,身边必须有数据。牢记一句话,在大数据语境下计算向数据移动。
执行JobTracker分配的单项任务。
虽然每台机器仅有一个TaskTracker,但一个TaskTracker可以启动多个jvm进程
管理任务在从节点上的执行情况。
向JobTracker心跳通信
3种工作模式
安装Hadoop集群,需要专门一个主节点。存在NameNode和JobTracker
Hadoop集群机器之间的通信,依赖SSH协议,不是普通的tcp协议
主节点和从节点的通信依赖无口令的SSH协议。公钥存在每个节点,私钥在主节点。
定义一个公共账号,集群中每台机器都使用这个账号执行管理Hadoop
安装OpenSSH
在主节点生成SSH密钥对 不输入口令
ssh-keygen -t rsa
enter file in which to the key {/home/$USER/.ssh/id_rsa}
私钥为 /home/$USER/.ssh/id_rsa
公钥为 /home/$USER/.ssh/id_rsa.pub
逐一将公钥复制到主节点及每个从节点上
scp ~/.ssh/id_rsa.pub $USER/@target:~/master_key
在目标节点上将刚刚的公钥设置为授权密钥
cat ~/master_key >> ~/.ssh/authorized_keys
从主节点上连接从节点作测试
ssh target
必要配置
HADOOP_HOME/conf/hadoop-env.sh
export JAVA_HOME=/usr/share/jdk
单机配置
最小配置,不需要和其他节点交互,也不需要HDFS,主要用户开发调试
HADOOP_HOME/conf/core-site.xml
HADOOP_HOME/conf/hdfs-site.xml
HADOOP_HOME/conf/mapred-site.xml
伪集群配置
在一台机器上模拟一个集群,允许检查内存使用,使用HDFS IO,允许节点之间相交互
as 从节点
HADOOP_HOME/conf/core-site.xml
<property>
<name>fs.default.name
<value>hdfs://localhost:9000
<description>
</property>
as 从节点
HADOOP_HOME/conf/hdfs-site.xml
<property>
<name>dfs.replication
<value>1
<description>
</property>
as 从节点
HADOOP_HOME/conf/mapred-site.xml
<property>
<name>mapred.job.tracker
<value>localhost:9001
<description>
</property>
as 从节点
在文件masters中指定SNN的位置
as 主节点
在文件slaves中指定从节点的位置
集群配置
HADOOP_HOME/conf/core-site.xml
<property>
<name>fs.default.name
<value>hdfs://$master:9000
<description>
</property>
HADOOP_HOME/conf/hdfs-site.xml
<property>
<name>dfs.replication
<value>3
<description>
</property>
HADOOP_HOME/conf/mapred-site.xml
<property>
<name>mapred.job.tracker
<value>$master:9001
<description>
</property>
在文件masters中指定SNN的位置
在文件slaves中指定从节点的位置
复制配置到每台机器
master$ HADOOP_HOME/bin/hadoop namenode-format
master$ HADOOP_HOME/bin/start-all.sh
web工具
集群监控
第三章
管理HDFS
数据文件在别处生成
合成大文件,HDFS存储,被分割成N个block分散在集群内部
JobTracker根据文件所在,安排Mapreduce的工作地址,所谓计算向数据移动嘛
对于mapreduce任务来说,其输入数据也就是对文件的读取一般是由Hadoop框架完成的
通常来说处理一个大文件要比处理若干小文件有效率。
Hadoop Api
FileSystem hdfs=FileSystem.get();
FileSystem disk=FileSystem.getLocal();
Path uri= new Path("schema://path");
FileStatus file;
FSDataInputStream stream = filesystem.open(path);
stream.close();
FSDataOutputStream stream = filesystem.create(path);
stream.close();
MapReduce框架
MapReduce框架 输入数据和输出数据都是以键值对为基础
其中键要求实现WritableComparable可以序列化可以比较
其中值要求实现Writable可以序列化
文件被分割成若干小块,离散存储在集群内
选择输入格式,来执行数据分割
InputFormat<K,V>
InputSplit[] getSplits(JobConf,int numSplits);
RecordReader<K,V> getRecordRead(InputSplit,JobConf,Reporter);
确定了对输入数据何如分片,小于HDFS中一个块的大小大于mapred.min.split.size字节,一般一个分片就是一个块
每个MapReduce任务被分配一个分片
循环提取分片中的记录,解析为预定义的键值对
TextInputFormat 一行为一个记录 <字节偏要,行文本>
KeyValueTextInputFormat 一行为一个记录 <分隔符前文本,分隔符后文本>
SequenceFileInputFormat<K,V> Hadoop专用的压缩二进制文件,专用作业 间的传递
NLineInputFormat TextInputFormat相同,每个分片有N行
conf.setInputFormat(xxxFormat.class);
开始map过程 void map(K1,V1,OutputCollection<K2,V2>,Report)throw IOException;
该函数处理一个给定的键值对
生成一个键值对列表,这是输出的结果
report是对任务的报告
IdentityMapper 直接映射
InverseMapper 反转
RegexMapper 为每个表达式的匹配生成一个计数为1的对
TokenCountMapper
在输出键值对列表前,我们可以将一个键的多项值进行合并
可以求合
也可以其他计算
OutputFormat<K,V>
分区,重定向mapper的输出,
如何确定map的输出分给哪一个节点?
默认是对键是默认的散列取值,相同的hash值分配到同一个节点
Interface Partitioner<Key,Writable>
public int getPartition(Key,Writable,int numberPartitions);
洗牌 这个过程是各个job节点间唯一通信的阶段,是扩展的瓶颈所在
在经过合并和分区之后,Reduce节点要拉取数据进入reduce计算
数据通过http从JobTracker获取,
在map阶段我们为了reduce能快速计算,对每个输出的keyvalue做了分区,标记了keyvalue属于哪个reduce节点
jobTracker告知reduce节点,在哪个DataNode上去拉取哪些keyvalue。
如果在map阶段有过排序,那么reduce的拉取就会集中在某一range,减少随机读,可以提高效率
reduce节点将拉取到的数据merge成一个文件可能在内存也可能在磁盘,将这个文件应用于reduce计算
整个过程表现 没有对map节点的结果全盘接受,而是不同reduce节点在每个map节点选择的性的拉取了部分数据,看上去像洗牌
合并,减小数据量
排序,减少随机读,促成批量顺序读
尽量将一个map节点的数据,对应一个reduce节点,避免两组机器通信的笛卡尔乘积
开始reduce过程 void reduce(K2,Iterator<V2>,OutputCollection<K3,V3>,Report)throw IOException;
接受来吧各个Mapper的数据,按照键进行排序,并对相同键的值进行归并。
然后再调用reduce函数,迭代处理相关的值列表
report报告任务进度
相关文章推荐
- 详解HDFS Short Circuit Local Reads
- Hadoop_2.1.0 MapReduce序列图
- 使用Hadoop搭建现代电信企业架构
- 单机版搭建Hadoop环境图文教程详解
- hadoop常见错误以及处理方法详解
- hadoop 单机安装配置教程
- hadoop的hdfs文件操作实现上传文件到hdfs
- hadoop实现grep示例分享
- MongoDB中的MapReduce简介
- MongoDB学习笔记之MapReduce使用示例
- MongoDB中MapReduce编程模型使用实例
- Apache Hadoop版本详解
- MapReduce中ArrayWritable 使用指南
- Java函数式编程(七):MapReduce
- linux下搭建hadoop环境步骤分享
- java连接hdfs ha和调用mapreduce jar示例
- hadoop client与datanode的通信协议分析
- hadoop中一些常用的命令介绍
- Hadoop单机版和全分布式(集群)安装