天天看点

Hadoop集群(一) Zookeeper搭建

作为Hadoop初学者,自然要从安装入手。而hadoop的优势就是分布式,所以,也一定要安装分布式的系统。

整体安装步骤,包括Zookeeper+HDFS+Hbase,为了文章简洁,我会分三篇blog记录我的安装步骤。

本文记录的是集群环境准备,zookeeper的安装步骤。

~~~~~~~~~~~环境准备部分~~~~~~~~~~~~~~~~~

IP部署规划(准备了三个虚拟机,操作系统是Centos6.7)

Zookeeper主机分配

1

2

3

<code>192.168.67.101 c6701</code>

<code>192.168.67.102 c6702</code>

<code>192.168.67.103 c6703</code>

HDFS主机分配

<code>192.168.67.101 c6701 </code><code>--Namenode+datanode</code>

<code>192.168.67.102 c6702 </code><code>--datanode</code>

<code>192.168.67.103 c6703 </code><code>--datanode</code>

Hbase主机分配

<code>192.168.67.101 c6701 </code><code>--Master + region</code>

<code>192.168.67.102 c6702 </code><code>--region</code>

<code>192.168.67.103 c6703 </code><code>--region</code>

1. 为了分别管理各个服务,我为每个服务,都单独创建了用户.

创建的用户有:

<code>zk</code>

<code>hdfs</code>

<code>hbase</code>

2. 为每一个用户创建ssh免密,并分发到全部节点,这样,我就只在C6701上执行命令,通过远程的方式安装C6702和C6703

<code>ssh-keygen -t rsa -f ~/.ssh/id_rsa</code>

拷贝密钥到全部节点即可(只有c6701访问02和03不需要密码,反向访问是需要密码的)

<code>ssh-copy-id  c6701  </code>

<code>ssh-copy-id  c6702 </code>

<code>ssh-copy-id  c6703</code>

3. 强调一下,/etc/hosts 需要设置

4

<code>[root@c6701 ~]# more /etc/hosts </code>

<code>192.168.67.101 c6701.org c6701</code>

<code>192.168.67.102 c6702.org c6702</code>

<code>192.168.67.103 c6703.org c6703</code>

4. 下面在C6701执行,中间会调用ssh远程执行一些命令,验证ssh免密是否生效

<code>ssh c6702 </code><code>"cat /proc/cpuinfo"</code>

<code>ssh c6702 </code><code>"hostname"</code>

5. 下载安装软件(内网地址)

5

6

<code>cd /tmp/software</code>

<code>wget http://192.21.104.48/deploy/jdk-8u144-linux-x64.tar.gz</code>

<code>wget http://192.21.104.48/deploy/zookeeper-3.4.6.tar.gz</code>

<code>wget http://192.21.104.48/deploy/hbase-1.1.3.tar.gz</code>

<code>wget http://192.21.104.48/deploy/hadoop-2.6.0-EDH-0u2.tar.gz</code>

<code>wget http://192.21.104.48/deploy/hadoop-2.7.1.tar.gz</code>

6. 安装JDK,全部节点都要安装

<code>#tar -xzvf  jdk-8u144-linux-x64.tar.gz -C /usr/</code><code>local</code>

7. 添加下面信息到.bash_profile

<code>export JAVA_HOME=/usr/</code><code>local</code><code>/jdk1.8.0_144  </code>

<code>export JRE_HOME=/usr/</code><code>local</code><code>/jdk1.8.0_144/jre</code>

<code>export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH</code>

<code>export PATH=$JAVA_HOME/bin:$PATH</code>

<code>source /etc/profile</code>

8. 检查版本信息

<code># java -version</code>

<code>java version </code><code>"1.8.0_144"</code>

<code>Java(TM) SE Runtime Environment (build 1.8.0_144-b01)</code>

<code>Java HotSpot(TM) 64-</code><code>Bit</code> <code>Server VM (build 25.144-b01, mixed mode)</code>

~~~~~~~~~~~zookeeper的安装部分~~~~~~~~~~~~~~~~~

1. 在C6701安装Zookeeper

<code>useradd zk</code>

<code>echo </code><code>"zk:zk"</code> <code>| chpasswd</code>

