Hadoop基础入门(1):框架概述及集群环境搭建

142 阅读3分钟

Hadoop基础入门(1)

Hadoop是一个由Apache基金会所开发的分布式系统基础架构

概述

hadoop的优势

1.高可靠性:Hadoop底层维护多个数据副本,所以即使Hadoop某个计算元素或存储出现故障,也不会导致数据的丢失

2.高扩展性:在集群间分配任务数据,可方便的扩展数以千计的节点(动态地增加服务器)

3.高效性:在MapReduce的思想下,Hadoop是并行工作的,以加快任务处理速度

4.高容错性:能够自动将失败的任务重新分配

*Hadoop1.x、2.x、3.x区别

Hadoop 运行环境搭建

本运行环境搭建教程适用于学习使用的虚拟机系统,共需3台虚拟机,推荐使用VMWare,ssh登录使用Xshell;环境搭建中虚拟机hostname,ip地址等参数需要根据自己的配置来进行修改,切勿照搬文章内容

环境准备

虚拟机配置

操作系统:CentOS-7.5

软件包安装:

yum install -y epel-release

Extra Packages for Enterprise Linux 是为“红帽系”的操作系统提供额外的软件包,适用于 RHEL、CentOS 和 Scientific Linux。相当于是一个软件仓库,大多数 rpm 包在官方repository 中是找不到的)

