Hadoop-2.6.0 + Zookeeper-3.4.6 + HBase-0.98.9-hadoop2环境搭建示例

1    基本信息

1.1     软件信息

hadoop-2.6.0java

zookeeper-3.4.6node

hbase-0.98.9-hadoop2linux

(如下示例中使用的操做系统是Centos 6.5,请将下载的3个tar包分别解压并放置在/usr/local/目录下)程序员

(Hbase包中lib里能够看到zookeeper的jar包,从文件名能够肯定使用的zookeeper版本)web

1.2     集群组成:

Server Nameshell

Hadoop Clusterapache

Zookeeper Ensemblebash

HBase Cluster网络

hadoopnamenodesession

Name node & Resource manager

Master

hadoop2ndnamenode

Secondary name node

 

hadoopdatanode1

Data node & Node manager

Region server

hadoopdatanode2

Data node & Node manager

 

Region server

hadoopdatanode3

Data node & Node manager

 

Region server

 

2    Hadoop集群

2.1     配置

2.1.1      core-site.xml

<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoopnamenode:9000</value>
</property>
</configuration> 

2.1.2      hdfs-site.xml

<configuration>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/root/hadoopdata/namenode</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/root/hadoopdata/datanode</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop2ndnamenode:9001</value>
</property>
</configuration> 

2.1.3      mapred-site.xml

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

2.1.4      yarn-site.xml

<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>hadoopnamenode:8025</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>hadoopnamenode:8030</value>
</property>
<property>
<name>yarn.resourcemanager.address</name>
<value>hadoopnamenode:8040</value>
</property>
</configuration>

2.1.5      slaves

hadoopdatanode1
hadoopdatanode2
hadoopdatanode3

2.1.6      /etc/hosts

153.65.170.45   hadoopnamenode.mh.com   hadoopnamenode
153.65.171.174  hadoop2ndnamenode.mh.com   hadoop2ndnamenode
153.65.171.20  hadoopdatanode1.mh.com   hadoopdatanode1
153.65.170.204  hadoopdatanode2.mh.com   hadoopdatanode2
153.65.170.85  hadoopdatanode3.mh.com   hadoopdatanode3

2.1.7      ~/.bashrc

与上一篇博客介绍的Hadoop 1相似,为了方便起见,修改.bashrc设置环境变量,注意sbin最好也要加到path中:

export HADOOP_PREFIX=/usr/local/hadoop-2.6.0
export HADOOP_MAPRED_PREFIX=$HADOOP_PREFIX
export HADOOP_HDFS_PREFIX=$HADOOP_PREFIX
export HADOOP_YARN_PREFIX=$HADOOP_PREFIX
export PATH=$PATH:$HADOOP_PREFIX/bin
export PATH=$PATH:$HADOOP_PREFIX/sbin

2.1.8      分发到集群的其它机器

把hadoop-2.6.0文件夹连同修改后的配置文件以及hosts文件,经过scp拷贝到其它四台机器上。

(并无要求说全部的机器上都使用同样的配置文件,好比namenode的hdfs-site.xml应该是不须要dfs.datanode.data.dir配置,而datanode的hdfs-site.xml应该不须要dfs.namenode.name.dir配置。而也只有namenode上须要配置slaves文件。这里是为了简单起见,咱们让全部机器上都保持同样的配置)

2.1.9      设置ssh免密码访问

参见上一篇博客。

2.1.10   一些配置参数的解释

Hadoop 2中没有mapred.job.tracker了,新框架中已改成yarn-site.xml 中的 resouceManager 及 nodeManager具体配置项,新框架中历史 job 的查询已从Job tracker剥离,纳入单独的mapreduce.jobtracker.jobhistory 相关配置。

yarn.resourcemanager.address---NodeManager 与 RM 通讯的接口地址

yarn.resourcemanager.scheduler.address---NodeManger 须要知道 RM 主机的 scheduler 调度服务接口地址

yarn.resourcemanager.resource-tracker.address---NodeManager 须要向 RM 报告任务运行状态供 Resouce 跟踪,所以 NodeManager 节点主机须要知道 RM 主机的 tracker 接口地址

yarn.resourcemanager.webapp.address---各个 task 的资源调度及运行情况经过经过该 web 界面访问