<code>su - zk</code>

<code>mkdir zk</code>

<code>tar -zxvf /tmp/software/zookeeper-3.4.6.tar.gz -C /home/zk/zk</code>

7

8

9

10

11

12

13

14

15

16

<code>~~~~~~~~~~~~~zoo.cfg的配置~~~~~~~~~~~~~~~</code>

<code>$ pwd</code>

<code>/home/zk/zk/zookeeper-3.4.6/conf/zoo.cfg</code>

<code>$ cat /home/zk/zk/zookeeper-3.4.6/conf/zoo.cfg |grep -v </code><code>'^#'</code>

<code>tickTime=2000</code>

<code>initLimit=10</code>

<code>syncLimit=5</code>

<code>dataDir=/data/zookeeper/data</code>

<code>dataLogDir=/data/zookeeper/log</code>

<code>clientPort=2181</code>

<code>autopurge.snapRetainCount=3</code>

<code>autopurge.purgeInterval=6</code>

<code>server.1=c6701:2888:3888</code>

<code>server.2=c6702:2888:3888</code>

<code>server.3=c6703:2888:3888</code>

<code>~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~</code>

2. 根据zoo.cfg创建data和log两个文件夹

<code>#mkdir -p /data/zookeeper/data</code>

<code>#mkdir -p /data/zookeeper/log</code>

<code>#chown -R zk:zk /data/zookeeper</code>

<code>#chown -R zk:zk /data/zookeeper/data</code>

<code>#chown -R zk:zk /data/zookeeper/log</code>

3.在zookeeper的目录中,创建上述两个文件夹。进入zkdata文件夹,创建文件myid,填入1。这里写入的1,是在zoo.cfg文本中的server.1中的1。当我们把所有文件都配置完毕,我们把hadoop1中yarn目录复制到其它机器中,我们在修改每台机器中对应的myid文本,hadoop2中的myid写入2。其余节点,安照上面配置,依此写入相应的数字。Zkdatalog文件夹,是为了指定zookeeper产生日志指定相应的路径。

<code># su - zk -c </code><code>"echo 1 &gt; /data/zookeeper/data/myid"</code>

4. 添加环境变量,在/etc/profile目录中,将ZOOKEEPER_HOME/bin在原有的PATH后面加入":$ZOOKEEPER_HOME/bin"

关于环境变量修改/etc目录下的profile文件,也可以在根目录下的.bashrc目录下添加环境变量。这两者有什么区别:.bashrc是对当前目录用户的环境变量,profile文件是对所有用户都开放的目录。当系统加载文件中,先从profile找相应的路劲,如果没有会在.bashrc文件中找对应的环境变量路径。这两者大家稍至了解。

然后 source /etc/profile

5. 安装c6702的zookeeper

<code>#ssh c6702 </code><code>"useradd zk"</code>

<code>#ssh c6702 </code><code>"echo "</code><code>zk:zk</code><code>" | chpasswd"</code>

为zk用户ssh免密

<code>#ssh-copy-id  zk@c6702</code>

拷贝软件

<code>#scp -r /tmp/software/hadoop-* root@c6702:/tmp/software</code>

<code>#ssh c6702 </code><code>"chmod 777 /tmp/software/*"</code>

创建目录,解压软件

<code>#ssh zk@c6702 </code><code>"mkdir zk"</code>

<code>#ssh zk@c6702 </code><code>"tar -zxvf /tmp/software/zookeeper-3.4.6.tar.gz -C /home/zk/zk"</code>

<code>#ssh zk@c6702 </code><code>"ls -al zk"</code>

<code>#ssh zk@c6702 </code><code>"ls -al zk/zookeeper*"</code>

<code>#ssh zk@c6702 </code><code>"rm /home/zk/zk/zookeeper-3.4.6/conf/zoo.cfg"</code>

<code>#scp -r /home/zk/zk/zookeeper-3.4.6/conf/zoo.cfg zk@c6702:/home/zk/zk/zookeeper-3.4.6/conf/.</code>

<code>#ssh zk@c6702 </code><code>"cat /home/zk/zk/zookeeper-3.4.6/conf/zoo.cfg |grep -v '^#'"</code>

