部署安装
环境准备
1、操作系统版本推荐CentOS7及以上版本,以及相应RedHat发行版
# 校验(两种校验都可以)
cat /proc/version
lsb_release -a
2、集群个主机字符集设置
# 修改
vim /etc/sysconfig/i18n
LANG="en_US.UTF-8"
# 校验(两种校验都可以)
locale
echo $LANG
3、检查集群内所有主机的网络参数配置
# 修改
vim /etc/sysctl.conf
将一下的参数注释掉
# net.ipv4.tcp_tw_reuse = 1
# net.ipv4.tcp_tw_recycle = 1
# net.ipv4.tcp_timestamps = 1
# 修改后,刷新配置、
sysctl –p
4、集群中的主机一定要永久的关闭防火墙
# 停止 firewall
systemctl stop firewalld.service
# 禁止firewall开机启动
systemctl disable firewalld.service
# 查看防火墙的状态
firewall-cmd --s
tate
5、关闭SELinux
# 修改
vim /etc/selinux/config
# 进行一下修改
selinux=enforcing为selinux=disabled
# 校验1
/usr/sbin/sestatus -v
# 结果
SELinux status: disabled
# 校验2
getenforce
# 结果
Disabled
6、集群各主机将swappiness设置为1
# 设置
echo "vm.swappiness=1" >> /etc/sysctl.conf
echo 1 >/proc/sys/vm/swappiness
# 校验
grep vm.swappiness /etc/sysctl.conf
cat /proc/sys/vm/swappiness|grep vm.swappiness
7、禁用透明页面压缩(Transparent Huge Pages),重启时生效(使用的是root用户进行操作)
# 执行
echo 'never'>/sys/kernel/mm/transparent_hugepage/defrag
echo 'never'>/sys/kernel/mm/transparent_hugepage/enabled
# 校验
cat /sys/kernel/mm/transparent_hugepage/defrag
8、集群内所有主机之间的网络要求:速度、带宽和网络稳定。
9、主机名由字母和数字组成,必须以字母开头,不允许有其他特殊字符。主机名可设置为dchao01、dchao02等
10、将集群中所有的主机名及ip对应关系都添加到每台主机的/etc/hosts中
# 添加
vim /etc/hosts
192.168.70.10 dchao
192.168.70.11 dchao01
192.168.70.12 dchao02
# 校验方法
cat /etc/hosts
11、在root和e3base用户名下,设置系统ulimit参数值:
ulimit -u 65536 /ulimit -n 1048576 /ulimit -s 262144 /ulimit -c 65536
安装并创建软连接
# 安装
tar -zxvf hadoop-3.3.1-e3base5.6.0.tar.gz
# 软连接
ln -s /e3base/e3base560/hadoop-3.3.1-e3base5.6.0 /e3base/hadoop
配置
hadoop的配置文件均处于/e3base/hadoop/etc/hadoop目录下。在该目录下对如下配置文件进行配置。
1、环境变量
# 在/e3base /.bash_profile中进行环境变量的配置
export IN_HOME=/e3base # 之前安装zookeeper应该已经配置过
export HADOOP_HOME=$IN_HOME/hadoop
export PATH=$HADOOP_HOME/sbin:$HADOOP_HOME/bin:$PATH
# 重载
source .bash_profile
2、hadoop-env.sh配置
export JAVA_HOME=/e3base/jdk # 安装jdk的目录
export HADOOP_HOME=/e3base/hadoop # 配置hadoop的目录
export E3_INFO_HOME=/e3base/e3-info
export HADOOP_LOG_DIR=$E3_INFO_HOME/hadoop/logs # hadoop的日志目录
export HADOOP_PID_DIR=$E3_INFO_HOME/hadoop/pids # hadoop进程id的存放路径
3、core-site.xml文件配置
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://drmcluster</value>
</property>
<property>
<name>ha.zookeeper.quorum</name>
# 只需要修改这里对应的主机名称即可
<value>主机1:11001,主机2:11001,主机3:11001</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/tmp/hadoop-${user.name}</value>
</property>
</configuration>
参数说明:
1、fs.defaultFS:指定HDFS的文件系统名称,value值的格式:hdfs://xxxxxx/
2、ha.zookeeper.quorum:指定了用于hadoop namenode失效后切换的zookeeper集群信息,填写格式ip:port,多个主机之间以逗号分隔。配置值与zookeeper安装部署保持一致。
3、hadoop.tmp.dir:指定hadoop临时文件存放目录,配置为/tmp/hadoop-${user.name}。
# 如果使用的用户不是:在系统主目录下创建的用户(useradd -d dchao dchao)这种用户,
# 需要修改成管理员用户
<property>
<name>hadoop.http.staticuser.user</name>
<value>管理员用户</value>
</property>
<property>
<name>hadoop.user.group.static.mapping.overrides</name>
<value>管理员用户=管理员用户;</value>
</property>
<property>
<name>hadoop.proxyuser.管理员用户.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.管理员用户.groups</name>
<value>*</value>
</property>
<property>
<name>httpfs.proxyuser.管理员用户.hosts</name>
<value>*</value>
</property>
<property>
<name>httpfs.proxyuser.管理员用户.groups</name>
<value>*</value>
</property>
4、hdfs-site.xml配置
<configuration>
<property>
<name>dfs.nameservices</name>
<value>drmcluster</value>
</property>
<property>
<name>dfs.namenode.nn1.hostname</name>
# 修改namenode主机1
<value>namenode主机1</value>
</property>
<property>
<name>dfs.namenode.nn2.hostname</name>
# 修改namenode主机2
<value>namenode主机2</value>
</property>
<property>
<name>dfs.namenode.shared.edits.dir</name>
# 修改datanode主机1:12007;datanode主机2:12007;datanode主机3:12007;
<value>qjournal://datanode1:12007;datanode2:12007;datanode3:12007/drmcluster</value>
</property>
<property>
<name>dfs.journalnode.edits.dir</name>
# 此处的data1是全路径,务必写成绝对路径
<value>/data1/hadoop/jn</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
# 此处的data1是全路径,务必写成绝对路径
<value>file:///data1/hadoop/nn</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
# 此处的data1是全路径,务必写成绝对路径
<value>/data1/hdfs,/data2/hdfs,/data3/hdfs</value>
</property>
</configuration>
参数说明:
1、dfs.nameservices:指定集群服务名称,配置为drmcluster
2、dfs.namenode.nn1.hostname与dfs.namenode.nn2.hostname:分别指定了配置namenode服务的主机名
3、dfs.journalnode.edits.dir:指定journal node集群中各主机存储数据的本地磁盘路径
4、dfs.namenode.name.dir:格式:file:///data1/hadoop/nn
5、dfs.datanode.data.dir:指定了数据节点存放数据的目录,不做raid。(一般设置为挂载多块硬盘的路径),若值设置为/data1/hdfs,/data2/hdfs,/data3/hdfs,则需要在根目录下创建对应的目录,每个/data*目录需挂载到一块数据盘上。
5、works文件配置
workers文件中配置了hadoop集群所包含的所有datanode节点,每行对应一个主机名。HDFS和YARN公用。
dchao
dchao01
dchao02
脚本分发
将以上配置好的主机中,改动的配置文件、新增的目录文件等,分发到其他的主机中。保证每个主机中的信息都是一致的
for i in dchao0{1..2};do scp -r /e3base/e3base560/hadoop-3.3.1-e3base5.6.0 $i:/e3base/e3base560;ssh $i "ln -s /e3base/e3base560/hadoop-3.3.1-e3base5.6.0 /e3base/hadoop";scp -r /e3base/.bash_profile $i:/e3base;ssh $i "source /e3base/.bash_profile";done;
经过以上的安装配置之后,基本上是完成了所有的集群主机配置。现在所要做的就是初始化。
注意:
在初始化之前,需要启动所有的zookeeper服务
初始化
1、始化zkfc(注意是在一个namenode上执行)
在ZK中创建znode来存储automatic Failover的数据,任选一个NN执行完成即可。
在一个namenode上进入$HADOOP_HOME/bin执行:
# 切换到目录
/e3base/hadoop/bin/
# 执行命令
./hdfs zkfc -formatZK
2、先启动journal node进程。(每一个主机上都要执行)
先启动journal node进程。在每一个journalnode上进入$HADOOP_HOME执行:
# 切换到目录:
/e3base/hadoop/bin/
# 执行命令
./hdfs --daemon start journalnode
执行完成后,通过jps查看JournalNode进程是否启动正常。
3、初始化主namenode节点(主namenode)
在需要做主namenode节点主机上进入$HADOOP_HOME/bin执行如下命令实现初始化HDFS目录、文件:
# 切换目录
/e3base/hadoop/bin/
# 执行命令
./hdfs namenode -format
4、初始化备namenode节点
在初始化备节点之前,必须先启动主节点(namenode)
# 切换目录
/e3base/hadoop/bin/
# 执行命令
./hdfs --daemon start namenode
在另外备namenode节点拷贝主namenode节点的元数据,保证两个节点数据一致:
# 切换目录
/e3base/hadoop/bin/
# 执行命令
./hdfs namenode -bootstrapStandby
状态转换图:
整个初始化流程:
第一步:初始化zkfc,zkfc是hdfs namenode做failover的协议或者服务, 帮助自己监护的namenode竞选leader. 简单地理解, zkfc是namenode的选主协议。
当某个节点宕掉之后,会自动切换备用节点。状态的转换:具体的状态转换看上图。
第二步:两个namenode节点为了数据同步会通过Journalnode相互通信。通俗来讲就是:负责两个namenode之间的通信,一号namenode发生改变之后,会告诉Journalnode,而Journalnode会传递到2号namenode。同步发生的变化。保证两个namenode数据的一致性
第三步:初始化主namenode
第四步:初始化备namenode,保证主备节点上的数据一致
服务
启动
# 切换路径
/e3base/hadoop/sbin/
# 执行命令
start-dfs.sh
查看状态
# 切换目录
hadoop/bin/
# 执行命令
hdfs haadmin -getServiceState nn1
hdfs haadmin -getServiceState nn2
组件理解
介绍
HDFS:分布式文件管理系统中的一种。是一个文件系统。用于存储文件,通过目录树来定位文件。也是分布式的,由服务器联合起来实现。
适合一次写入,多次读出。且不支持文件的修改。
优点:
高容错性:数据自动保存多个副本
适合处理大数据:数据规模、文件规模
可构架在廉价机器上,通过副本机制,提高可靠性
缺点:
不适合低延时数据访问
无法高效的对大量小文件进行存储
不吃并发写入,文件随机修改
组成
- namenode,master管理者。
1、管理HDFS名称空间
2、配置副本策略
3、管理数据块映射信息
4、处理客户端读写请求
- datanode,slave。namenode下达命令,来执行实际的操作
1、存储实际的数据块
2、执行数据块的读写操作
- client,客户端
1、文件切分。在文件上传的时候,会将文件切分成一个一个的block,然后上传
2、与namenode交互,获取文件的信息
3、与datanode交互,读取或者写入数据
4、client提供一些命令来管理HDFS,例如,namenode的格式化
5、client通过一些命令来访问HDFS,对HDFS的增删改查操作
- secondary namenode:并不是namenode的热备。当namonode挂掉,并不能及时的替换
1、辅助namenode,分担工作量。定期合并Fsimage与edits,并推送给namenode
2、紧急情况下,辅助恢复namenode
文件块大小
HDFS中的文件在物理上是分块存储。块的大小可以通过配置参数来设置(dfs.blocksize)默认大小在1.x版本是64M。之后是128M
如果寻址时间是10ms,那么查找到block的时间就是10ms
寻址时间为传输时间的1%,为最佳。10ms的寻址时间,1s的传输时间
目前磁盘的传输速率为100MB/s
问题:
5block大小 = 1s * 100MB/s = 100M
为什么block不能设置太小,也不能太大?
HDFS块设置的太小,会增加寻址时间,程序会一直在找块开始的位置
设置的太大,从磁盘传输的时间会明显大于定位这个块开始位置所需要的时间。导致程序处理这块数据非常慢
总结:
HDFS块的大小设置主要取决于磁盘的传输速率
问题
在HDFS的安装部署过程中,进行初始化的时候,碰到以下问题。
# 位置
在初始化的时候,第二步启动journal node进程。
/e3base/hadoop/bin/hdfs --daemon start journalnode
也就是cd 到/e3base/hadoop/bin目录下,然后执行hdfs --daemon start journalnode命令
# 出现问题1:
ERROR: Cannot set priority of journalnode process 9112
# 原因
在hdfs-site.xml文件配置中,
原本的书写形式:
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/data1/jn</value>
</property>
正确的书写形式:
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/e3base/e3-info/hadoop/data1/jn</value>
</property>
为什么在/data1前添加了绝对位置?
因为:在程序执行的时候,执行配置文件,如果不是绝对位置的文件,没有权限创建不成功,所以出现问题
所以:根据自己定义的目录格式,进行文件的创建
# 问题2:
ls: cannot access /e3base/hive/tez: No such file or directory
ls: cannot access /e3base/hive/tez/lib: No such file or directory
# 原因
在执行初始化的过程中,会执行到配置文件hadoop-env.sh文件,在这个文件中,
export TEZ_HOME=$IN_HOME/hive/tez,但是这个目录并不存在,所以报错
# 方法
在配置文件hadoop-env.sh中,
将 eport TEZ_HOME=$IN_HOME/hive/tez注释掉即可
# 位置
初始化主namenode节点
在需要做主namenode节点主机上进入$HADOOP_HOME/bin执行如下命令实现初始化HDFS目录、文件:
/e3base/hadoop/bin/hdfs namenode -format
在初始化主namenode的时候,出现错误,提示:org.apache.ranger.authorization.hadoop.RangerHdfsAuthorizer not found
# 原因
执行配置文件hdfs-site.xml文件的时候,会有加载RangerHdfsAuthorizer,这一项。但是在目前的集群搭建过程中,并没有配置的RangerHdfsAuthorizer,这个东西。如果需要把RangerHdfsAuthorizer的标签注释掉或者删除
# 方法
hdfs-site.xml文件中的hdfs-site.xml标签删掉
总结:经过今天的安装部署,整体上对HDFS启动的流程有了一点认识。目前的理解是:解决问题主要从配置文件入手。看报错的信息、查看日志。