2.2     建立目录

在namenode上建立: /root/hadoopdata/namenode

在3台datanode上建立: /root/hadoopdata/datanode

(也可让hadoop自动建立) 

2.3     启动/关闭

start-dfs.sh,执行以后,使用jps命令查看java进程状况:

hadoopnamenode上有namenode进程,

hadoop2ndnamenode上有secondarynamenode进程,

hadoopdatanode1, hadoopdatanode2, hadoopdatanode3上有datanode进程

 

start-yarn.sh,执行以后的java进程状况:

hadoopnamenode上有namenode, resourcemanager进程,

hadoop2ndnamenode上有secondarynamenode进程,

hadoopdatanode1, hadoopdatanode2, hadoopdatanode3上有datanode, nodemanager进程

 

关闭的命令对应的是stop-dfs.sh, stop-yarn.sh

2.4     测试

hdfs dfsadmin -report //查看hdfs的一些基本信息

yarn node –list //查看yarn的一些基本信息

可使用hadoop的share目录下的一些mapreduce示例程序进行测试,好比wordcount:

先使用copyFromLocal命令(后续有介绍用法)把一个本地文本文件放到hdfs的/book目录下,而后执行:

hadoop jar /usr/local/hadoop-2.6.0/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0.jar wordcount   /book   /out2

即对/book目录下的书进行单词统计,而后输出到/out2目录。

 

能够登陆web界面检查hadoop是否运行正常:

hdfs管理界面同hadoop 1: http://hadoopnamenode:50070/ 

yarn的管理界面再也不是原来的50030端口,而是http://hadoopnamenode:8088/

2.5     注意事项

若namenode上的core-site.xml中的fs.defaultFS缺失,则启动时会报错。

 

若各机器上的yarn-site.xml中的yarn.resourcemanager.resource-tracker.address缺失,虽然resourcemanager与nodemanager进程可以正常启动,可是在执行yarn node -list会出现node数量为0的状况。

 

若各机器上的yarn-site.xml中的yarn.resourcemanager.scheduler.address或yarn.resourcemanager.address缺失,则在运行job时,会卡在INFO mapreduce.Job: Job job_1422695884569_0001 running in uber mode : false

2.6     几个Hadoop fs shell命令

hadoop fs -ls / ---列出hdfs根目录下的文件、目录

hadoop fs -ls /out2 ---列出out2目录下的文件、目录

hadoop fs -lsr / ---递归显示文件

hadoop fs -cat /out2/part-r-00000 ---打出文件内容

hadoop dfs -copyFromLocal  <local_FS_filename> <target_on_HDFS>

hadoop fs -du hdfs://namenodehost/user/hadoop ---查看目录大小

hadoop fs -rm /user/hadoop/file ---删除文件或空目录

hadoop fs -rmr /user/hadoop/dir ---删除文件或目录,递归之意

hafoop fs -tail /user/hadoop/sales.dat ---查看文件内容

注1:

dfs was deprecated in favor of "fs" command.

因此原来的hadoop dfs -copyFromLocal  <local_FS_filename> <target_on_HDFS>,如今的写法是

hadoop fs -copyFromLocal  <local_FS_filename> <target_on_HDFS>

注2:

hadoop fs -copyFromLocal /root/Downloads/small/war_and_peace.txt /test 这样生成的test是文件,而不是文件夹

因此通常hadoop fs -copyFromLocal /root/Downloads/small  /test,这样small下的文件会被copy到test文件夹下

又或者hadoop fs -copyFromLocal /root/Downloads/small/war_and_peace.txt /test4/,注意最后的/,前提是要用hadoop fs -mkdir先建立出test4目录

 

3    Zookeeper集群

3.1     配置

3.1.1      zoo.cfg

tickTime=2000
dataDir=/root/zookeeperdata
clientPort=2181
initLimit=5
syncLimit=2
server.1=hadoopnamenode:2888:3888
server.2=hadoop2ndnamenode:2888:3888
server.3=hadoopdatanode1:2888:3888

3.1.2      分发到集群的其它机器

把zookeeper文件夹连同修改后的配置文件经过scp拷贝到另外两台机器(hadoop2ndnamenode, hadoopdatanode)上。