(如果是最小系统版,还需安装net-tool和vim编辑器:

yum install -y net-tools

yum install -y vim

关闭防火墙

systemctl stop firewalld 关闭防火墙

systemctl status firewalld:查看防火墙状态

systemctl disable firewalld.service 禁用防火墙服务

创建用户

一般不在root用户下直接进行操作

useradd why:创建用户

passwd why:创建密码

vim /etc/sudoers ——>在%wheel下添加why ALL=(ALL) NOPASSWD:ALL:授权root权限

修改文件夹所属用户

chown why:why /opt/module:修改module文件夹的所有者和所属组均为why

卸载虚拟机自带的 JDK

首先切换到root用户

rpm -qa | grep -i java | xargs -n1 rpm -e --nodeps

环境准备完成后reboot重启虚拟机

网络设置

修改虚拟机静态IP

vim /etc/sysconfig/network-scripts/ifcfg-ens33

需要修改的内容如下:

BOOTPROTO=static #静态IP
IPADDR=192.168.10.102 #IP地址
GATEWAY=192.168.10.2 #网关地址
DNS1=192.168.10.2 #DNS地址

设置Linux中VMnet8

与虚拟机的静态IP相对应即可

时间同步

同步阿里云时钟服务器:

yum -y install ntpdate

ntpdate ntp.aliyun.com

输入date查看当前时间是否已经同步

主机设置

vim /etc/hostname:修改主机名称(根据自己需求设置即可)

vim /etc/hosts:配置主机映射(格式:主机名称 ip地址)(原有内容尽量不要动)

windows系统

进入C:\Windows\System32\drivers\etc路径,修改hosts文件,设置主机映射

JDK安装

文件格式:jdk-8u212-linux-x64.tar.gz

解压命令:tar -zxvf 压缩文件 -C 路径

配置环境变量:sudo vim /etc/profile.d/my_env.sh

#JAVA_HOME
export JAVA_HOME=/opt/module/jdk1.8.0_212 #路径自定义
export PATH=$PATH:$JAVA_HOME/bin

测试是否安装成功:java -version

hadoop安装

文件格式:hadoop-3.1.3.tar.gz

配置环境变量:sudo vim /etc/profile.d/my_env.sh

#HADOOP_HOME
export HADOOP_HOME=/opt/module/hadoop-3.1.3 #路径自定义
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin

测试是否安装成功:hadoop version

hadoop文件目录:

搭建完全分布式模式集群

ssh免密登录

cd ~/.ssh:进入.ssh文件夹

.ssh的功能:

ssh-keygen -t rsa生成密钥文件和私钥文件

ssh-copy-id 目标机器:将公钥复制到目标机器的授权文件(authorized_keys)中

直接将id_rsa.pub复制到authorized_keys中也能生效

集群相关配置

NameNode 和 SecondaryNameNode 不要安装在同一台服务器

ResourceManager 也很消耗内存,不要和 NameNode、SecondaryNameNode 配置在同一台机器上

注意:集群相关配置文件中,

分割线以下的内容不是必须配置的

如需根据自己需求配置具体内容,可从gitee.com/wu-haoyi/bi…下载默认配置文件搜索查看;该默认配置文件在hadoop安装路径下的share文件夹里也有

core-site.xml

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
 <!-- 指定 NameNode 的地址 -->
 <property>
 <name>fs.defaultFS</name>
 <value>hdfs://hadoop102:8020</value>
 </property>
  
 <!-- 指定 hadoop 数据的存储目录(data文件夹不用提前创建) -->
 <property>
 <name>hadoop.tmp.dir</name>
 <value>/opt/module/hadoop/data</value>
 </property>
  
 <!-- 配置 HDFS 网页登录使用的静态用户为 why(这个配置是为了解决网页显示文件内容出错的问题) -->
 <property>
 <name>hadoop.http.staticuser.user</name>
 <value>atguigu</value>
 </property>

<!--配置该superUser允许通过代理访问的主机节点-->
  <property>
    <name>hadoop.proxyuser.why.hosts</name>
    <value>*</value>
 </property>
  <!--配置该superUser允许通过代理访问的用户组-->
 <property>
    <name>hadoop.proxyuser.why.groups</name>
    <value>*</value>
 </property>
  <!--配置该superUser允许代理的用户-->
 <property>
    <name>hadoop.proxyuser.why.users</name>
    <value>*</value>
 </property>
  
</configuration>

有关hadoop中的ProxyUser

Hadoop中的ProxyUser_Ynzo的博客-CSDN博客_hadoop.proxyuser.hadoop.hosts

hdfs-site.xml

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
  
<!-- nn web 端访问地址-->
<property>
 <name>dfs.namenode.http-address</name>
 <value>hadoop102:9870</value>
 </property>
  
<!-- 2nn web 端访问地址-->
 <property>
 <name>dfs.namenode.secondary.http-address</name>
 <value>hadoop104:9868</value>
 </property>

<!--///////////////////////////////////////////////-->
  
<!--NameNode线程池-->
<!--默认值是10,如果该值设的太小,明显的状况就是DataNode在连接NameNode的时候总是超时或者连接被拒绝,一般将其设置为集群大小的自然对数乘以20-->
<property>
    <name>dfs.namenode.handler.count</name>
    <value>21</value>
</property>

<!---------------------------------------->
<!--SecondaryNameNode相关-->
<!--SecondaryNameNode 每隔一小时执行一次 进行fsimage和edits文件的合并-->
<property>
 <name>dfs.namenode.checkpoint.period</name>
 <value>3600s</value>
</property>

<!--一分钟检查一次操作次数,当操作次数达到 1 百万时,SecondaryNameNode 执行一次-->
<property>
  <name>dfs.namenode.checkpoint.txns</name>
 <value>1000000</value>
<description>操作动作次数</description>
</property>
<property>
 <name>dfs.namenode.checkpoint.check.period</name>
 <value>60s</value>
<description> 1 分钟检查一次操作次数</description>
</property>
<!---------------------------------------->
<!--DataNode相关-->
<!--DN 向 NN 汇报当前解读信息的时间间隔,默认 6 小时-->
<property>
<name>dfs.blockreport.intervalMsec</name>
<value>21600000</value>
<description>Determines block reporting interval in milliseconds.</description>
</property>

<!--DN 扫描自己节点块信息列表的时间,默认 6 小时-->  
<property>
<name>dfs.datanode.directoryscan.interval</name>
<value>21600s</value>
<description>Interval in seconds for Datanode to scan datadirectories and reconcile the difference between blocks in memory and on the disk.
Support multiple time unit suffix(case insensitive), as described in dfs.heartbeat.interval.
</description>
</property>

<!--掉线时限相关设置-->
<property>
 <name>dfs.namenode.heartbeat.recheck-interval</name>
 <value>300000</value>
 <description>单位是ms</description>
</property>
  
<property>
 <name>dfs.heartbeat.interval</name>
 <value>3</value>
 <description>单位是s</description>
</property>
  
</configuration>

有关dfs.namenode.handler.count的详解:

dfs.namenode.handler.count配置参数的总要性_Michealkz的博客-CSDN博客_dfs.namenode.handler.count

yarn-site.xml

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
  
 <!-- 指定 MR 走 shuffle -->
 <property>
 <name>yarn.nodemanager.aux-services</name>
 <value>mapreduce_shuffle</value>
 </property>
  
 <!-- 指定 ResourceManager 的地址-->
 <property>
 <name>yarn.resourcemanager.hostname</name>
 <value>hadoop103</value>
 </property>
  
 <!-- 环境变量的继承 -->
 <property>
 <name>yarn.nodemanager.env-whitelist</name>
<value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CO
NF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAP
RED_HOME</value>
 </property>

<!--yarn application使用的classpath-->
<property>
  <name>yarn.application.classpath</name>
  <value>
                /opt/module/hadoop-3.1.3/etc/hadoop,
                /opt/module/hadoop-3.1.3/share/hadoop/common/lib/*,
                /opt/module/hadoop-3.1.3/share/hadoop/common/*,
                /opt/module/hadoop-3.1.3/share/hadoop/hdfs,
                /opt/module/hadoop-3.1.3/share/hadoop/hdfs/lib/*,
                /opt/module/hadoop-3.1.3/share/hadoop/hdfs/*,
                /opt/module/hadoop-3.1.3/share/hadoop/mapreduce/lib/*,
                /opt/module/hadoop-3.1.3/share/hadoop/mapreduce/*,
                /opt/module/hadoop-3.1.3/share/hadoop/yarn,
                /opt/module/hadoop-3.1.3/share/hadoop/yarn/lib/*,
                /opt/module/hadoop-3.1.3/share/hadoop/yarn/*,

  </value>
 </property>

<!-- 开启日志聚集功能 -->
<property>
 <name>yarn.log-aggregation-enable</name>
 <value>true</value>
</property>
<!-- 设置日志聚集服务器地址 -->
<property>
 <name>yarn.log.server.url</name>
 <value>http://hadoop102:19888/jobhistory/logs</value>
</property>
<!-- 设置日志保留时间为 7 天 -->
<property>
 <name>yarn.log-aggregation.retain-seconds</name>
 <value>604800</value>
</property>

<!--///////////////////////////////////////////////-->
  
  <!--关闭虚拟内存检查-->
<property>
    <name>yarn.nodemanager.vmem-check-enabled</name>
    <value>false</value>
</property>

  <property>
   <name>yarn.scheduler.minimum-allocation-mb</name>
   <value>4096</value>
   <description>default value is 1024</description>
</property>

<property>
 <name>yarn.resourcemanager.am.max-attempts</name>
 <value>4</value>
 <description>
 The maximum number of application master execution attempts.
 </description>
</property>

  
</configuration>

如何理解hadoop中配置项yarn.nodemanager.env-whitelist?

这是hadoop3.x版本的一个bug,这个参数就是设置了一些环境变量,如果不加的话,在3.1.3版本中可能出错

网上查找资料得知3.2版本之后该bug已修复

根据官方bug报告推测:[YARN-10511] Update yarn.nodemanager.env-whitelist value in docs - ASF JIRA

应当是修改了该参数的默认值,防止了出现bug的情况

yarn.application.classpath详解:yarn进程使用的.class文件的路径

yarn的日志聚集功能:应用运行完成以后,将程序运行日志信息上传到 HDFS 系统上

mapred-site.xml

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- 指定 MapReduce 程序运行在 Yarn 上 -->
 <property>
 <name>mapreduce.framework.name</name>
 <value>yarn</value>
 </property>

<!--查看历史运行情况-->
<!-- 历史服务器端地址 -->
<property>
 <name>mapreduce.jobhistory.address</name>
 <value>hadoop102:10020</value>
</property>
<!-- 历史服务器 web 端地址 -->
<property>
 <name>mapreduce.jobhistory.webapp.address</name>
 <value>hadoop102:19888</value>
</property>
  
</configuration>

workers

在文件中添加集群中机器的hostname

注意:该文件中添加的内容结尾不允许有空格,文件中不允许有空行

集群启动

格式化NameNode:hdfs namenode -format

注意:格式化 NameNode,会产生新的集群 id,导致 NameNode 和 DataNode 的集群 id 不一致,集群找

不到已往数据。如果集群在运行过程中报错,需要重新格式化 NameNode 的话,一定要先停止namenode 和 datanode 进程,并且要删除所有机器的 data 和 logs 目录,然后再进行格式化

HDFS:sbin/start-dfs.sh

YARN:sbin/start-yarn.sh

历史服务器:mapred --daemon start historyserver

Web端

查看namenode:http://hadoop102:9870

查看 YARN 的 ResourceManager:http://hadoop103:8088

查看 JobHistory:http://hadoop102:19888/jobhistory