<code>根据zoo.cfg创建目录</code>

<code>#ssh c6702 </code><code>"mkdir -p /data/zookeeper/data"</code>

<code>#ssh c6702 </code><code>"chown -R zk:zk /data/zookeeper"</code>

<code>#ssh c6702 </code><code>"chown -R zk:zk /data/zookeeper/data"</code>

<code>#ssh c6702 </code><code>"mkdir -p /data/zookeeper/log"</code> 

<code>#ssh c6702 </code><code>"chown -R zk:zk /data/zookeeper/log"</code>

<code>创建文件myid,填入2</code>

<code>ssh zk@c6702  </code><code>"echo 2 &gt; /data/zookeeper/data/myid"</code>

6. 安装c6703的zookeeper

<code>#ssh c6703 </code><code>"useradd zk"</code>

<code>#ssh c6703 </code><code>"echo "</code><code>zk:zk</code><code>" | chpasswd"</code>

<code>ssh-copy-id  zk@c6703</code>

<code>#scp -r /tmp/software/hadoop-* root@c6703:/tmp/software</code>

<code>#ssh c6703 </code><code>"chmod 777 /tmp/software/*"</code>

<code>#ssh zk@c6703 </code><code>"mkdir zk"</code>

<code>#ssh zk@c6703 </code><code>"tar -zxvf /tmp/software/zookeeper-3.4.6.tar.gz -C /home/zk/zk"</code>

<code>#ssh zk@c6703 </code><code>"ls -al zk"</code>

<code>#ssh zk@c6703 </code><code>"ls -al zk/zookeeper*"</code>

<code>#ssh zk@c6703 </code><code>"rm /home/zk/zk/zookeeper-3.4.6/conf/zoo.cfg"</code>

<code>#scp -r /home/zk/zk/zookeeper-3.4.6/conf/zoo.cfg zk@c6703:/home/zk/zk/zookeeper-3.4.6/conf/.</code>

<code>#ssh zk@c6703 </code><code>"cat /home/zk/zk/zookeeper-3.4.6/conf/zoo.cfg |grep -v '^#'"</code>

根据zoo.cfg创建目录

<code>#ssh c6703 </code><code>"mkdir -p /data/zookeeper/data"</code>

<code>#ssh c6703 </code><code>"chown -R zk:zk /data/zookeeper"</code>

<code>#ssh c6703 </code><code>"chown -R zk:zk /data/zookeeper/data"</code>

<code>#ssh c6703 </code><code>"mkdir -p /data/zookeeper/log"</code> 

<code>#ssh c6703 </code><code>"chown -R zk:zk /data/zookeeper/log"</code>

<code>创建文件myid,填入3</code>

<code>ssh zk@c6703  </code><code>"echo 3 &gt; /data/zookeeper/data/myid"</code>

7. 启动ZK

<code>/home/zk/zk/zookeeper-3.4.6/bin/zkServer.sh start</code>

<code>/home/zk/zk/zookeeper-3.4.6/bin/zkServer.sh status</code>

远程启动命令

<code>ssh zk@c6702 </code><code>"/home/zk/zk/zookeeper-3.4.6/bin/zkServer.sh\ start"</code>

<code>ssh zk@c6703 </code><code>"/home/zk/zk/zookeeper-3.4.6/bin/zkServer.sh\ start"</code>

<code>ssh zk@c6702 </code><code>"/home/zk/zk/zookeeper-3.4.6/bin/zkServer.sh\ status"</code>

<code>ssh zk@c6703 </code><code>"/home/zk/zk/zookeeper-3.4.6/bin/zkServer.sh\ status"</code>

8. 没有全部启动三个ZK前的状态

<code>[vagrant@c7003 bin]$ ./zkServer.sh status</code>

<code>ZooKeeper JMX enabled </code><code>by</code> <code>default</code>

<code>Using config: /home/vagrant/zookeeper-3.4.10/bin/../conf/zoo.cfg</code>

<code>Error contacting service. It </code><code>is</code> <code>probably </code><code>not</code> <code>running.</code>

9. 需要将三个ZK全启动之后,才能选举出leader

