Hadoop安装部署

目录

HDFS安装部署

hadoop-env.sh配置

core-site.xml配置

hdfs-site.xml配置

工作节点配置

目录分发

环境变量配置

初始化HDFS

YARN安装部署

yarn-env.sh配置

yarn-site.xml配置

mapred-env.sh配置

mapred-site.xml配置

启动YARN集群


Hadoop作为大数据的基石,提供数据存储能力(HDFS)、数据分析编程框架(MapReduce)、计算资源管理框架(YARN),允许使用者在普通的Linux服务器上创建大规模的分布式文件系统,HBase、Hive等大数据软件底层都依赖Hadoop。

Hadoop集群一般采用高可用的方式部署,即两个NameNode和两个Resourcemanager,构成主备结构,当主进程异常时会自动切换到备进程上,保证服务的正常运行,根据经验,比较常见的Hadoop版本为2.6.x、2.8.x、3.2.x,目前大部分公司还是Hadoop 2的大版本,但是也有越来越多的公司转移到Hadoop 3版本,本次安装部署选择Apache Hadoop 3.2.2版本,默认以root用户进行操作。

详细部署规划如下表所示:

master

backup

worker1

worker2

worker3

NameNode

JournalNode

DataNode

DFSZKFailoverController

ResourceManager

NodeManager

JobHistoryServer

HDFS安装部署

将Apache Hadoop 3.2.2的安装包下载或上传至其中一台机器上,此处选择master机器,解压至合适的目录,并以解压后得到的目录作为HADOOP_HOME目录,完成所有的配置完成后将HADOOP_HOME目录复制到其他所有机器上。

hadoop-env.sh配置

修改${HADOOP_HOME}/etc/hadoop/hadoop-env.sh文件,修改内容如下:

# Hadoop使用的Java配置
export JAVA_HOME=/opt/jdk1.8.0_301

# Hadoop安装目录配置
export HADOOP_HOME=/opt/hadoop-3.2.2/

# Hadoop日志目录配置
export HADOOP_LOG_DIR=/data/hadoop/logs

# Hadoop进程默认的最大和最小内存配置,单位:MB
export HADOOP_HEAPSIZE_MAX=2048
export HADOOP_HEAPSIZE_MIN=1024

# SSH端口配置,如果修改了默认的SSH,需要配置该项
export HADOOP_SSH_OPTS="-p 22"

# Hadoop进程号文件目录配置
export HADOOP_PID_DIR=/data/hadoop/pids

# NameNode的JVM参数配置
export HDFS_NAMENODE_OPTS="-Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.port=8010 -Xms4096m -Xmx4096m -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75 $HDFS_NAMENODE_OPTS"

# DataNode的JVM参数配置
export HDFS_DATANODE_OPTS="-Dhadoop.security.logger=ERROR,RFAS -Xms2048m -Xmx4096m $HDFS_DATANODE_OPTS"

core-site.xml配置

修改${HADOOP_HOME}/etc/hadoop/core-site.xml文件,修改内容如下:

<configuration>
  <property>
    <name>fs.defaultFS</name>
    <value>hdfs://hc-hdfs</value>
    <discription>参数fs.default.name已经废弃</discription>
  </property>
  <property>
    <name>hadoop.tmp.dir</name>
    <value>/data/hdfs/tmp/${user.name}</value>
    <discription>Hadoop临时目录配置,该配置非常重要</discription>
  </property>
  <property>
    <name>ha.zookeeper.quorum</name>
    <value>master:2181,backup:2181,worker1:2181</value>
    <discription>Hadoop集群高可用使用的Zookeeper集群</discription>
  </property>
  <property>
    <name>hadoop.http.staticuser.user</name>
    <value>root</value>
    <discription>Hadoop页面的静态用户</discription>
  </property>

