阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Ubuntu上使用Hadoop 2.x + HDFS Federation

78次阅读
没有评论

共计 9164 个字符,预计需要花费 23 分钟才能阅读完成。

为什么需要 Federation

HDFS Federation 能解决一下问题:

1. 支持多个 namespace, 为什么需要多个 namespace 呢,因为一个 namespace 由于 JVM 内存的限制,存放的元数据有限,因此支持的 datanode 数目也有限制。

下面的分析来自另一篇博客,这里转一下:

 由于 Namenode 在内存中存储所有的元数据(metadata),因此单个 Namenode 所能存储的对象(文件 + 块)数目受到 Namenode 所在 JVM 的 heap size 的限制。50G 的
heap 能够存储 20 亿(200 million)个对象,这 20 亿个对象支持 4000 个 datanode,12PB 的存储(假设文件平均大小为 40MB)。随着数据的飞速增长,存储的需求也随之增长。单个 datanode 从 4T 增长到 36T,集群的尺寸增长到 8000 个 datanode。存储的需求从 12PB 增长到大于 100PB。

2. 水平扩展出多个 namenode 后,就可以避免网络架构上的性能瓶颈问题

3. 多个应用可以使用各自的 namenode,从而相互隔离。

不过还是没有解决单点故障问题。

相关阅读

Ubuntu 13.04 上搭建 Hadoop 环境 http://www.linuxidc.com/Linux/2013-06/86106.htm

Ubuntu 12.10 +Hadoop 1.2.1 版本集群配置 http://www.linuxidc.com/Linux/2013-09/90600.htm

Ubuntu 上搭建 Hadoop 环境(单机模式 + 伪分布模式)http://www.linuxidc.com/Linux/2013-01/77681.htm

Ubuntu 下 Hadoop 环境的配置 http://www.linuxidc.com/Linux/2012-11/74539.htm

单机版搭建 Hadoop 环境图文教程详解 http://www.linuxidc.com/Linux/2012-02/53927.htm

搭建 Hadoop 环境(在 Winodws 环境下用虚拟机虚拟两个 Ubuntu 系统进行搭建)http://www.linuxidc.com/Linux/2011-12/48894.htm

更多 Hadoop 相关信息见 Hadoop 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=13

架构图

官方文档:http://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/Federation.html

架构图如下:

Ubuntu 上使用 Hadoop 2.x  + HDFS Federation

 

测试环境

现在准备两个 namenode server: namenode1 和 namenode2, /etc/hosts 里面的配置如下:

 

#hdfs cluster
192.168.1.71 namenode1
192.168.1.72 namenode2
192.168.1.73 datanode1
192.168.1.74 datanode2
192.168.1.75 datanode3
 现在来看看上面 5 台 server 的配置:

namenode1 和 namenode2 的配置

core-site.xml

<configuration>
  <property>
    <name>fs.defaultFS</name>
    <value>hdfs://namenode1:9000</value>
  </property>
  <property>
    <name>io.file.buffer.size</name>
    <value>131072</value>
  </property>
  <property>
    <name>net.topology.node.switch.mapping.impl</name>
    <value>org.apache.hadoop.net.ScriptBasedMapping</value>
    <description> The default implementation of the DNSToSwitchMapping. It                                                                                                                                           
    invokes a script specified in net.topology.script.file.name to resolve                                                                                                                                           
    node names. If the value for net.topology.script.file.name is not set, the                                                                                                                                       
    default value of DEFAULT_RACK is returned for all node names.                                                                                                                                                    
    </description>
  </property>
  <property>
    <name>net.topology.script.file.name</name>
    <value>/opt/rack.lsp</value>
  </property>
  <property>
    <name>net.topology.script.number.args</name>
    <value>100</value>
    <description> The max number of args that the script configured with                                                                                                                                             
    net.topology.script.file.name should be run with. Each arg is an                                                                                                                                                 
    IP address.                                                                                                                                                                                                      
    </description>
  </property>
</configuration>

注意,hdfs://namenode1:9000 在另一个 namenode2 上配置为 hdfs://namenode2:9000 刷新 namenode 的方法是:

hduser@namenode1:~$ refresh-namenodes.sh 
Refreshing namenode [namenode1:9000]
Refreshing namenode [namenode2:9000]

拓扑查询仍然可以使用:

hdfs dfsadmin -printTopology

hdfs-site.xml

<configuration>
  <property>
    <name>dfs.replication</name>
    <value>3</value>
  </property>
  <property>
    <name>dfs.namenode.name.dir</name>
    <value>file:/home/hduser/mydata/hdfs/namenode</value>
  </property>
  <property>
    <name>dfs.namenode.hosts</name>
    <value>datanode1,datanode2,datanode3</value>
  </property>
  <property>
    <name>dfs.blocksize</name>
    <value>268435456</value>
  </property>
  <property>
    <name>dfs.namenode.handler.count</name>
    <value>100</value>
  </property>