3.1.3      设置myid

hadoopnameonde上echo”1” > /root/zookeeperdata/myid

hadoop2ndnamenode上echo “2” > /root/zookeeperdata/myid

hadoopdatanode上echo”3” > /root/zookeeperdata/myid

3.1.4      一些配置参数的解释

tickTime :心跳时间,单位毫秒。同时tickTime又是zookeeper中的基本单位,好比后面的initLimit=5就是指5个tickTime时间,在这里是10秒。 

dataDir :存储数据信息的本地目录。 

3.2     建立目录

在hadoopnamenode, hadoop2ndnamenode, hadoopdatanode1上建立dataDir中配置的目录/root/zookeeperdata。

3.3     启动/关闭

{ZOOKEEPER_HOME} /bin/zkServer.sh start

启动和关闭命令必须到zookeeper集群的每一个机器上,没有像start-dfs.sh那样的命令能够一会儿把整个集群启动。

关闭:{ZOOKEEPER_HOME} /bin/zkServer.sh stop

3.4     测试

{ZOOKEEPER_HOME} /bin/zkServer.sh status

如下是结果示例,能够看到各机器的角色是follower仍是leader。

[root@hadoopnamenode zookeeper-3.4.6]# bin/zkServer.sh status

JMX enabled by default

Using config: /usr/local/zookeeper-3.4.6/bin/../conf/zoo.cfg

Mode: follower

 

[root@hadoop2ndnamenode zookeeper-3.4.6]# bin/zkServer.sh status

JMX enabled by default

Using config: /usr/local/zookeeper-3.4.6/bin/../conf/zoo.cfg

Mode: leader

 

[root@hadoopdatanode1 zookeeper-3.4.6]# bin/zkServer.sh status

JMX enabled by default

Using config: /usr/local/zookeeper-3.4.6/bin/../conf/zoo.cfg

Mode: follower

3.5     注意事项

对于一个包含3台server的Zookeeper集群,最多允许关闭一台(若是被关闭的是leader,则会从新选举出一个)。若是关闭两台,则剩下那台虽然进程QuorumPeerMain还在,但zkServer.sh status查看状态则显示Error contacting service. It is probably not running。

对于一个包含5台server的Zookeeper集群,最多允许关闭两台。关闭三台,则剩下两台虽然进程QuorumPeerMain还在,但也显示一样的错误。

(若是这个时候用Java程序去链接Hbase,则会提示:org.apache.hadoop.hbase.ZooKeeperConnectionException: Can't connect to ZooKeeper)

这里面有两个常见的疑问:

1) 当3台server关闭一台时,只剩下两台时,没法造成majority,那么它是如何选举出leader的?

2) 当5台server关闭三台时,剩下两台,为何不能像1)中同样仍然正常工做?

这两个问题的答案是同一个,Zookeeper中的所谓majority voting机制,其majority是针对原始的server数量,不是指变化后的数量,这个原始的数量即你配置在zoo.cfg中的server个数。 

还有一个常见的问题是为何推荐使用奇数个Zookeeper server,那是由于3个server与4个server可以提供的可靠性是同样的,3台server的集群容许其中一台server宕机,而4台server的集群也只能允许其中一台server宕机,由于若是两台server宕机,那么剩下两台,对比于原来的4台,2/4不够成大多数。

 

4    Hbase集群

4.1     配置

4.1.1      hbase-env.sh

其它不变,export HBASE_MANAGES_ZK=false,这表示不使用hbase自带的zookeeper,而使用外部的zookeeper(这里指咱们在上面建的zookeeper)

4.1.2      hbase-site.xml

<configuration>
<property>
 <name>hbase.rootdir</name>
 <value>hdfs://hadoopnamenode:9000/hbase</value>
 <description>The directory shared by region servers.</description>
</property>
<property>
 <name>hbase.zookeeper.property.clientPort</name>
 <value>2181</value>
 <description>Property from ZooKeeper's config zoo.cfg. The port at which the clients will connect.
 </description>
</property>
<property>
 <name>zookeeper.session.timeout</name>
 <value>120000</value>
</property>
<property>
 <name>hbase.zookeeper.quorum</name>
 <value>hadoopnamenode,hadoop2ndnamenode,hadoopdatanode1</value>
