搭建Hadoop集群

来源:互联网 发布:动态规划矩阵连乘问题 编辑:程序博客网 时间:2024/05/16 08:08

Hadoop由HDFS和MapReduce计算框架两部分构成。另有基于Hadoop开发的一些上层应用如HBase、Pig、Hive使得Hadoop更适合解决特定问题或更容易使用。

一、HDFS和MapReduce

在大数据问题上,HDFS用存储,MapReduce用于计算。尽管Hadoop中的HDFS和MapReduce计算框架可以独立部署、独立使用,但在实际使用过程中通常将二者同时部署。
使用的版本:Hadoop-1.1.2

准备部署环境

1)使用VMWare克隆三台虚拟机,分别设置好主机名和IP地址,确保三台虚拟机能够互通。以Ubuntu 12.04为例
 在/etc/hostname中指定主机名:hadoop-node-1、hadoop-node-2、hadoop-node-3
 在/etc/network/interfaces中配置静态IP:192.168.1.201、192.168.1.202、192.168.1.203
  auth eth0
  iface eth0 inet static
  address 192.168.1.xxx
  gateway 192.168.1.gxx
  netmask 255.255.255.0
 在/etc/hosts中指定主机名地址映射
  127.0.0.1 localhost
  192.168.1.201 hadoop-node-1
  192.168.1.202 hadoop-node-2
  192.168.1.203 hadoop-node-3
2)确保在三台虚似机上安装了Java,最低版本1.6
3)确保在三台虚拟机上安装了SSH服务及其客户端

集群结点规划

HDFS和MapReduce均为Master/Slaver结构。这里我们使用三个结点,一个结点(hadoop-node-1)用作Master,运行HDFS的NodeNode程序和MapReduce的JobTracker程序,另两个结点(hadoop-node-2和hadoop-node-3)用作Slaver,在每个Slaver上运行HDFS的DataNode程序和MapReduce的TaskTracker程序。

SSH无口令登录

为使Master启动程序能够自动登录到Slaver上启动需要的Slaver程序,需要为Master配置SSH无口令登录。
 首先,在Master(hadoop-node-1)上生成密钥对,执行命令ssh-keygen -t rsa -f ~/.ssh/id_rsa,在命令执行过程中选择默认公钥文件名和空口令,命令执行结束后便在~/.ssh目录下生成了私钥文件id_rsa和公钥文件id_rsa.pub。
 然后,将上一步生成的公钥文件的内容附写到两个用作Slaver的结点的~/.ssh/authorized_keys文件中。附写可以使用命令 cat file1 >> file2,远程拷贝可以使用scp命令。
 

部署和配置

1)将下载得到的Hadoop压缩包解压到三台虚拟机的相同位置。这里使用相同位置是必要的,Master启动程序通过SSH登录到Slaver所在虚拟机后要到“同一”位置启动Slaver程序。
2)指定Java
 在conf/hadoop-env.sh中指定Java的安装位置,如:export JAVA_HOME=/usr/lib/jvm/java-6-openjdk-i386
3)Master配置
 在conf/core-site.xml文件中指定NameNode的绑定地址和端口,JobTracker也将根据此配置项确定要使用的文件系统的访问地址。
  <property>
   <name>fs.default.name</name>
   <value>hdfs://hadoop-node-1:9000</value>
  </property>
 在conf/hdfs-site.xml文件中指定NameNode需要的配置信息,如元数据存储位置、数据块副本数、是否启用权限检查。
  <property>
   <name>dfs.name.dir</name>
   <value>/HADOOP_HOME/hdfs-data</value> <!-- 若没有特殊考虑,可以将数据目录和Hadoop的文件放一起,方便管理 -->
  </property>
  <property>
   <name>dfs.replication</name>
   <value>2</value> <!-- 我们只有两个Slaver,所以副本数尽可能不要大于2 -->
  </property>
  <property>
   <name>dfs.permissions</name> <!-- HDFS的权限检查实在没有必要,关闭权限检查,免得出现客户端无权访问的问题 -->
   <value>false</value>
  </property>
 在conf/mapred-site.xml文件中指定JobTracker需要的配置信息,如JobTracker的绑定地址和端口。
  <property>
   <name>mapred.job.tracker</name>
   <value>hadoop-node-1:9001</value>
  </property>
 在conf/slaves文件中指定各个Slaver所在的主机。NameNode和JobTracker的启动程序会据此登录到相应主机启动各个DataNode和TaskTracker。
 若有需要,可以在conf/masters文件中指定需要运行SecondaryNameNode的主机。否则,清空该文件。
