Hadoop体系结构
★ Hadoop版本
Apache官方版本
Cloudera
Yahoo内部版本
★ 两大核心
HDFS 和 MapReduce
HDFS是Hadoop File System Hadoop文件系统 它是一个分布式的文件系统
MapReduce 并行的计算框架 数据来源于HDFS
★ HDFS的架构
它是一个主从结构的
主结点:NameNode,且只有一个
从结点:DataNode,可以有多个
▲ NameNode功能
接收用户的操作请求
维护文件系统的目录结构
维护文件与block之间的关系,HDFS中的文件是分割成block来保存的。
还要维护block与DataNode之间的关系
▲ DataNode功能
存储文件
存储的是block块,保存在DataNode的磁盘上
为保证数据安全,文件有多个副本,保存在不同的DataNode中
★ MapRreduce的架构
也是一个主从结构
主结点:JobTracker
从结点:TaskTracker
▲ JobTracker功能
接收客户提交的计算任务
把任务分配给TaskTracker执行
监控TaskTracker的执行情况
▲ TaskTracker功能
执行JobTracker分配给的任务
★ Hadoop的特点
扩容能力高:可以可靠地存储和处理千兆PB数据
成本低:可以通过普通机器组成的服务器集群来并行计算,从而达到目的
高效率:通过分发数据,可以在多个节点上并行parallel地处理数据
可靠性:依托的是Hadoop的并行机制,可以多个副本
★ Hadoop集群的物理分布
物理分布图如下所示,通过交换机连接
一个主节点,多个从节点。
★ 单节点的物理结构
NameNode DataNode JobTracker TaskTracker SecondaryNameNode这些进程是运行在虚拟机JVM上的。
★ Hadoop的部署方式
▲本地模式
略。
▲伪分布模式
Hadop的进程(NameNodeDataNode,JobTracker,TaskTracker,SecondNameNode)运行在一台物理机器上。
▲集群模式
不同的进程运行在不同的物理机器上。
★伪分布模式部署
▲ 软件准备
1. 安装虚拟机,可以用vmware或virtualbox等虚拟机软件
2.安装linux操作系统,及对系统的一些设置,如SSH IP 等
3.安装jdk
4.安装Hadoop
PS:
※虚拟机的网络配置,配置Host-only连接方式,找一个网段,组建一个单独的网络。安装的虚拟机中的机器的IP设置成单独的网段的IP,即可。
※如果网络配置的是桥接,则虚拟机与物理机的IP地址要在同一个网段,否则不能正常访问。
▲ 关闭防火墙
关闭:service iptables stop
验证:service iptables status
关闭防火墙自动运行
关闭:chkconfig iptables off
验证:chkconfig --list | grep iptables
▲ 设置ip地址
修改配置文件: vi /etc/sysconfig/network-scripts/ifcfg-eth0
配置完执行命令:service network restart
验证:ifconfig 查看ip配置
▲ 修改主机名hostname
1.hostname hadooptest #只对当前会话生效
2.vi /etc/sysconfig/network #修改主机名 hostname后的名字为要设置的主机名
▲ ip地址与hostname的绑定
vi /etc/hosts #修改映射文件
▲ SSH免密码登录
执行命令:ssh-keygen -t rsa
创建公钥id_rsa.pub和私钥id_rsa
添加公钥到authorized_keys文件中
cp ~/.ssh/id_rsa.pub ~/.ssh/id_rsa/authorized_keys
ps:known_hosts文件中保存的是可以ssh免密码登录到的地址
当ssh localhost的时候,会给known_hosts文件中添加一条记录,该条记录,记录的就是可以免密码登录的hostname或ip地址。
▲ JDK安装
上传jdk-6u24-linux-i586.bin 如果是64位的linux系统,则选择对应的安装文件
chmod a+x jdk-6u24-linux-i586.bin #设置该bin文件的执行权限
./ jdk-6u24-linux-i586.bin
设置环境变量JAVA_HOME #在/etc/profile文件中配置环境变量
source /etc/profile
验证命令:java -version
▲ hadoop安装
上传haoop压缩包hadoop-1.1.2.tar.gz
在/etc/profile文件中配置HADOOP_HOME环境变量
source /etc/profile
配置$HADOOP_HOME/conf/目录下的四个配置文件,如下所示:
1. hadoop-env.sh
# The java implementation to use. Required.
export JAVA_HOME=/usr/local/jdk1.6
2. core-site.xml
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://hadooptest:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/local/hadoop1/tmp</value>
</property>
</configuration>
3. hdfs-site.xml
<configuration>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
</configuration>
4. mapred-site.xml
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>hadooptest:9001</value>
</property>
</configuration>
配置完成后格式化文件系统,执行如下命令
hadoop namenode -format
执行完成后的结果:
[root@hadooptesthadoop1]# cd tmp
[root@hadooptesttmp]# pwd
/usr/local/hadoop1/tmp
[root@hadooptesttmp]# ll
total8
drwxr-xr-x.5 root root 4096 Jul 15 18:32 dfs
drwxr-xr-x.3 root root 4096 Jul 15 18:32 mapred
在上述配置文件core-site.xml文件中的配置文件中hadoop.tmp.dir指定的目录下多出了两个文件夹,分别是dfs和mapred,用来保存Hadoop运行时的一些临时文件。
启动Hadoop
执行命令:start-all.sh
验证启动是否成功:
执行命令:jps
如果出现如下五个进程,则表示hadoop启动成功。
[root@hadooptest logs]# jps
4798 TaskTracker
5100 Jps
4597 SecondaryNameNode
4362 NameNode
4680 JobTracker
4472 DataNode
如果启动失败,可以参考下面的日志文件中的报错信息。
▲ 日志文件
保存路径:/usr/local/hadoop1/logs
hadoop-root-datanode-hadooptest.log
hadoop-root-jobtracker-hadooptest.log
hadoop-root-namenode-hadooptest.log
hadoop-root-secondarynamenode-hadooptest.log
hadoop-root-tasktracker-hadooptest.log
以上五个日志文件是运行时的日志文件,分类保存日志信息。
▲ Hadoop常用端口
50030 可以查看正在运行的job等 jobtracker.jsp
Hadoop Map/Reduce Administration
50070 查看HDFS文件系统的健康状况 dfshealth.jsp
以上两个是常用的端口,其它略。
★ Hadoop的配置文件
Hadoop的核心配置包括如下:core-site.xml hadoop-env.xml hdfs-site.xml mapred-site.xml master slave
▲ core-site.xml
core-site.xml为Hadoop的核心属性文件,参数为Hadoop的核心功能,独立于HDFS和MapReduce。
参数 | 含义 |
fs.default.name | 设置Hadoop namenode的hostname及port, 预设是Standalone mode |
hadoop.tmp.dir | 默认值/tmp/hadoop-${user.name} 在tmp下根据username生成不同的目录 |
fs.checkpoint.dir | 默认值${hadoop.tmp.dir}/dfs/namesecondary Sencondary NameNode 镜像存储目录 |
fs.checkpoint.period | 默认值: 3600(秒) 控制 secondary namenode 的 checkpoint 时间间隔。如果距离上次 checkpoint 的时间大于这个参数的设定,就会触发 checkpoint。secondary namenode 會把 namenode 的 fsimage 和 editlog 做 snapshot。如果存取 Hadoop 的次数频繁或为了減少重起 namenode 的 downtime,可以把這个值设小一点。 |
fs.checkpoint.size | 默认值67108864(byte) 如果 Hadoop 非常的忙碌,editlog 可能会在短时间內变的很大,fs.checkpoint.period 的设定不见得可以完全预测这个状况,所以保险的做法会多设定这个值,以保证当数据大到超过 fs.checkpoint.size 的值也会触发 checkpoint。 |
io.file.buffer.size | 默认值 4096 這是读写 sequence file 的 buffer size, 可减少 I/O 次数。在大型的 Hadoop cluster,建议可设定为 65536 到 131072。 |
ipc.client.connection.maxidletime | 默认值 10000(毫秒) 设定 Hadoop client 连接時最大的闲置,默认是是 10 秒。如果 Hadoop cluster 的网络联系不稳,可以把这个值设到 60000(60秒) |
ipc.server.tcpnodelay | 默认值 false 在 Hadoop server 是否启动 Nagle’s 算法。设 true 会 disable 这个演算法,关掉会减少延迟,但是会增加小数据包的传输。server site 不太需要这定这个值。 |
hadoop.security.authorization | 默认值 false 是不是要开启 账号验证机制,开启之后 Hadoop 在执行任何动作之前都会先确认是否有权限。详細的权限设定会放在 hadoop-policy.xml 裡。例如要让 fenriswolf 这个 account 及 mapreduce group 可以 submit M/R jobs,要设定security.job.submission.protocol.acl |
hadoop.security.authentication | 默认值 simple simple 表示沒有 authentication,Hadoop 會用 system account 及 group 來控管q权限。 |
fs.trash.interval | 默认值 0(分) 清掉垃圾筒的时间。预设是不清, 所以在刪除文件时要自己执行 |
hadoop.native.lib | 默认 Hadoop 会去找所有可用的 native libraries 并自动 load 进來使用 |
▲ hdfs-site.xml
参数列表
•dfs.block.size
•默认值67108864(字节)
•默认每個 block 是 64MB。如果確定存取的文件块都很大可以改為 134217728(128MB)。Client 也可自行决定要使用的 block size 而不需要更改整個 cluster 的设定。
•dfs.safemode.threshold.pct
•默认值 0.999f
• Hadoop 启动时会进入 safemode,也就是安全模式,這时是不能写入数据的。只有当99.9% 的 blocks 达到最小的 dfs.replication.min 数量(默认是3)才会离开safe mode。在 dfs.replication.min 设的比较大或 data nodes 数量比较多时会等比较久。
•dfs.namenode.handler.count
•默认值 10
•设定 namenode server threads 的数量,这些 threads 會用 RPC 跟其他的 datanodes沟通。当 datanodes 数量太多时会发現很容易出現 RPC timeout,解決方法是提升网络速度或提高这个值,但要注意的是 thread 数量多也表示 namenode 消耗的内存也随着增加
•dfs.datanode.handler.count
•默认值 3
• 指定 data node 上用的 thread 数量。
•dfs.datanode.max.xcievers
•默认值 256
•这个值是指定 datanode 可同時处理的最大文件数量、
•dfs.datanode.du.reserved
•默认值 0
•默认值表示 data nodes 会使用整个磁盘,写满之后会导致无法再写入 M/R jobs。如果还有其他程式共用这些目录也会受到影响。建议保留至少 1073741824(1G) 的空间。
▲ mapred-site.xml
参数列表
•io.sort.mb
•默认值100
•缓存map中间结果的buffer大小(in MB)
•io.sort.record.percent
•默认值 0.05
•io.sort.mb中用来保存map output记录边界的百分比,其他缓存用来保存数据
•io.sort.spill.percent
•默认值0.80
•map开始做spill操作的阈值
•io.sort.factor
•默认值 10
•做merge操作时同时操作的stream数上限。
•min.num.spill.for.combine
•默认值3
•combiner函数运行的最小spill数
•mapred.compress.map.output
•默认值 false
•map中间结果是否采用压缩
•mapred.map.output.compression.codec
•org.apache.hadoop.io.compress.DefaultCodec
•min.num.spill.for.combine
•默认值3
•combiner函数运行的最小spill数
•mapred.compress.map.output
•默认值 false
•map中间结果是否采用压缩
•mapred.map.output.compression.codec
•org.apache.hadoop.io.compress.DefaultCodec
•mapred.reduce.parallel.copies
•默认值5
•每个reduce并行下载map结果的最大线程数
•mapred.reduce.copy.backoff
•默认值 300
•reduce下载线程最大等待时间(in sec)
•io.sort.factor
•默认值10
•org.apache.hadoop.io.compress.DefaultCodec
•mapred.job.shuffle.input.buffer.percent
•默认值0.7
•用来缓存shuffle数据的reduce task heap百分比
•mapred.job.shuffle.merge.percent
•默认值 0.66
•缓存的内存中多少百分比后开始做merge操作
•mapred.job.reduce.input.buffer.percent
•默认值0.0
•sort完成后reduce计算阶段用来缓存数据的百分比
★ Hadoop HA
Hadoop1.0架构的问题
单点故障
•如果NameNode或者JobTraker关掉,那么整个集群瘫痪。
•对于7×24生产环境,是具有极大的风险。
第二部分:常见的HA方案
•第一种是可以设置一个NFS的目录,存储fsimage和editlog,存储的是实时数据,这样当namenode挂掉后能够通过fsimage和editlog进行完全恢复。
•第二种是设置Secondary Namenode。
•问题:不能迅速的切换,需要花费一定时间恢复。
FaceBook的方案
•不改变namenode和datanode整体逻辑的基础上,在其上层开发出AvaterNode,AvatarNode的意思就是支持互相切换。
•提供一个Primary Avatar和一个Standby Avatar,通过virual IP来设置IP地址。
•Primary Avatar对外提供服务,设置了NFS目录,将FSImage和EditLog远程存储。Standby Avatar将NFS目录中的FSImage和EditLog读取过来进行同步,并且设置Standby Avatar一直处于safemode状态,不影响正常操作。这样Standby Avatar相当于一个热拷贝,获得了所有的实时数据。
Hadoop0.23 是如何解决的HA
提供2台机器做双机热备
一台为Active 节点,一台为StandBy节点
同时只有Active节点对外提供服务
源数据存储在共享存储
StandBy会时刻到共享存储拿Meta信息,以保证切换时不会丢掉数据
DataNode会向2台机器汇报自己的信息
仍需要配置Sencondary NameNode接解决Edits log变大问题