<!-- 使用Hive Beeline时需要配置以下两项 -->
  <property>
    <name>hadoop.proxyuser.root.hosts</name>
    <value>*</value>
    <discription>允许通过httpfs的方式访问HDFS的主机,*表示任意</discription>
  </property>
  <property>
    <name>hadoop.proxyuser.root.groups</name>
    <value>*</value>
    <discription>允许通过httpfs的方式访问HDFS的用户组,*表示任意</discription>
  </property>
</configuration>

hdfs-site.xml配置

修改${HADOOP_HOME}/etc/hadoop/hdfs-site.xml文件,修改内容如下:

<configuration>
<!-- 基础配置 -->
  <property>
    <name>dfs.namenode.name.dir</name>
    <value>/data/hdfs/metadata</value>
    <discription>NameNode元数据目录列表,逗号分隔</discription>
  </property>
  <property>
    <name>dfs.datanode.data.dir</name>
    <value>/data/hadoop/data1,/data/hadoop/data2</value>
    <discription>DataNode数据目录列表,逗号分隔</discription>
  </property>
  <property>
    <name>dfs.journalnode.edits.dir</name>
    <value>/data/hdfs/editlogs</value>
    <discription>JournalNode数据目录</discription>
  </property>
  <property>
    <name>dfs.datanode.du.reserved</name>
    <value>53687091200</value>
    <discription>磁盘预留大小,根据DataNode数据盘大小来设置,单位:Byte</discription>
  </property>
  <property>
    <name>dfs.replication</name>
    <value>2</value>
    <discription>数据块的副本数</discription>
  </property>

<!-- HDFS短路读配置 -->
  <property>
    <name>dfs.client.read.shortcircuit</name>
    <value>true</value>
    <discription>开启HDFS短路读</discription>
  </property>
  <property>
    <name>dfs.domain.socket.path</name>
    <value>/var/lib/hadoop-hdfs/dn_socket</value>
    <discription>用于实现短路读的socket文件生成路径</discription>
  </property>
  <property>
    <name>dfs.datanode.data.dir.perm</name>
    <value>700</value>
    <discription>DataNode使用使用目录的权限</discription>
  </property>
  <property>
    <name>dfs.block.local-path-access.user</name>
    <value>root</value>
    <discription>允许访问dfs.domain.socket.path目录的用户列表,逗号分隔</discription>
  </property>

<!-- HDFS高可用配置 -->
  <property>
    <name>dfs.nameservices</name>
    <value>hc-hdfs</value>
    <discription>HDFS文件系统的逻辑名称</discription>
  </property>
  <property>
    <name>dfs.ha.namenodes.hc-hdfs</name>
    <value>nn1,nn2</value>
    <discription>在dfs.nameservices中的NameNode节点列表</discription>
  </property>
  <property>
    <name>dfs.namenode.rpc-address.hc-hdfs.nn1</name>
    <value>master:8020</value>
    <discription>nn1节点上客户端请求的RPC地址</discription>
  </property>
  <property>
    <name>dfs.namenode.rpc-address.hc-hdfs.nn2</name>
    <value>backup:8020</value>
    <discription>nn2节点上客户端请求的RPC地址</discription>
  </property>
  <property>
    <name>dfs.namenode.http-address.hc-hdfs.nn1</name>
    <value>master:50070</value>
    <discription>nn1节点上的HDFS网页访问地址</discription>
  </property>
  <property>
    <name>dfs.namenode.http-address.hc-hdfs.nn2</name>
    <value>backup:50070</value>
    <discription>nn2节点上的HDFS网页访问地址</discription>
  </property>
  <property>
    <name>dfs.namenode.shared.edits.dir</name>
    <value>qjournal://master:8485;backup:8485;worker1:8485/hc-hdfs</value>
    <discription>共享元数据编辑日志存放的目录</discription>
  </property>
  <property>
    <name>dfs.ha.automatic-failover.enabled</name>
    <value>true</value>
    <discription>自动故障转移,需要在core-site.xml中配置ha.zookeeper.quorum参数</discription>
  </property>
  <property>
    <name>dfs.client.failover.proxy.provider.hc-hdfs</name>
    <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
    <discription>开启高可用的情况下,客户端访问Active NameNode的代理类</discription>
  </property>
  <property>
    <name>dfs.ha.fencing.methods</name>
    <value>sshfence</value>
    <discription>防止脑裂的方法</discription>
  </property>
  <property>
    <name>dfs.ha.fencing.ssh.private-key-files</name>
    <value>/root/.ssh/id_rsa</value>
    <discription>使用sshfence时ssh私钥的路径</discription>
  </property>
  <property>
    <name>ha.zookeeper.session-timeout.ms</name>
    <value>60000</value>
    <discription>高可用依赖的Zookeeper集群的会话超时时间,单位:ms</discription>
  </property>
