从零开始搭建个人大数据集群——环境准备篇
从零开始搭建个人大数据集群(1)——zookeeper
环境准备
本次安装HDFS使用的是hadoop-3.2.2.tar.gz
开始安装
解压
# 进入安装包存放目录
cd /opt/packages
# 解压到安装目录
tar -zxvf tar -zxvf hadoop-3.2.2.tar.gz -C ../apps/
# 进入安装目录并创建软链接
cd ../apps
ln -s hadoop-3.2.2 hadoop
修改配置文件
hdfs-site.xml
配置中的主机名请自行更改
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!-- Put site-specific property overrides in this file. -->
<configuration>
<!--主要的-->
<property>
<name>dfs.datanode.data.dir</name>
<value>/data/dfs/datanode</value>
<description>datanode本地文件存放地址</description>
</property>
<!--主要的-->
<property>
<name>dfs.replication</name>
<value>3</value>
<description>文件副本数</description>
</property>
<!--主要的-->
<property>
<name>dfs.namenode.name.dir</name>
<value>/data/dfs/namenode</value>
<description>namenode本地文件存放地址</description>
</property>
<!--主要的-->
<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
<description>是否开启目录权限</description>
</property>
<!--主要的-->
<property>
<name>dfs.nameservices</name>
<value>ns1</value>
<description>提供服务的NS逻辑名称,与core-site.xml里的对应</description>
</property>
<!--主要的-->
<property>
<name>dfs.ha.namenodes.ns1</name>
<value>hd1,hd2</value>
<description>列出该逻辑名称下的NameNode逻辑名称</description>
</property>
<!--主要的-->
<property>
<name>dfs.namenode.rpc-address.ns1.hd1</name>
<value>hd1:9000</value>
<description>指定NameNode的RPC位置</description>
</property>
<!--主要的-->
<property>
<name>dfs.namenode.http-address.ns1.hd1</name>
<value>hd1:50070</value>
<description>指定NameNode的Web Server位置</description>
</property>
<!--主要的-->
<property>
<name>dfs.namenode.rpc-address.ns1.hd2</name>
<value>hd2:9000</value>
<description>指定NameNode的RPC位置</description>
</property>
<!--主要的-->
<property>
<name>dfs.namenode.http-address.ns1.hd2</name>
<value>hd2:50070</value>
<description>指定NameNode的Web Server位置</description>
</property>
<!--主要的-->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://hd1:8485;hd2:8485/ns1</value>
<description>指定用于HA存放edits的共享存储,通常是namenode的所在机器</description>
</property>
<!--主要的-->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/data/dfs/journaldata/</value>
<description>journaldata服务存放文件的地址</description>
</property>
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
<description>指定HA做隔离的方法,缺省是ssh,可设为shell,稍后详述</description>
</property>
<property>
<name>dfs.client.failover.proxy.provider.ns1</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
<description>指定客户端用于HA切换的代理类,不同的NS可以用不同的代理类</description>
</property>
<property>
<name>dfs.client.failover.proxy.provider.auto-ha</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!--主要的-->
<property>
<name>fs.trash.interval</name>
<value>2880</value>
<description>回收周期</description>
</property>
<property>
<name>dfs.datanode.balance.bandwidthPerSec</name>
<value>104857600</value>
</property>
<property>
<name>dfs.namenode.handler.count</name>
<value>77</value>
</property>
<!--主要的-->
<property>
<name>dfs.blocksize</name>
<value>134217728</value>
<description>文件块的大小</description>
</property>
<!-- DataNode -->
<property>
<name>dfs.datanode.max.transfer.threads</name>
<value>8192</value>
<description>相当于linux下的打开文件最大数量,文档中无此参数,当出现DataXceiver报错的时候,需要调大。默认256</description>
</property>
<!--主要的-->
<property>
<name>dfs.datanode.du.reserved</name>
<value>2147483648</value>
<description>每个存储卷保留用作其他用途的磁盘大小</description>
</property>
<property>
<name>dfs.datanode.fsdataset.volume.choosing.policy</name>
<value>org.apache.hadoop.hdfs.server.datanode.fsdataset.AvailableSpaceVolumeChoosingPolicy</value>
<description>存储卷选择策略</description>
</property>
<property>
<name>dfs.datanode.available-space-volume-choosing-policy.balanced-space-threshold</name>
<value>2147483648</value>
<description>允许的卷剩余空间差值,2G</description>
</property>
<property>
<name>dfs.client.read.shortcircuit</name>
<value>true</value>
</property>
<property>
<name>dfs.domain.socket.path</name>
<value>/data/dn_socket_PORT</value>
</property>
</configuration>
core-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!--
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License. See accompanying LICENSE file.
-->
<!-- Put site-specific property overrides in this file. -->
<configuration>
<!--主要的-->
<property>
<name>io.native.lib.available</name>
<value>true</value>
<description>开启本地库支持</description>
</property>
<!--主要的-->
<property>
<name>fs.defaultFS</name>
<value>hdfs://ns1</value>
<description>默认文件服务的协议和NS逻辑名称,和hdfs-site里的对应此配置替代了1.0里的fs.default.name</description>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/data/tmp</value>
</property>
<!--主要的-->
<property>
<name>io.compression.codecs</name>
<value>org.apache.hadoop.io.compress.GzipCodec,org.apache.hadoop.io.compress.DefaultCodec,org.apache.hadoop.io.compress.BZip2Codec,org.apache.hadoop.io.compress.SnappyCodec</value>
<description>相应编码的操作类</description>
</property>
<property>
<name>io.file.buffer.size</name>
<value>131072</value>
<description>SequenceFiles在读写中可以使用的缓存大小</description>
</property>
<!--主要的-->
<property>
<name>ha.zookeeper.quorum</name>
<value>hd1:2181,hd2:2181,hd3:2181</value>
<description>HA使用的zookeeper地址</description>
</property>
<property>
<name>ipc.client.connection.maxidletime</name>
<value>60000</value>
</property>
<property>
<name>mapreduce.output.fileoutputformat.compress.type</name>
<value>BLOCK</value>
</property>
<property>
<name>io.seqfile.compressioin.type</name>
<value>BLOCK</value>
</property>
<property>
<name>hadoop.proxyuser.root.groups</name>
<value>hadoop</value>
<description>hdfs dfsadmin –refreshSuperUserGroupsConfiguration,yarn rmadmin –refreshSuperUserGroupsConfiguration使用这两个命令不用重启就能刷新</description>
</property>
<property>
<name>hadoop.proxyuser.root.hosts</name>
<value>localhost</value>
</property>
</configuration>
hadoop-env.sh
在hadoop-env.sh中添加如下内容
export JAVA_HOME=/usr/local/jdk
export HADOOP_HOME=/opt/apps/hadoop
export HADOOP_COMMON_HOME=${HADOOP_HOME}
export HADOOP_HDFS_HOME=${HADOOP_HOME}
export HADOOP_MAPRED_HOME=${HADOOP_HOME}
export HADOOP_MAPRED_HOME=${HADOOP_HOME}
export HADOOP_YARN_HOME=${HADOOP_HOME}
export HADOOP_CONF_DIR=${HADOOP_HOME}/etc/hadoop
export HADOOP_OS_TYPE=${HADOOP_OS_TYPE:-$(uname -s)}
export HADOOP_PID_DIR=$HADOOP_HOME/pids
``
### workers
workers文件内写入的内容是datanode节点主机名,我是令hd1、hd2作为namenode,hd3,hd4,hd5作为datanode节点,将datanode节点在/etc/hosts中映射的主机名分行写入,
hd3
hd4
hd5
### start-dfs.sh stop-dfs.sh
```shell
# 分别在这两个文件的开头加上
HDFS_DATANODE_USER=hadoop
HDFS_DATANODE_SECURE_USER=hdfs
HDFS_NAMENODE_USER=hadoop
HDFS_SECONDARYNAMENODE_USER=hadoop
start-yarn.sh stop-yarn.sh
# 分别在这两个文件的开头加上
YARN_RESOURCEMANAGER_USER=hadoop
HADOOP_SECURE_DN_USER=yarn
YARN_NODEMANAGER_USER=hadoop
环境变量
JAVA_HOME=/usr/local/jdk
ZOOKEEPER_HOME=/opt/apps/zookeeper
HADOOP_HOME=/opt/apps/hadoop
HADOOP_COMMON_HOME=${HADOOP_HOME}
HADOOP_HDFS_HOME=${HADOOP_HOME}
HADOOP_MAPRED_HOME=${HADOOP_HOME}
HADOOP_YARN_HOME=${HADOOP_HOME}
HADOOP_CONF_DIR=${HADOOP_HOME}/etc/hadoop
LD_LIBRARY_PATH=$HADOOP_HOME/lib/native:/usr/lib64
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$ZOOKEEPER_HOME/bin
基于zookeeper启动
1.启动zookeeper
在hd1上使用之前写的多机操作脚本启动三台zookeeper节点
cd ~
./zk/ssh_all.sh zkServer.sh start
2.启动 journalnode (同步两台namenode信息)
#在hd1上启动journalnode
hadoop-daemon.sh start journalnode
#在hd2上启动journalnode
hadoop-daemon.sh start journalnode
3.初始化HA的zookeeper信息(第一次启动操作,以后不需要操作)
#启动zkclient,并连接zookeeper集群
/usr/local/zookeeper/bin/zkCli.sh -server hd1:2181,hd2:2181,hd3:2181
#在hd1克隆会话,用hadoop用户执行下面命令,初始化HA的zookeeper信息
#我是用hadoop用户来安装集群的,这里各位按自己的用户来
hdfs zkfc -formatZK
#通过zookeeper客户端查看结点
WatchedEvent state:SyncConnected type:None path:null
[zk: hd1:2181,hd2:2181,hd3:2181(CONNECTED) 0] ls /
[hadoop-ha, zookeeper]
[zk: hd1:2181,hd2:2181,hd3:2181(CONNECTED) 1]
4.对hd1上的namenode进行格式化(第一次启动前执行,以后不用每次启动都执行)
# 在hd1上执行
hadoop namenode -format
5.启动hd1上的namenode
hadoop-daemon.sh start namenode
6.第二个namenode同步第一个namenode状态(第一次启动前执行,以后不用每次都执行)
hadoop namenode -bootstrapStandby
- 在hd2上启动namenode
hadoop-daemon.sh start namenode
8.启动ZKFC
# 在 hd1和 hd2分别启动ZKFC,这时两个namenode,一个变成active,一个变成standby
hadoop-daemon.sh start zkfc
# 查看HA状态
[hadoop@hd1 ~]$ hdfs haadmin -getServiceState hd1
standby
[hadoop@hd1 ~]$ hdfs haadmin -getServiceState hd2
active
9.启动datanode
# 在 标记为active的namenode节点上执行
# 启动hd3,hd4,hd5上的datanode服务,注意这里是hadoop-daemons.sh而不是hadoop-daemon.sh
hadoop-daemons.sh start datanode
10.验证
首先在本地的hosts文件中配置好虚拟机的IP映射,然后访问
http://hd1:50070
Q.E.D.