赞
踩
目录
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 | √ |
将Apache Hadoop 3.2.2的安装包下载或上传至其中一台机器上,此处选择master机器,解压至合适的目录,并以解压后得到的目录作为HADOOP_HOME目录,完成所有的配置完成后将HADOOP_HOME目录复制到其他所有机器上。
修改${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"
修改${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>
修改${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在首次启动时需要进行初始化操作,初始化只能执行一次,多次执行会导致已存在数据丢失,具体步骤如下:
首先需要在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
在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/
在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
在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
在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
在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文件中存放统计结果,如下图所示:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。