部署安装

环境准备

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启动的流程有了一点认识。目前的理解是:解决问题主要从配置文件入手。看报错的信息、查看日志。

End

本文标题:大数据-HDFS

本文链接:https://www.tzer.top/archives/109.html

除非另有说明,本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议

声明:转载请注明文章来源。

最后修改:2021 年 09 月 10 日
如果觉得我的文章对你有用,请随意赞赏