03 hadoop-分布式

来源:互联网 发布:网络教师招聘兼职 编辑:程序博客网 时间:2024/06/05 08:50

简易分布式

core-site.xml

<configuration> <property>   <name>fs.defaultFS</name>   <value>hdfs://node-01:9000</value> </property> <property>   <name>hadoop.tmp.dir</name>   <value>/home/hadoop/apps/tmp</value> </property></configuration>

hdfs.xml

<!-- Put site-specific property overrides in this file. --><configuration>   <property>     <name>dfs.namenode.name.dir</name>      <value>/home/hadoop/data/name</value>   </property>    <property>     <name>dfs.datanode.data.dir</name>      <value>/home/hadoop/data/data</value>   </property>    <property>     <name>dfs.replication</name>      <value>2</value>   </property>    <property>     <name>dfs.secondary.http.address</name>      <value>node-01:50090</value>   </property> </configuration>

mapred-site.xml

<configuration>  <property>    <name>mapreduce.framework.name</name>    <value>yarn</value>  </property></configuration>

yarn-site.xml

<configuration>   <property>     <name>yarn.resourcemanager.hostname</name>      <value>node-01</value>   </property>    <property>     <name>yarn.nodemanager.aux-services</name>      <value>mapreduce_shuffle</value>   </property> </configuration>

slaves

node-02node-03

HA

HA的运作机制

集群运作机制介绍
所谓HA,即高可用(7*24小时不中断服务)
实现高可用最关键的是消除单点故障
hadoop-ha严格来说应该分成各个组件的HA机制——HDFS的HA、YARN的HA

HDFS的HA机制详解
通过双namenode消除单点故障
双namenode协调工作的要点:

  • 元数据管理方式需要改变:
    内存中各自保存一份元数据
    Edits日志只能有一份,只有Active状态的namenode节点可以做写操作
    两个namenode都可以读取edits
    共享的edits放在一个共享存储中管理(qjournal和NFS两个主流实现)
  • 需要一个状态管理功能模块
    实现了一个zkfailover,常驻在每一个namenode所在的节点
    每一个zkfailover负责监控自己所在namenode节点,利用zk进行状态标识
    当需要进行状态切换时,由zkfailover来负责切换
    切换时需要防止brain split现象的发生

core-site.xml

<configuration>    <!-- 指定hdfs的nameservice为ns1 -->    <property>        <name>fs.defaultFS</name>        <value>hdfs://ns1/</value>    </property>    <!-- 指定hadoop临时目录 -->    <property>        <name>hadoop.tmp.dir</name>        <value>/home/hadoop/app/hadoop-2.4.1/tmp</value>    </property>    <!-- 指定zookeeper地址 -->    <property>        <name>ha.zookeeper.quorum</name>                 <value>weekend05:2181,weekend06:2181,weekend07:2181</value>    </property></configuration>

hdfs-site.xml

<configuration><!--指定hdfs的nameservice为ns1,需要和core-site.xml中的保持一致 --><property>    <name>dfs.nameservices</name>    <value>ns1</value></property><!-- ns1下面有两个NameNode,分别是nn1,nn2 --><property>    <name>dfs.ha.namenodes.ns1</name>    <value>nn1,nn2</value></property><!-- nn1的RPC通信地址 --><property>    <name>dfs.namenode.rpc-address.ns1.nn1</name>    <value>weekend01:9000</value></property><!-- nn1的http通信地址 --><property>    <name>dfs.namenode.http-address.ns1.nn1</name>    <value>weekend01:50070</value></property><!-- nn2的RPC通信地址 --><property>    <name>dfs.namenode.rpc-address.ns1.nn2</name>    <value>weekend02:9000</value></property><!-- nn2的http通信地址 --><property>    <name>dfs.namenode.http-address.ns1.nn2</name>    <value>weekend02:50070</value></property><!-- 指定NameNode的edits元数据在JournalNode上的存放位置 --><property>    <name>dfs.namenode.shared.edits.dir</name>    <value>qjournal://weekend05:8485;weekend06:8485;weekend07:8485/ns1</value></property><!-- 指定JournalNode在本地磁盘存放数据的位置 --><property>    <name>dfs.journalnode.edits.dir</name>    <value>/home/hadoop/app/hadoop-2.4.1/journaldata</value></property><!-- 开启NameNode失败自动切换 --><property>    <name>dfs.ha.automatic-failover.enabled</name>    <value>true</value></property><!-- 配置失败自动切换实现方式 --><property>    <name>dfs.client.failover.proxy.provider.ns1</name>    <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value></property><!-- 配置隔离机制方法,多个机制用换行分割,即每个机制暂用一行--><property>    <name>dfs.ha.fencing.methods</name>    <value>        sshfence        shell(/bin/true)    </value></property><!-- 使用sshfence隔离机制时需要ssh免登陆 --><property>    <name>dfs.ha.fencing.ssh.private-key-files</name>    <value>/home/hadoop/.ssh/id_rsa</value></property><!-- 配置sshfence隔离机制超时时间 --><property>    <name>dfs.ha.fencing.ssh.connect-timeout</name>    <value>30000</value></property></configuration>

集群节点规划

规划(10节点):

server01 namenode zkfc > start-dfs.sh
server02 namenode zkfc

server03 resourcemanager > start-yarn.sh
server04 resourcemanager

server05 datanode nodemanager
server06 datanode nodemanager
server07 datanode nodemanager

server08 journal node zookeeper
server09 journal node zookeeper
server10 journal node zookeeper

规划(3节点)
server01
namenode resourcemanager zkfc nodemanager datanode zookeeper journal node

server02
namenode resourcemanager zkfc nodemanager datanode zookeeper journal node

server05
nodemanager datanode zookeeper journal node

Datanode动态上下线

Datanode动态上下线很简单,步骤如下:
a) 准备一台服务器,设置好环境
b) 部署hadoop的安装包,并同步集群配置
c) 联网上线,新datanode会自动加入集群
d) 如果是一次增加大批datanode,还应该做集群负载重均衡

Namenode状态切换管理

//查看namenode工作状态   hdfs haadmin -getServiceState nn1//将standby状态namenode切换到activehdfs haadmin –transitionToActive nn1//将active状态namenode切换到standbyhdfs haadmin –transitionToStandby nn2

数据块的balance

启动balancer的命令:

start-balancer.sh -threshold 8

运行之后,会有Balancer进程出现:

上述命令设置了Threshold为8%,那么执行balancer命令的时候,首先统计所有DataNode的磁盘利用率的均值,然后判断如果某一个DataNode的磁盘利用率超过这个均值Threshold,那么将会把这个DataNode的block转移到磁盘利用率低的DataNode,这对于新节点的加入来说十分有用。Threshold的值为1到100之间,不显示的进行参数设置的话,默认是10。

HA下hdfs-api变化

客户端需要nameservice的配置信息,其他不变

/** * 如果访问的是一个ha机制的集群 * 则一定要把core-site.xml和hdfs-site.xml配置文件放在客户端程序的classpath下 * 以让客户端能够理解hdfs://ns1/中  “ns1”是一个ha机制中的namenode对——nameservice * 以及知道ns1下具体的namenode通信地址 */public class UploadFile {    public static void main(String[] args) throws Exception  {        Configuration conf = new Configuration();        conf.set("fs.defaultFS", "hdfs://ns1/");        FileSystem fs = FileSystem.get(new URI("hdfs://ns1/"),conf,"hadoop");        fs.copyFromLocalFile(new Path("g:/eclipse-jee-luna-SR1-linux-gtk.tar.gz"), new Path("hdfs://ns1/"));        fs.close();    }}