4)Slaver配置
 在conf/core-site.xml文件中为DataNode指定NameNode的访问地址。
  <property>
   <name>fs.default.name</name>
   <value>hdfs://hadoop-node-1:9000</value>
  </property>
 在conf/hdfs-site.xml文件中指定DataNode需要的配置信息,如数据块存储位置。需要注意,数据块的存储目录应该只允许所有者写(rwxr-xr-x),否则DataNode会出错。
  <property>
   <name>dfs.data.dir</name>
   <value>/HADOOP_HOME/hdfs-data</value> <!-- 若没有特殊考虑,可以将数据目录和Hadoop的文件放一起,方便管理 -->
  </property>
 在conf/mapred-site.xml文件中指定TaskTracker需要的配置信息,如JobTracker的访问地址、Map任务的中间结果的本地存储位置。
  <property>
   <name>mapred.job.tracker</name>
   <value>hadoop-node-1:9001</value>
  </property>
  <property>
   <name>mapred.local.dir</name>
   <value>/HADOOP_HOME/mapred-data</value> <!-- 若没有特殊考虑,可以将数据目录和Hadoop的文件放一起,方便管理 -->
  </property>

启动Hadoop集群

1)在NameNode所在结点(hadoop-node-1)
 启动HDFS:bin/start-dfs.sh 停止HDFS:bin/stop-dfs.sh 默认查看页面:http://hadoop-node-1:50070
2)在JobTracker所在结点(hadoop-node-1)
 启动MapReduce:bin/start-mapred.sh 停止MapReduce:bin/stop-mapred.sh 默认查看页面:http://hadoop-node-1:50030
 

二、HBase

HBase是一款分布式、面向列存储的NoSQL数据库。对于小量数据、更新操作,直接访问HDFS效率不高,在这种情况下可以使用HBase。
使用版本:Hbase-0.95.0-Hadoop1

这里还是使用前面准备好的三台虚拟机来部署、运行HBase。
部署方案:在hadoop-node-1上运行一个Master程序,而在hadoop-node-2和hadoop-node-3上各运行一个RegionServer程序;使用随HBase一起启动和停止的ZooKeeper集群,ZooKeeper集群在三台虚拟机上各运行一个Peer。

部署和配置

1)将下载得到的HBase压缩包解压到三台虚拟机的相同位置。这里使用相同位置是必要的,Master启动程序通过SSH登录到远程虚拟机后要到“同一”位置启动RegionServer程序和ZooKeeper程序。
2)指定Java
 在conf/hbase-env.sh中指定Java的安装位置,如:export JAVA_HOME=/usr/lib/jvm/java-6-openjdk-i386
3)配置HBase
 在conf/hbase-site.xml文件中指定HBase需要的配置信息,如用来持久存储数据的文件系、是否以分布模式运行、运行ZooKeeper集群的主机。
  <property>
    <name>hbase.rootdir</name>
    <value>hdfs://hadoop-node-1:9000</value> <!-- 使用HDFS作为底层持久存储系统是典型使用场景 -->
  </property>
  <property>
    <name>hbase.cluster.distributed</name>
    <value>true</value> <!-- 以分布模式运行 -->
  </property>
  <property>
    <name>hbase.zookeeper.quorum</name>
    <value>hadoop-node-1,hadoop-node-2,hadoop-node-3</value> <!-- 指定运行ZooKeeper集群的主机,在我们的方案中,HBase启动程序在启动HBase的同时会去指定的主机启动ZooKeeper集群 -->
  </property>
 在conf/regionservers文件中指定要运行RegionServer程序的各台主机,每行指定一个主机名或IP地址。
4)配置ZooKeeper
 这里暂时需要配置的ZooKeeper配置项不多,可以在HBase的主配置文件conf/hbase-site.xml中添加ZooKeeper的配置信息。
  <property>
    <name>hbase.zookeeper.property.dataDir</name>
    <value>/HBASE_HOME/zk-data</value> <!-- 指定ZooKeeper的数据存储位置。若没有特殊考虑,可以将ZooKeeper的数据目录和HBase的文件放一起,方便管理 -->
  </property>
 

启动HBase集群

首先确保要使用的HDFS已经启动。然后,在要运行HBase的Master程序的结点(hadoop-node-1)执行命令:
启动HBase:bin/start-hbase.sh 停止HBase:bin/stop-hbase.sh 启动HBase的Shell程序:bin/hbase shell
Master默认查看页面:http://hadoop-node-1:60010  RegionServer默认查看页面:http://hadoop-node-2:60030、http://hadoop-node-3:60030