</configuration>

工作节点配置

修改${HADOOP_HOME}/etc/hadoop/workers文件,在其中添加工作节点的IP,每个IP占用一行,修改内容如下:

${worker1 ip or hostname}
${worker2 ip or hostname}
${worker3 ip or hostname}

目录分发

至此,HDFS的配置已经完成,可以将HADOOP_HOME目录复制到其他机器上,命令如下:

# 其他机器上的HADOOP_HOME目录最好与当前机器保持一致,方便管理
scp -r ${HADOOP_HOME path} ${other node}:${HADOOP_HOME path}

环境变量配置

每一台部署HDFS的机器上配置相关的环境变量,命令如下:

# 为了避免覆盖环境变量文件,不建议直接分发环境变量文件
# 在环境变量文件/etc/profile中增加如下内容
export HADOOP_HOME=/opt/hadoop-3.2.2
export PATH=${HADOOP_HOME}/bin:${HADOOP_HOME}/sbin:$PATH
export HADOOP_CLASSPATH=`hadoop classpath`

# 保存退出后,执行以下命令使环境变量生效
source /etc/profile

初始化HDFS

HDFS在首次启动时需要进行初始化操作,初始化只能执行一次,多次执行会导致已存在数据丢失,具体步骤如下:

首先需要在zookeeper中注册HDFS节点,命令如下:

hdfs zkfc -formatZK

以上命令执行成功时如下图所示:

在master、backup、worker1机器上启动JournalNode进程,命令如下:

hdfs --daemon start journalnode

在任意NameNode机器上执行NameNode初始化操作,此处选择master机器,命令如下:

hdfs namenode -format

以上命令执行成功时如下图所示:

在这个成功初始化的NameNode机器上启动NameNode进程,命令如下:

hdfs --daemon start namenode

在backup机器上拷贝maser机器上已经初始化好的NameNode的元数据,命令如下:

hdfs namenode -bootstrapStandby

以上命令执行成功时如下图所示:

在backup机器上启动NameNode进程,命令如下:

hdfs --daemon start namenode

在master和backup机器上启动DFSZKFailoverController进程,使NameNode完成选举,命令如下:

hdfs --daemon start zkfc

在worker1、worker2、worker3机器上启动DataNode进程,命令如下:

hdfs --daemon start datanode

至此,HDFS的所有相关进程启动完毕,可以对集群进行简单的测试,命令如下:

# 检查NameNode状态
# 正常情况下两个NameNode分别有两种状态:active,standby
# active状态:对外提供服务
# standby状态:同步Active NameNode的元数据
hdfs haadmin -getServiceState nn1
hdfs haadmin -getServiceState nn2

# 查看HDFS文件系统根目录
hdfs dfs -ls /

# 在HDFS的根目录下创建test目录,并上传文件到test目录中
hdfs dfs -mkdir /test
hdfs dfs -put ${local file} /test

# 从HDFS上下载文件到本地
hdfs dfs -get ${hdfs file path} ${local path}

在日常使用中,一般使用start-dfs.sh和stop-dfs.sh两个脚本来启停HDFS集群进程,但是当使用root用户执行时会报错,需要${HADOOP_HOME}/sbin目录下的start-dfs.sh和stop-dfs.sh脚本,命令如下:

# 在脚本开头添加以下内容,指定进程的启动用户
HDFS_NAMENODE_USER=root
HDFS_DATANODE_USER=root
HDFS_JOURNALNODE_USER=root
HDFS_ZKFC_USER=root

# 保存退出后,将修改的脚本分发到其他机器上
scp ${HADOOP_HOME}/sbin/st*-dfs.sh ${other ip}:${HADOOP_HOME}/sbin

YARN安装部署

yarn-env.sh配置

在master机器上修改${HADOOP_HOME}/etc/hadoop/yarn-env.sh文件,增加或修改以下内容,命令如下:

# 配置YARN进程日志的目录
export YARN_LOG_DIR=/data/yarn/logs

# 配置YARN进程pid文件保存目录
export YARN_PID_DIR=/data/yarn/pids

# 配置ResourceManager的JVM内存
export YARN_RESOURCEMANAGER_OPTS="-Xms4096m -Xmx4096m $YARN_RESOURCEMANAGER_OPTS"

# 配置NodeManager的JVM内存
export YARN_NODEMANAGER_OPTS="-Xms2048m -Xmx2048m $YARN_NODEMANAGER_OPTS"

# 保存退出后,将yarn-env.sh文件分发到其他机器上
scp ${HADOOP_HOME}/etc/hadoop/yarn-env.sh ${other ip}:${HADOOP_HOME}/etc/hadoop/

yarn-site.xml配置

在master机器上修改${HADOOP_HOME}/etc/hadoop/yarn-site.xml文件,增加或修改以下内容:

<configuration>
  <!-- ResourceManager配置项 -->
  <property>
    <name>yarn.resourcemanager.ha.enabled</name>
    <value>true</value>
    <description>开启RM高可用</description>
  </property>
  <property>
    <name>yarn.resourcemanager.zk-address</name>
    <value>master:2181,backup:2181,worker1:2181</value>
    <description>高可用使用的ZK集群,该参数已废弃,不推荐使用</description>
  </property>
  <property>
    <name>hadoop.zk.address</name>
    <value>master:2181,backup:2181,worker1:2181</value>
    <description>高可用使用的ZK集群</description>
  </property>
  <property>
    <name>yarn.resourcemanager.ha.automatic-failover.enabled</name>
    <value>true</value>
    <description>开启自动故障转移,默认情况下,仅在开启高可用时启用</description>
  </property>
  <property>
    <name>yarn.resourcemanager.recovery.enabled</name>
    <value>true</value>
    <description>启用任务自动恢复</description>
  </property>
  <property>
    <name>yarn.resourcemanager.store.class</name>
    <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
    <description>指定任务状态存储的类,启用任务自动恢复时需要配置该参数</description>
  </property>
  <property>
    <name>yarn.resourcemanager.zk-state-store.parent-path</name>
    <value>/rmstore</value>
    <description>RM在ZK中的存储节点</description>
  </property>
  <property>
    <name>yarn.resourcemanager.cluster-id</name>
    <value>yarncluster</value>
    <description>集群名称</description>
  </property>
  <property>
    <name>yarn.resourcemanager.ha.rm-ids</name>
    <value>rm1,rm2</value>
    <description>参与高可用的RM的别称</description>
  </property>
  <property>
    <name>yarn.resourcemanager.hostname.rm1</name>
    <value>master</value>
    <description>指定别称rm1对应的RM节点主机名</description>
  </property>
  <property>
    <name>yarn.resourcemanager.hostname.rm2</name>
    <value>backup</value>
    <description>指定别称rm2对应的RM节点主机名</description>
  </property>
  <property>
    <name>yarn.resourcemanager.webapp.address.rm1</name>
    <value>master:8088</value>
    <description>指定别称rm1对应的Yarn web页面地址</description>
  </property>
  <property>
    <name>yarn.resourcemanager.webapp.address.rm2</name>
    <value>backup:8088</value>
    <description>指定别称rm2对应的Yarn web页面地址</description>
  </property>

  <!-- NodeManger配置项 -->
  <property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle,spark_shuffle</value>
    <description>辅助服务,mapreduce_shuffle用于运行MR,spark_shuffle用于支持spark动态资源管理</description>
  </property>
  <property>
    <name>yarn.nodemanager.aux-services.mapreduce_shuffle.class</name>
    <value>org.apache.hadoop.mapred.ShuffleHandler</value>
    <description>指定mapreduce_shuffle使用的类</description>
  </property>
  <property>
    <name>yarn.nodemanager.aux-services.spark_shuffle.class</name>
    <value>org.apache.spark.network.yarn.YarnShuffleService</value>
    <description>指定spark_shuffle的类,需要把jar放到${HADOOP_HOME}/share/hadoop/yarn/lib目录</description>
  </property>
  <property>
    <name>yarn.nodemanager.resource.memory-mb</name>
    <value>32768</value>
    <description>当前节点可用于计算的内存大小</description>
  </property>
  <property>
    <name>yarn.nodemanager.resource.cpu-vcores</name>
    <value>32</value>
    <description>当前节点可用于计算的核心数量,非物理CPU核心数,该参数可以大于物理核心数</description>
  </property>
  <property>
    <name>yarn.nodemanager.vmem-pmem-ratio</name>
    <value>2.1</value>
    <description>虚拟内存和物理内存的比例,一般默认2.1即可</description>
  </property>
  <property>
    <name>yarn.scheduler.maximum-allocation-mb</name>
    <value>10240</value>
    <description>单个container允许的最大内存</description>
  </property>
  <property>
    <name>yarn.scheduler.maximum-allocation-vcores</name>
    <value>10</value>
    <description>单个container允许的最大核心数</description>
  </property>
  <property>
    <name>yarn.nodemanager.local-dirs</name>
    <value>/data/yarn/local</value>
    <description>任务本地数据目录</description>
  </property>
  <property>
    <name>yarn.nodemanager.log-dirs</name>
    <value>/data/yarn/log</value>
    <description>任务本地日志目录</description>
  </property>
  <property>
    <name>yarn.nodemanager.log.retain-seconds</name>
    <value>604800</value>
    <description>本地日志保留时间,开启日志聚合时该参数无效</description>
  </property>