<code>$ ./zkServer.sh status</code>

<code>Mode: follower</code>

<code>[vagrant@c7002 bin]$ ./zkServer.sh status</code>

<code>Mode: leader</code>

=======2018.1.13更新==========

客户端连接方式

客户端是随机顺序的方式连接server的,无法指定,或者优先读哪个一个zookeeper server。

./zkCli.sh -server c6701:2181,c6702:2181,c6703:2181

输出如下:

第一次连接,连接到c6701上

<code>[zookeeper@c6702 bin]$ /usr/</code><code>local</code><code>/hadoop/zookeeper-3.4.6/bin/zkCli.sh -server c6701:2181,c6702:2181,c6703:2181</code>

<code>Connecting </code><code>to</code> <code>c6701:2181,c6702:2181,c6703:2181</code>

<code>......</code>

<code>2018-01-11 21:07:30,797 [myid:] - INFO  [main:ZooKeeper@438] - Initiating client </code><code>connection</code><code>, connectString=c6701:2181,c6702:2181,c6703:2181 sessionTimeout=30000 watcher=org.apache.zookeeper.ZooKeeperMain$MyWatcher@4b4bc1e</code>

<code>Welcome </code><code>to</code> <code>ZooKeeper!</code>

<code>2018-01-11 21:07:30,830 [myid:] - INFO  [main-SendThread(c6701.python279.org:2181):ClientCnxn$SendThread@975] - Opening socket </code><code>connection</code> <code>to</code> <code>server c6701.python279.org/192.168.67.101:2181. Will </code><code>not</code> <code>attempt </code><code>to</code> <code>authenticate using SASL (unknown error)</code>

<code>JLine support </code><code>is</code> <code>enabled</code>

<code>2018-01-11 21:07:30,873 [myid:] - INFO  [main-SendThread(c6701.python279.org:2181):ClientCnxn$SendThread@852] - Socket </code><code>connection</code> <code>established </code><code>to</code> <code>c6701.python279.org/192.168.67.101:2181, initiating session</code>

<code>2018-01-11 21:07:30,916 [myid:] - INFO  [main-SendThread(c6701.python279.org:2181):ClientCnxn$SendThread@1235] - Session establishment complete </code><code>on</code> <code>server c6701.python279.org/192.168.67.101:2181, sessionid = 0x160e70285f70001, negotiated timeout = 30000</code>

<code>WATCHER::</code>

<code>WatchedEvent state:SyncConnected type:None path:</code><code>null</code>

第二次连接,连接到c6702上

<code>2018-01-11 21:10:18,442 [myid:] - INFO  [main:ZooKeeper@438] - Initiating client </code><code>connection</code><code>, connectString=c6701:2181,c6702:2181,c6703:2181 sessionTimeout=30000 watcher=org.apache.zookeeper.ZooKeeperMain$MyWatcher@4b4bc1e</code>

<code>2018-01-11 21:10:18,489 [myid:] - INFO  [main-SendThread(c6702.python279.org:2181):ClientCnxn$SendThread@975] - Opening socket </code><code>connection</code> <code>to</code> <code>server c6702.python279.org/192.168.67.102:2181. Will </code><code>not</code> <code>attempt </code><code>to</code> <code>authenticate using SASL (unknown error)</code>

<code>2018-01-11 21:10:18,508 [myid:] - INFO  [main-SendThread(c6702.python279.org:2181):ClientCnxn$SendThread@852] - Socket </code><code>connection</code> <code>established </code><code>to</code> <code>c6702.python279.org/192.168.67.102:2181, initiating session</code>

<code>2018-01-11 21:10:18,561 [myid:] - INFO  [main-SendThread(c6702.python279.org:2181):ClientCnxn$SendThread@1235] - Session establishment complete </code><code>on</code> <code>server c6702.python279.org/192.168.67.102:2181, sessionid = 0x260e70284650002, negotiated timeout = 30000</code>

至此,基础环境部署完。并且zookeeper也安装完成。下面我们会在下一篇文章中,继续安装HDFS。

本文转自 hsbxxl 51CTO博客,原文链接:http://blog.51cto.com/hsbxxl/1971241,如需转载请自行联系原作者