实验用集群由3台虚拟机组成
一、环境和软件版本:
CentOS 6.5 64位操作系统
Hadoop 2.5.2
Zookeeper 3.4.6
HBase 0.99.2
二、系统配置
1.iptables
默认CentOS会启动iptables以保证网络安全,需要关闭。
$ sudo service iptables stop
同时,将配置去掉# setup
在终端界面中,将防火墙配置(Firewall Configuration)中的启用状态取消。
2./etc/sysconfig/network
修改HOSTNAME字段为合适的主机名,如hadoop1,hadoop2等。
也有的系统使用/etc/hostname这个文件。
修改后需要重启。或者用hostname命令直接修改。
3./etc/hosts
$ sudo vi /etc/hosts
将127.0.0.1指向主机名的一行删除:127.0.0.1 hadoopX
X为具体的节点编号。否则会和后边添加的指向发生冲突。
然后在末尾添加以下内容(示例),使机器可以直接通过主机名访问IP。
192.168.16.240 hadoop1
192.168.16.241 hadoop2
192.168.16.242 hadoop3
4.SSH公钥
5.SSH互通在每台计算机配置公钥,使用默认配置即可:
$ ssh-keygen
三、Hadoop2.5.2注意:此步骤很重要,务必确保从每台计算机都可以无密码的ssh连通任意节点,否则可能在启动Hadoop时会发生异常。如果配置完成后仍然无法直通,则将所有主机的~/.ssh目录下文件都删除,重新执行ssh-keygen命令生成公钥私钥,再重新逐一复制、合并、下发。
以4台服务器的互通为例,在NameNode上执行以下操作,确保从NameNode可以ssh直通各节点。
然后将收集的公钥合并:$ cd ~/.ssh $ scp hadoop@192.168.16.241:/home/hadoop/.ssh/id_rsa.pub ./k1 $ scp hadoop@192.168.16.242:/home/hadoop/.ssh/id_rsa.pub ./k2 $ scp hadoop@192.168.16.243:/home/hadoop/.ssh/id_rsa.pub ./k3
然后执行以下命令:$ cat k1 >> authorized_keys $ cat k2 >> authorized_keys $ cat k3 >> authorized_keys
以上操作确保在known_hosts文件中都有各个主机,首次连接需要输入yes确认,之后每次执行上述ssh命令应当不用输入密码。$ ssh hadoop1 $ ssh hadoop2 $ ssh hadoop3
然后将authorized_keys和known_hosts下发到每个节点上:
known_hosts文件:$ scp authorized_keys hadoop@192.168.16.241:/home/hadoop/.ssh $ scp authorized_keys hadoop@192.168.16.242:/home/hadoop/.ssh $ scp authorized_keys hadoop@192.168.16.243:/home/hadoop/.ssh
$ scp known_hosts hadoop@192.168.16.241:/home/hadoop/.ssh $ scp known_hosts hadoop@192.168.16.242:/home/hadoop/.ssh $ scp known_hosts hadoop@192.168.16.243:/home/hadoop/.ssh
1.文件放置
2.环境变量建议将Hadoop安装在/opt下
$ tar xzvf hadoop-2.5.2.tar.gz $ mv hadoop-2.5.2 /opt
然后建议使用软连接:
创建Hadoop的数据存储目录$ ln -s /opt/hadoop-2.5.2 /opt/hadoop
$ sudo mkdir /hadoop $ mkdir /hadoop/dfs $ mkdir /hadoop/tmp $ mkdir /hadoop/mapred
3.配置文件在/etc/profile的末尾加入:
确保可以在任意位置执行hadoop命令。 然后将配置文件启用:export HADOOP_HOME=/opt/hadoop export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
$ source /etc/profile
默认的配置无法直接启动,需要对部分参数进行修改。
修改/opt/hadoop/etc/hadoop/slaves文件,加入DataNode的IP地址,类似:
192.168.4.242192.168.4.243
修改/opt/hadoop/etc/hadoop/hadoop-env.sh文件,将默认的JAVA_HOME修改为:
修改/opt/hadoop/etc/hadoop/core-site.xml文件,在<configuration>标签中(即嵌套在该标签中)加入以下内容:export JAVA_HOME=/opt/jdk1.7.0_45
<property> <name>hadoop.tmp.dir</name> <value>/hadoop/tmp</value> <description>temporary directories.</description> </property> <property> <name>fs.defaultFS</name> <value>hdfs://xxx.xxx.xxx.xxx:9000</value> <description>The name of the defaultfile system. Either the literal string "local" or a host:port forNDFS. </description> <final>true</final> </property>
修改hdfs-site.xml,在<configuration>标签中(即嵌套在该标签中)加入以下内容:
默认不存在mapred-site.xml,需要创建<property> <name>dfs.namenode.name.dir</name> <value>file:/hadoop/dfs/name</value> <description>Determineswhere on the local filesystem the DFS name node should store the name table.</description> <final>true</final> </property> <property> <name>dfs.datanode.data.dir</name> <value>file:/hadoop/dfs/data</value> <description>Determineswhere on the local filesystem an DFS data node should store its blocks. </description> <final>true</final> </property> <property> <name>dfs.replication</name> <value>1</value> </property> <property> <name>dfs.permissions</name> <value>false</value> </property>
$ cp mapred-site.xml.template mapred-site.xml $ vim mapred-site.xml
在<configuration>标签中(即嵌套在该标签中)加入以下内容:
修改yarn-site.xml,在<configuration>标签中(即嵌套在该标签中)加入以下内容:<property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> <property> <name>mapred.system.dir</name> <value>file:/hadoop/mapred/system</value> <final>true</final> </property> <property> <name>mapred.local.dir</name> <value>file:/hadoop/mapred/local</value> <final>true</final> </property>
yarn.resourcemanager.hostname配置后,其他端口号将使用默认,不需要单独再重新配置。192.168.16.241是NameNode的IP。<property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> <description>shuffle service that needsto be set for Map Reduce to run </description> </property> <property> <name>yarn.resourcemanager.hostname</name> <value>192.168.16.241</value> <description>hostanem of RM</description> </property>
4.DataNode安装
5.NameNode格式化NameNode配置完成后,在每个DataNode节点上重复3.1和3.2节的路径配置与全局变量修改。修改完成后,将/opt/hadoop复制到其他计算机上即可:
$ scp -r /opt/hadoop-2.5.2 hadoop2:/opt/ $ scp -r /opt/hadoop-2.5.2 hadoop3:/opt/
首先需要格式化namenode,在NameNode上执行:
如果不是第一次执行,则需要根据提示输入大写Y继续。$ hdfs namenode –format
6.启动HDFS停止使用:$ start-dfs.sh
有时候无法停止,请使用kill -9来结束jps中显示的hadoop相关进程。$ stop-dfs.sh
7.运行状态观察访问http://192.168.16.241:50070/看到Overview界面
四、Zookeeper
1.zookeeper文件夹zookeeper建议安装在奇数个节点上, zookeeper不存在NameNode这样的特殊节点,所以每个服务器上的配置是基本相同的,只有一个myid不一样。
2.参数配置以hadoop1服务器配置为例:
进入zookeeper文件夹,并建立data,datalog,logs文件夹:$ tar xvf zookeeper-3.4.6.tar.gz $ sudo mv zookeeper-3.4.6 /opt $ ln -s /opt/zookeeper-3.4.6 /opt/zookeeper
3.日志管理$ cd /opt/zookeeper $ mkdir data $ mkdir datalog $ mkdir logs
进入zookeeper的conf文件夹,将示例配置文件复制一个进行修改。仔细看配置文件zoo.cfg,不要删除默认的配置。在默认基础之上,修改dataDir和dataLogDir,并增加节点文件,使之未注释的部分像如下的示例:
需要将所有的子节点都配置进去。hadoopX表示了主机名。server.X表示一个内部编号,和之后写入myid文件的相同。tickTime=2000 initLimit=10 gement syncLimit=5 dataDir=/opt/zookeeper/data dataLogDir=/opt/zookeeper/datalog clientPort=2181 autopurge.snapRetainCount=5 autopurge.purgeInterval=1 server.1=yqhadoop1:2888:3888 server.2=yqhadoop2:2888:3888 server.3=yqhadoop3:2888:3888
另外,ZooKeeper的默认配置不会删除日志和快照,所以需要配置一下,在conf/zoo.cfg中,取消autopurge.snapRetainCount的注释,并修改:这个值建议比3大,比如设置为5 取消autopurge.purgeInterval的注释,采用默认值1(表示每1小时清理一次快照):autopurge.snapRetainCount=5
/opt/zookeeper/data/myid文件默认不存在,需要创建autopurge.purgeInterval=1
内容填写1即可,其他主机填写自身的编号。
4.环境变量ZooKeeper提供了log4j的配置文件,为了自动管理,需要按照日期进行配置。
注意:如果不配置日志位置,则默认会将日志存为zookeeper.out放在执行zkServer.sh start命令时候的文件夹位置。
log4j可以配置一个按照日期进行分离的日志模式,可以将默认的conf/log4j.properties备份一个,然后用下面这个替换:
# set logger log4j.rootLogger=DEBUG, CONSOLE, DR # the CONSOLE config log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender log4j.appender.CONSOLE.Threshold=DEBUG log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} [myid:%X{myid}] - %-5p [%t:%C{1}@%L] - %m%n # the dr config log4j.appender.DR=org.apache.log4j.DailyRollingFileAppender log4j.appender.DR.Threshold=DEBUG log4j.appender.DR.File=/opt/zookeeper/logs/zookeeper.log log4j.appender.DR.DatePattern='.'yyyy-MM-dd'.log' log4j.appender.DR.append=true log4j.appender.DR.layout=org.apache.log4j.PatternLayout log4j.appender.DR.layout.ConversionPattern=%d{ISO8601} [myid:%X{myid}] - %-5p [%t:%C{1}@%L] - %m%n
在这个配置文件中,共有两个日志输出,一个是CONSOLE也就是控制台可见的,另一个是按照日期会自动分割文件的日志,每天的日志会存放在以之前建立的/opt/zookeeper/logs里,目前设置的log级别为DEBUG,数据较多,一定时间后需要清理。可采用cron定期清理。
5.其他节点可以选择增加一个环境变量,在/etc/profile中增加如下:
export ZOOKEEPER_HOME=/opt/zookeeper export PATH=$PATH:$ZOOKEEPER_HOME/bin
然后进行一下更新:$ source /etc/profile
6.启动服务其他节点的配置和主节点是相同的,只要将做好的文件复制过去即可。例如,转移到hadoop2上:
每个节点的dataDir(/opt/zookeeper/data)下要建立一个myid的文件,文件内容是该节点的数字编号,如hadoop6就是6,hadoop7就是7。与之前在zoo.cfg中配置的数字一样。$ scp -r /opt/zookeeper hadoop2:/opt/
7.运行状态观察zookeeper需要在每个节点上启动,可以用ssh命令来远程启动。也可以手工在每个节点上启动。例如在hadoop6上,可以直接执行命令启动zookeeper:
然后再将hadoop7,hadoop8上的zookeeper启动。 关闭服务用:$ zkServer.sh start
$ zkServer.sh stop
五、HBase若之前配置正常,则可以在/opt/zookeeper/logs下看到zookeeper.log的日志,使用tail命令保持跟踪,即可观察服务的运行状态:
另外,也可以用jps命令查看: 可以看到QuorumPeerMain的进程,这个进程应当在所有运行ZooKeeper的服务器上都有。$ tail -f /opt/zookeeper/logs/zookeeper.log
安装完成Hadoop和Zookeeper以后,即可安装HBase。 将生成的文件复制到/opt下并软连接为hbase:
$ mv hbase-0.99.2 /opt/ $ ln -s /opt/hbase-0.99.2 /opt/hbase
进入该文件夹,并建立tmp文件夹:$ cd /opt/hbase $ mkdir tmp
1.环境变量
2.参数配置配置一下/etc/profile
配置之后source一下export HBASE_HOME=/opt/hbase export PATH=$PATH:$HBASE_HOME/bin
3.jar包到hbase的conf文件夹下,修改配置文件hbase-site.xml,向configuration标签中增加以下内容,xxx.xxx.xxx.xxx的位置均使用IP地址即可,不用使用主机名。
配置了HDFS的位置,也就是HBase保存数据的位置,另外是定义了master还有其他节点。另外,zookeeper也要在这里配置,提供上一章节中zookeeper的IP列表即可。<property> <name>hbase.rootdir</name> <value>hdfs://192.168.16.241:9000/hbase</value> </property> <property> <name>hbase.cluster.distributed</name> <value>true</value> </property> <property> <name>hbase.master</name> <value>192.168.16.241:60000</value> </property> <property> <name>hbase.tmp.dir</name> <value>/opt/hbase/tmp</value> </property> <property> <name>hbase.zookeeper.quorum</name> <value>192.168.16.241,192.168.16.242,192.168.16.243</value> </property>
另外,在之前的文档中介绍需要配置hbase-default.xml,在此版本中已经不需要,如果配置了该文件,启动时会发生异常错误。
然后修改hbase-env.sh,修改增加以下内容:
其中HBASE_OPTS的配置项目是可以按照规则修改,但是具体作用需要额外定义。详细的配置参数要在官网文档中找。因为已有的ZooKeeper而不是自带的,所以设置为false。HEAPSIZE设置一下无妨。export JAVA_HOME=/opt/jdk1.6.0_33 export HBASE_HEAPSIZE=2048 export HBASE_OPTS="-XX:+UseConcMarkSweepGC" export HBASE_OPTS="$HBASE_OPTS -XX:+HeapDumpOnOutOfMemoryError -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode" export HBASE_MANAGES_ZK=false export HBASE_HOME=/opt/hbase export HADOOP_HOME=/opt/hadoop
然后修改regionservers,增加所有HRegionServer的IP(以下为示例,请根据实际情况配置具体的RegionServer的IP地址):192.168.16.242 192.168.16.243
1)Hadoop
默认HBase 0.99.2自带的Hadoop包是2.5.1的,所以需要从hadoop的目录中替换相对应的所有jar包。HBase用到的Hadoop包在/opt/hbase/lib中。
Hadoop的包没有集中保存,分别保存在了很多目录,可以使用find命令查找需要的包。另外,hadoop-client-2.5.2.jar这个对应包是没有的,不影响使用。
2)ZooKeeper
默认HBase 0.99.2自带的zookeeper是3.4.6的,所以无须修改。
4.RegionServer节点
Slave的配置和Master是相同的,只要将做好的文件复制过去即可。
$ scp -r /opt/hbase 192.168.1.222:/opt/
另外,其他节点也配置一下/etc/profile
export HBASE_HOME=/opt/hbase export PATH=$PATH:$HBASE_HOME/bin
5.启动/关闭服务
启动hbase的服务用以下命令:
关闭$ start-hbase.sh
$ stop-hbase.sh
6.运行状态观察
当hbase启动后,可以用jps在master和region的服务器上看到如下信息: 对于Master:
对于Region:33283 HMaster
使用浏览器http://192.168.16.241:16010简单观察:可以看到HBase的运行状态24833 HRegionServer
7.Thrift服务启动使用HBase的伺服启动:
$ hbase-daemon.sh start thrift
六、基本使用然后用jps可以检查到ThriftServer
1.启动步骤
启动HDFS
# start-dfs.sh
启动ZooKeeper
启动HBase# zkServer.sh start # ssh yqhadoop2 /opt/zookeeper/bin/zkServer.sh start # ssh yqhadoop3 /opt/zookeeper/bin/zkServer.sh start
# start-hbase.sh
启动Thrift
hbase-daemon.sh start thrift
2.运行检查
在Master上,应能看到如下进程:
在Slave上,应能看到如下进程:[root@hadoop1 ~]# jps 11395 Jps 10894 QuorumPeerMain 7360 NameNode 11059 HMaster 11325 ThriftServer 7540 SecondaryNameNode
[root@hadoop2 ~]# jps 9043 HRegionServer 8956 QuorumPeerMain 9266 Jps 7264 DataNode