<!--hdfs federation begin-->
  <property>
    <name>dfs.federation.nameservices</name>
    <value>ns1,ns2</value>
  </property>
  <property>
    <name>dfs.namenode.rpc-address.ns1</name>
    <value>namenode1:9000</value>
  </property>
  <property>
    <name>dfs.namenode.rpc-address.ns2</name>
    <value>namenode2:9000</value>
  </property>
<!--hdfs federation end-->
</configuration>

注意添加了 hdfs federation 的配置,里面有两个 namespaces: ns1 和 ns2,分别位于 namenode1 和 namenode2 上。

slaves 文件

把 datanode 的 hostname 都写进去

datanode1
datanode2
datanode3

 

datanode 的配置

core-site.xml

<configuration>
  <property>
    <name>io.file.buffer.size</name>
    <value>131072</value>
  </property>
</configuration>

 

hdfs-site.xml

<configuration>
  <property>
    <name>dfs.datanode.data.dir</name>
    <value>file:/home/hduser/mydata/hdfs/datanode</value>
  </property>
  <!--hdfs federation begin-->
  <property>
    <name>dfs.federation.nameservices</name>
    <value>ns1,ns2</value>
  </property>
  <property>
    <name>dfs.namenode.rpc-address.ns1</name>
    <value>namenode1:9000</value>
  </property>
  <property>
    <name>dfs.namenode.rpc-address.ns2</name>
    <value>namenode2:9000</value>
  </property>
  <!--hdfs federation end-->
</configuration>

总体上来说,namenode 的配置比较多,包括 rack awareness 的设置。
现在在两个 namenode 上格式化,并启动:

hdfs namenode -format -clusterId csfreebird
hadoop-daemon.sh --config $HADOOP_CONF_DIR --script hdfs start namenode

因为曾经格式化过 namenode,要回答 y 表示重新格式化。

管理站点

在任何一个 namenode 节点上,仍然使用端口 50070, 访问的网址变成下面:http://namenode1:50070/dfsclusterhealth.jsp 网页截屏:

Ubuntu 上使用 Hadoop 2.x  + HDFS Federation

远程命令

为了能够集中管理各个节点,需要能够在一台 namenode server 上执行命令,远程管理所有节点,因此需要在每个节点上 libexec/Hadoop-config.sh 文件中开头添加一行 JAVA_HOME 变量配置:

 

export JAVA_HOME=/usr/lib/jvm/java-7-Oracle/

 

现在再 namenode1 上执行下面的命令,停止所有 hdfs 的服务:

 

hduser@namenode1:~$ stop-dfs.sh
Stopping namenodes on [namenode1 namenode2]
namenode2: no namenode to stop
namenode1: no namenode to stop
datanode2: no datanode to stop
datanode1: no datanode to stop
datanode3: no datanode to stop

 

负载均衡

在 namenode1 上可以启动 balancer 程序,采用默认的 node 策略。参考文档:http://hadoop.apache.org/docs/r2.3.0/hadoop-project-dist/hadoop-hdfs/Federation.html#Balancer

hduser@namenode1:~$ hadoop-daemon.sh --config $HADOOP_CONF_DIR --script "$bin"/hdfs start balancer
starting balancer, logging to /usr/local/hadoop/logs/hadoop-hduser-balancer-namenode1.out

 

错误处理

cluster id 不兼容

如果在启动 datanode 的时候日志中报错:

 

java.io.IOException: Incompatible clusterIDs

就把 dfs.datanode.data.dir 配置的目录删除,然后再次启动。

为什么需要 Federation

HDFS Federation 能解决一下问题:

1. 支持多个 namespace, 为什么需要多个 namespace 呢,因为一个 namespace 由于 JVM 内存的限制,存放的元数据有限,因此支持的 datanode 数目也有限制。

下面的分析来自另一篇博客,这里转一下:

 由于 Namenode 在内存中存储所有的元数据(metadata),因此单个 Namenode 所能存储的对象(文件 + 块)数目受到 Namenode 所在 JVM 的 heap size 的限制。50G 的
heap 能够存储 20 亿(200 million)个对象,这 20 亿个对象支持 4000 个 datanode,12PB 的存储(假设文件平均大小为 40MB)。随着数据的飞速增长,存储的需求也随之增长。单个 datanode 从 4T 增长到 36T,集群的尺寸增长到 8000 个 datanode。存储的需求从 12PB 增长到大于 100PB。

2. 水平扩展出多个 namenode 后,就可以避免网络架构上的性能瓶颈问题

3. 多个应用可以使用各自的 namenode,从而相互隔离。

不过还是没有解决单点故障问题。

相关阅读

Ubuntu 13.04 上搭建 Hadoop 环境 http://www.linuxidc.com/Linux/2013-06/86106.htm

Ubuntu 12.10 +Hadoop 1.2.1 版本集群配置 http://www.linuxidc.com/Linux/2013-09/90600.htm

Ubuntu 上搭建 Hadoop 环境(单机模式 + 伪分布模式)http://www.linuxidc.com/Linux/2013-01/77681.htm

Ubuntu 下 Hadoop 环境的配置 http://www.linuxidc.com/Linux/2012-11/74539.htm