<!-- 日志聚合配置项 -->
  <property>
    <name>yarn.log-aggregation-enable</name>
    <value>true</value>
    <description>开启日志聚合</description>
  </property>
  <property>
    <name>yarn.nodemanager.delete.debug-delay-sec</name>
    <value>86400</value>
    <description>开启日志聚合后,本地日志删除延迟时间</description>
  </property>
  <property>
    <name>yarn.log-aggregation.retain-seconds</name>
    <value>604800</value>
    <description>HDFS上日志保留时间</description>
  </property>
  <property>
    <name>yarn.nodemanager.remote-app-log-dir</name>
    <value>/yarn/app-logs</value>
    <description>HDFS上日志保留目录,实际全路径为:该参数+${user}+子目录</description>
  </property>
  <property>
    <name>yarn.nodemanager.remote-app-log-dir-suffix</name>
    <value>logs</value>
    <description>日志目录的子目录</description>
  </property>
  <property>
    <name>yarn.log.server.url</name>
    <value>http://backup:19888/jobhistory/logs</value>
    <description>日志服务器url</description>
  </property>

  <property>
    <name>yarn.application.classpath</name>
    <value>
      /opt/hadoop-3.2.2/etc/hadoop,
      /opt/hadoop-3.2.2/share/hadoop/common/lib/*,
      /opt/hadoop-3.2.2/share/hadoop/common/*,
      /opt/hadoop-3.2.2/share/hadoop/hdfs,
      /opt/hadoop-3.2.2/share/hadoop/hdfs/lib/*,
      /opt/hadoop-3.2.2/share/hadoop/hdfs/*,
      /opt/hadoop-3.2.2/share/hadoop/mapreduce/lib/*,
      /opt/hadoop-3.2.2/share/hadoop/mapreduce/*,
      /opt/hadoop-3.2.2/share/hadoop/yarn/*,
      /opt/hadoop-3.2.2/share/hadoop/yarn/lib/*
    </value>
    <description>Yarn任务的classpath</description>
  </property>
</configuration>

配置完成后,将该文件分发到其他机器上,命令如下:

scp ${HADOOP_HOME}/etc/hadoop/yarn-site.xml ${other ip}:${HADOOP_HOME}/etc/hadoop

mapred-env.sh配置

在master机器上修改${HADOOP_HOME}/etc/hadoop/mapred-env.sh文件,增加或修改以下内容:

# 历史服务器进程的JVM内存配置
export HADOOP_JOB_HISTORYSERVER_HEAPSIZE=1024

# 日志目录配置
export HADOOP_LOG_DIR=/data/yarn/logs

# 进程pid文件目录配置
export HADOOP_PID_DIR=/data/yarn/pids

# 保存退出后,将该文件分发到其他机器上
scp ${HADOOP_HOME}/etc/hadoop/mapred-env.sh ${other ip}:${HADOOP_HOME}/etc/hadoop

mapred-site.xml配置

在master机器上修改${HADOOP_HOME}/etc/hadoop/mapred-site.xml文件,增加或修改以下内容:

<configuration>
  <property>
    <name>mapreduce.framework.name</name>
    <value>yarn</value>
    <description>MapReduce运行的资源调度框架</description>
  </property>
  <property>
    <name>mapreduce.jobhistory.address</name>
    <value>backup:10020</value>
    <description>任务历史服务器通信地址</description>
  </property>
  <property>
    <name>mapreduce.jobhistory.webapp.address</name>
    <value>backup:19888</value>
    <description>任务历史服务器web页面访问地址</description>
  </property>
</configuration>

配置完成后,将该文件分发到其他机器上,命令如下:

scp ${HADOOP_HOME}/etc/hadoop/mapred-site.xml ${other ip}:${HADOOP_HOME}/etc/hadoop

启动YARN集群

在master和backup机器上启动ResourceManager进程,命令如下:

yarn --daemon start resourcemanager

在worker1、worker2、worker3机器上启动NodeManager进程,命令如下:

yarn --daemon start nodemanager

在backup机器上启动JobHistoryServer进程,命令如下:

mapred --daemon start historyserver

在日常使用中,一般使用start-yarn.sh和stop-yarn.sh两个脚本来启停YARN集群进程(JobHistoryServer需要单独启停,该进程属于非必要进程),但是当使用root用户执行时会报错,需要${HADOOP_HOME}/sbin目录下的start-yarn.sh和stop-yarn.sh脚本,命令如下:

# 在脚本开头添加以下内容,指定进程的启动用户
YARN_RESOURCEMANAGER_USER=root
YARN_NODEMANAGER_USER=root

# 保存退出后,将修改的脚本分发到其他机器上
scp ${HADOOP_HOME}/sbin/st*-yarn.sh ${other ip}:${HADOOP_HOME}/sbin

向YARN集群提交MapReduce任务来测试YARN集群,运行Hadoop自带的WordCount测试用例,命令如下:

# 在以下目录找到对应的测试用例jar文件
cd ${HADOOP_HOME}/share/hadoop/mapreduce/

# 运行WordCount任务
# /test是HDFS目录,存放需要分析的文本文件
# /output是HDFS目录,存放结果文件,运行任务时该目录必须不存在,由任务自动创建
hadoop jar hadoop-mapreduce-examples-3.2.2.jar wordcount /test /output

任务运行成功之后如下图所示:

在HDFS查看结果目录,_SUCCESS文件是任务运行状态标志文件,part-r-00000文件中存放统计结果,如下图所示:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值