</property>
<property>
 <name>hbase.tmp.dir</name>
 <value>/root/hbasedata</value>
</property>
<property>
 <name>hbase.cluster.distributed</name>
 <value>true</value>
</property>
</configuration>

4.1.3      regionservers

hadoopdatanode1
hadoopdatanode2
hadoopdatanode3

4.1.4      一些配置参数的解释

hbase.zookeeper.property.clientPort:指定zk的链接端口

zookeeper.session.timeout:RegionServer与Zookeeper间的链接超时时间。当超时时间到后,ReigonServer会被Zookeeper从RS集群清单中移除,HMaster收到移除通知后,会对这台server负责的regions从新balance,让其余存活的RegionServer接管.

hbase.zookeeper.quorum:默认值是 localhost,列出zookeepr ensemble中的servers

4.2     启动/关闭

bin/start-hbase.sh

bin/stop-hbase.sh

4.3     测试

在hadoopnamenode上执行

{HBASE_HOME}/bin/hbase shell

进入shell命令行,经过建立表等操做来检查不是不工做正常。

 

或者经过一个简单的Java程序来测试:

Configuration config = HBaseConfiguration.create();
config.set( "hbase.zookeeper.quorum", "hadoopnamenode,hadoop2ndnamenode,hadoopdatanode1" );
config.set( "hbase.zookeeper.property.clientport", "2181" );
//config.set("zookeeper.znode.parent", "/hbase-unsecure"); // this is what most people miss :) 
HBaseAdmin.checkHBaseAvailable( config );
HTable    t    = new HTable( config, "test" );
Scan    s    = new Scan();
//s.addColumn(Bytes.toBytes("cf1"), Bytes.toBytes("name")); 
ResultScanner rs = t.getScanner( s );
try{
    for ( Result r : rs )
    {
        for ( Cell cell : r.rawCells() )
        {
            System.out.println( "RowName:" + new String( CellUtil.cloneRow( cell ) ) + " " );
            System.out.println( "Timetamp:" + cell.getTimestamp() + " " );
            System.out.println( "column Family:" + new String( CellUtil.cloneFamily( cell ) ) + " " );
            System.out.println( "row Name:" + new String( CellUtil.cloneQualifier( cell ) ) + " " );
            System.out.println( "value:" + new String( CellUtil.cloneValue( cell ) ) + " " );
        }
    }
} finally {
    t.close();
}

System.out.println( "Done!" );

注意,java测试程序所在机器的hosts文件,注意必须有全FDQN(fully qualified domain name, 参见上面linux中的hosts文件),不然有java访问时会提示找不到hadoopnamenode.mh.com 

4.4     注意事项

HBase集群须要依赖于一个Zookeeper ensemble。HBase集群中的全部节点以及要访问HBase的客户端都须要可以访问到该Zookeeper  ensemble。HBase自带了Zookeeper,但为了方便其余应用程序使用Zookeeper,最好使用单独安装的Zookeeper ensemble。

此外,Zookeeper ensemble通常配置为奇数个节点,而且Hadoop集群、Zookeeper ensemble、HBase集群是三个互相独立的集群,并不须要部署在相同的物理节点上,他们之间是经过网络通讯的。

须要注意的是,若是要禁止启动hbase自带的zookeeper,那么,不只仅须要刚才的export HBASE_MANAGES_ZK=false配置,还须要hdfs-site.xml中的hbase.cluster.distributed为true,不然你在启动时会遇到Could not start ZK at requested port of 2181 错误,这是由于hbase尝试启动自带的zookeeper,而咱们已经启动了本身安装的那个zookeeper,默认都使用2181端口,因此出错。

还有,有时候会遇到stop-hbase.sh执行很长时间未结束,极可能的缘由是你以前把zookeeper关闭了.

最后,Hbase不须要mapreduce,因此只要start-dfs.sh启动hdfs,而后到zookeeper各节点上启动zookeeper,最后再hbase-start.sh启动hbase便可.

 


送书了,送书了,关注公众号“程序员杂书馆”,送出O'Reilly《Spark快速大数据分析》纸质书(亦有一批PDF分享)! —— 2018年12月

相关文章
相关标签/搜索