单机版搭建 Hadoop 环境图文教程详解 http://www.linuxidc.com/Linux/2012-02/53927.htm

搭建 Hadoop 环境(在 Winodws 环境下用虚拟机虚拟两个 Ubuntu 系统进行搭建)http://www.linuxidc.com/Linux/2011-12/48894.htm

更多 Hadoop 相关信息见 Hadoop 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=13

架构图

官方文档:http://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/Federation.html

架构图如下:

Ubuntu 上使用 Hadoop 2.x  + HDFS Federation

 

测试环境

现在准备两个 namenode server: namenode1 和 namenode2, /etc/hosts 里面的配置如下:

 

#hdfs cluster
192.168.1.71 namenode1
192.168.1.72 namenode2
192.168.1.73 datanode1
192.168.1.74 datanode2
192.168.1.75 datanode3
 现在来看看上面 5 台 server 的配置:

namenode1 和 namenode2 的配置

core-site.xml

<configuration>
  <property>
    <name>fs.defaultFS</name>
    <value>hdfs://namenode1:9000</value>
  </property>
  <property>
    <name>io.file.buffer.size</name>
    <value>131072</value>
  </property>
  <property>
    <name>net.topology.node.switch.mapping.impl</name>
    <value>org.apache.hadoop.net.ScriptBasedMapping</value>
    <description> The default implementation of the DNSToSwitchMapping. It                                                                                                                                           
    invokes a script specified in net.topology.script.file.name to resolve                                                                                                                                           
    node names. If the value for net.topology.script.file.name is not set, the                                                                                                                                       
    default value of DEFAULT_RACK is returned for all node names.                                                                                                                                                    
    </description>
  </property>
  <property>
    <name>net.topology.script.file.name</name>
    <value>/opt/rack.lsp</value>
  </property>
  <property>
    <name>net.topology.script.number.args</name>
    <value>100</value>
    <description> The max number of args that the script configured with                                                                                                                                             
    net.topology.script.file.name should be run with. Each arg is an                                                                                                                                                 
    IP address.                                                                                                                                                                                                      
    </description>
  </property>
</configuration>

注意,hdfs://namenode1:9000 在另一个 namenode2 上配置为 hdfs://namenode2:9000 刷新 namenode 的方法是:

hduser@namenode1:~$ refresh-namenodes.sh 
Refreshing namenode [namenode1:9000]
Refreshing namenode [namenode2:9000]

拓扑查询仍然可以使用:

hdfs dfsadmin -printTopology

hdfs-site.xml

<configuration>
  <property>
    <name>dfs.replication</name>
    <value>3</value>
  </property>
  <property>
    <name>dfs.namenode.name.dir</name>
    <value>file:/home/hduser/mydata/hdfs/namenode</value>
  </property>
  <property>
    <name>dfs.namenode.hosts</name>
    <value>datanode1,datanode2,datanode3</value>
  </property>
  <property>
    <name>dfs.blocksize</name>
    <value>268435456</value>
  </property>
  <property>
    <name>dfs.namenode.handler.count</name>
    <value>100</value>
  </property>
<!--hdfs federation begin-->
  <property>
    <name>dfs.federation.nameservices</name>
    <value>ns1,ns2</value>
  </property>
  <property>
    <name>dfs.namenode.rpc-address.ns1</name>
    <value>namenode1:9000</value>
  </property>
  <property>
    <name>dfs.namenode.rpc-address.ns2</name>
    <value>namenode2:9000</value>
  </property>
<!--hdfs federation end-->
</configuration>

注意添加了 hdfs federation 的配置,里面有两个 namespaces: ns1 和 ns2,分别位于 namenode1 和 namenode2 上。

slaves 文件

把 datanode 的 hostname 都写进去

datanode1
datanode2
datanode3

 

datanode 的配置

core-site.xml

<configuration>
  <property>
    <name>io.file.buffer.size</name>
    <value>131072</value>
  </property>
</configuration>

 

hdfs-site.xml

<configuration>
  <property>
    <name>dfs.datanode.data.dir</name>
    <value>file:/home/hduser/mydata/hdfs/datanode</value>
  </property>
  <!--hdfs federation begin-->
  <property>
    <name>dfs.federation.nameservices</name>
    <value>ns1,ns2</value>
  </property>
  <property>
    <name>dfs.namenode.rpc-address.ns1</name>
    <value>namenode1:9000</value>
  </property>
  <property>
    <name>dfs.namenode.rpc-address.ns2</name>
    <value>namenode2:9000</value>
  </property>
  <!--hdfs federation end-->
</configuration>

总体上来说,namenode 的配置比较多,包括 rack awareness 的设置。
现在在两个 namenode 上格式化,并启动:

hdfs namenode -format -clusterId csfreebird
hadoop-daemon.sh --config $HADOOP_CONF_DIR --script hdfs start namenode

因为曾经格式化过 namenode,要回答 y 表示重新格式化。

正文完
星哥说事-微信公众号
post-qrcode
 
星锅
版权声明:本站原创文章,由 星锅 2022-01-20发表,共计9164字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中