作者:codejiwei
日期:2020-05-01
1 Hadoop运行环境搭建
①虚拟机环境准备
-
克隆虚拟机(克隆-完全复制)
-
修改克隆虚拟机的静态ip(物理ip地址)和主机名等
- vim /etc/udev/rules.d/70-persistent-net.rules
- 删除,修改为0,复制物理ip地址
- vim /etc/sysconfig/network-scripts/ifcfg-eth0
- 修改HWADDR=复制的物理ip地址;前提(ONBOOT=yes NM=CONTROLLED=yes BOOTROTO=static);修改IPADDR,修改GATEWAY=网关ip,DNS1=网关ip
- vim /etc/sysconfig/network
- 修改主机名
- vim /etc/hosts
- 配置hosts节点,所有的节点ip+hostname
-
关闭防火墙!!!(不然访问页面端口时会无法连接)
-
chkconfig iptables off 关闭防火墙
-
service iptables stop 关闭防火墙服务
查看防火墙自启情况:chkconfig iptables --list
查看防火墙服务 service iptables status
-
-
创建atguigu用户
- useradd atguigu 创建用户
- passwd atguigu 创建密码
-
配置atguigu具有root权限
- vim /etc/sudoers 给用户root权限,以后用到root权限时使用sudo即可获得和root一样的权限
- atguigu ALL=(ALL) ALL
- 如果有必要其实也可以将atguigu放到root组内,一般不
- usermod -g root atguigu
- vim /etc/sudoers 给用户root权限,以后用到root权限时使用sudo即可获得和root一样的权限
-
在/opt目录创建文件夹(以后的安装应用放在内)
- sudo mkdir software 注意的是opt文件夹的操作权限是root!
- sudo mkdir module
- 修改这两个文件夹的所有者为atguigu
- sudo chown atguigu /software /module
②安装JDK
-
如果有jdk需要先卸载
- 查看Java软件安装情况:
- rpm -ga | java
- 如果jdk版本低于1.7,卸载
- sudo rpm -e 软件包
- 查看jdk安装路径
- which java
- 查看Java软件安装情况:
-
导入JDK到/opt/software
- 可以使用Secure CRT 按alt+p,然后定位cd /opt/software然后拖拽要传输的.tar.gz文件
- 也可以使用FileZilla或者xftp软件传输文件
-
解压JDK
-
tar -zxf jdk-8…tar.gz -C /opt/module 解压到此目录,安装完成
-
配置java环境变量
-
vim /etc/profile
-
加入:export JAVA_HOME=/opt/module/jdk1.8.0_144
export PATH= PATH:PATH:PATH:JAVA_HOME/bin
-
使环境变量生效:source /etc/profile
-
-
验证Java安装是否成功
- java -version
-
③安装Hadoop
- 也是传入Hadoop的.tar.gz文件
- 解压.tar.gz文件
- tar -zxf hadoop…tar.gz -C /opt/module
- 配置环境变量
- vim /etc/profile
- 加入export HADOOP_HOME=/opt/module/hadoop-2.7.2
- export PATH=PATH:PATH:PATH:HADOOP_HOME/bin
- export PATH=PATH:PATH:PATH:HADOOP_HOME/sbin
- 让环境变量生效 source /etc/profile
- vim /etc/profile
- 查看Hadoop是否安装成功
- hadoop version
2 Hadoop运行模式
①本地运行模式
安装完成后就是本地模式
官方Grep案例
- 在Hadoop的安装目录下创建input文件夹
- mkdir input
- 将Hadoop的xml配置文件复制到input
- cp etc/hadoop/*.xml input 需要注意此时在/opt/module/hadoop…/路径下
- 执行share目录下的mapreduce程序
- bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2jar grep input output ‘dfs[a-z.]+’ 需要说明的是此程序是过滤input文件夹内的以dfs后面是若干个字母(.过滤掉空格的)文件到output文件内。
- 查看输出结果
- cat output/*
官方wordcount案例
-
在Hadoop安装目录下创建wcinput文件夹
- mkdir wcinput
-
在此文件夹内创建一个wc.input文件
-
cd wcinput
-
touch wc.input
-
vim wc.input
-
加入内容:
hadoop yarn hadoop mapreduce atguigu atguigu
-
-
-
回到/opt/module/hadoop-2.7.2,执行程序
- bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount wcinput wcoutput
-
查看结果
- cat wcoutput/part-r-00000
atguigu 2
hadoop 2
mapreduce 1
yarn 1
②伪分布式运行模式
(1)启动HDFS运行mapreduce程序
-
配置集群
-
配置hadoop-env.sh
- 修改JDK路径(注意所有的env.sh文件都是修改JAVA_HOME变量)
- export JAVA_HOME=/opt/module/jdk1.8.0_144
-
配置core-site.xml
- 一个是HDFS的namenode地址:hdfs://hadoop101:9000
- 一个是Hadoop运行时产生文件的存储目录:/opt/module/hadoop-2.7.2/data/tmp
<!-- 指定HDFS中NameNode的地址 --> <property> <name>fs.defaultFS</name> <value>hdfs://hadoop101:9000</value> </property> <!-- 指定Hadoop运行时产生文件的存储目录 --> <property> <name>hadoop.tmp.dir</name> <value>/opt/module/hadoop-2.7.2/data/tmp</value> </property> -
配置hdfs-site.xml
- 指定HDFS副本数量,默认是3个,会分布到不同的datanode节点上
<!-- 指定HDFS副本的数量 --> <property> <name>dfs.replication</name> <value>1</value> </property>
-
-
启动集群
- 第一次启动需要格式化namenode
- bin/hdfs namenode -format
- 单个启动namenode守护进程
- sbin/hadoop-daemon.sh start namenode
- 单个启动datanode
- sbin/hadoop-daemon.sh start datanode
- 查看集群
- jps
- 第一次启动需要格式化namenode
-
在web端查看HDFS文件系统
- 地址:192.168.255.101:50070
- 或者是:hadoop101:50070
- 端口号是:50070
- 需要注意的是如果无法访问50070端口的原因:
- 可能是防火墙没有关闭
- chkconfig iptables off
- service iptables stop
-
查看产生的log日志
-
/opt/module/hadoop-2.7.2/logs

-
-
操作集群
- 在HDFS上创建一个input文件
- hdfs dfs -mkdir -p /user/atguigu/input
- 将测试文件上传到HDFS文件系统
- hdfs dfs -put /opt/module/hadoop-2.7.2/wcinput/wcinput /user/atguigu/input
- 查看上传文件是否正确
- hdfs dfs -cat /user/atguigu/input/input
- 运行mapreduce程序
- bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount /user/atguigu/input/input /user/atguigu/output
- 查看输出结果
- 命令行查看
- hdfs dfs -cat /user/atguigu/output/*
- 浏览器查看
- 可以将测试文件内容下载到本地
- 命令行下载
- hdfs dfs -get /user/atguigu/output/part-r-00000 ./wcoutput
- 浏览器下载
- 注意!!!此时无法下载的原因可能是本地的window主机并没有配置hosts
- 在C:\Windows\System32\drivers\etc\hosts内添加 各节点的ip+hostname
- 在HDFS上创建一个input文件
-
需要注意的是!下次再运行时需要删除output文件!!!
思考题
-
为什么不能多次格式化namenode也就是hdfs namenode -format
因为初次格式化会为namenode和datanode创建一样的clusterID,可以相互通信。
如果多次格式化或者不关掉namenode和datanode就格式化会导致clusterID不一致,集群找不到已往数据。
如果需要再次格式化namenode需要提前删除data数据和log日志。
(2)启动YARN运行mapreduce程序
-
配置集群的yarn
-
配置yarn-env.sh
- export JAVA_HOME=/opt/module/jdk1.8.0_144
-
配置yarn-site.xml
<!-- Reducer获取数据的方式 --> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <!-- 指定YARN的ResourceManager的地址 --> <property> <name>yarn.resourcemanager.hostname</name> <value>hadoop101</value> </property> -
配置mapred-env.sh
- export JAVA_HOME=/opt/module/jdk1.8.0_144
-
配置mapred.site.sh(将mapred-site.xml.template重命名)
<!-- 指定MR运行在YARN上 --> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property>
-
-
启动集群
- 启动前namenode和datanode需已启动
- 单个启动resourcemanager
- sbin/yarn-daemon.sh start resourcemanager
- 单个启动nodemanager
- sbin/yarn-daemon.sh start nodemanager
-
集群操作
- yarn的浏览器页面查看
- 192.168.255.101:8088
- 或者hadoop101:8088
- 删除HDFS上的output文件
- 执行mapreduce程序,wordcount程序
- yarn的浏览器页面查看
(3)配置历史服务器
为了查看程序的历史运行情况,需要配置历史服务器。
-
配置mapred-site.xml
<!-- 历史服务器端地址 --> <property> <name>mapreduce.jobhistory.address</name> <value>hadoop101:10020</value> </property> <!-- 历史服务器web端地址 --> <property> <name>mapreduce.jobhistory.webapp.address</name> <value>hadoop101:19888</value> </property> -
启动历史服务器
sbin/mr-jobhistory-daemon.sh start historyserver
-
在web端查看
192.168.255.101:19888/jobhistory
(4)配置日志的聚集
配置日志和job历史都在yarn的192.168.255.101:8088上可以看到
- 开启日志聚集功能需要冲洗启动nodemanager、resourcemanager和historyserver
-
配置yarn-site.xml
-
在里面添加
<!-- 日志聚集功能使能 --> <property> <name>yarn.log-aggregation-enable</name> <value>true</value> </property> <!-- 日志保留时间设置7天 --> <property> <name>yarn.log-aggregation.retain-seconds</name> <value>604800</value> </property>
-
-
关闭nodemanager、sourcemanager和historyserver
yarn-daemon.sh -stop resourcemanager yarn-daemon.sh -stop nodemanager yarn-jobhistory-daemon.sh -stop historyserver -
启动nodemanager、sourcemanager和historyserver
yarn-daemon.sh -start resourcemanager yarn-daemon.sh -start nodemanager mr-jobhistory-daemon.sh -start historyserver -
删除HDFS上已经存在的output文件
hdfs dfs -rm -r /user/atguigu/output -
执行wordcount程序
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount /user/atguigu/input /user/atguigu/output -
在web页面可以查看job执行进程、history处可以查看历史,进入后的log处可以查看日志信息
③完全分布式运行模式
当配置好了ssh无密登录之后就可以在单个节点上群起集群了!集群的部署规划如下表:
| hadoop102 | hadoop103 | hadoop104 | |
|---|---|---|---|
| HDFS | NameNode DataNode | DataNode | SecondaryNameNode DataNode |
| YARN | NodeManager | ResourceManager NodeManager | NodeManager |
为了合理分配计算机资源,所以将namenode放在hadoop102节点上,将resourcemanager放在hadoop103节点上,secondarynamenode放在hadoop104节点上。
(1)配置集群
-
配置core-site.xml
- 修改之前配置的hdfsnamenode的节点
<!-- 指定HDFS中NameNode的地址 --> <property> <name>fs.defaultFS</name> <value>hdfs://hadoop102:9000</value> </property> <!-- 指定Hadoop运行时产生文件的存储目录 --> <property> <name>hadoop.tmp.dir</name> <value>/opt/module/hadoop-2.7.2/data/tmp</value> </property> -
配置hadoop-env.sh
修改JAVA_HOME
-
配置hdfs-site.xml
- 修改hdfs的副本数为3,添加secondary节点位置。
<property> <name>dfs.replication</name> <value>3</value> </property> <!-- 指定Hadoop辅助名称节点主机配置 --> <property> <name>dfs.namenode.secondary.http-address</name> <value>hadoop104:50090</value> </property> -
配置yarn-env.sh
修改JAVA_HOME
-
配置yarn-site.xml
- reducer获取数据方式为shuffle,修改resourcemanager为hadoop103
<!-- Reducer获取数据的方式 --> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <!-- 指定YARN的ResourceManager的地址 --> <property> <name>yarn.resourcemanager.hostname</name> <value>hadoop103</value> </property> -
配置mapred-env.sh
修改JAVA_HOME
-
配置mapred-site.xml
<!-- 指定MR运行在Yarn上 --> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property>
(2)分发配置文件
在一个节点上配置好文件之后,就可以使用xsync分配脚本,分发配置文件
xsync /opt/module/hadoop-2.7.2/
(3)查看文件分发情况
cat /opt/module/hadoop-2.7.2/etc/hadoop/core-site.xml
企业中不会先配置伪分布式,会直接按照上述配置分布式系统!
(4)启动集群
-
集群的单节点启动,如果首次启动也是需要格式化namenode。
单节点启动:hadoop-daemon.sh start namenode
hadoop-daemon.sh start datenode(各个节点上都需要启动)
yarn-daemon.sh start resourcemanager(在hadoop103上启动)
yarn-daemon.sh start nodemanager(在各个节点上都需要启动)
上述的单节点启动方式太麻烦了!!!
-
集群的群起
-
群起之前还需要配置/opt/module/hadoop…/etc/hadoop/slaves文件
在namenode节点(hadoop102上):start-dfs.sh 开启namenode和所有的datanode和secondarynode
在resourcemanager节点(hadoop103上):start-yarn.sh 开启resourcemanager和所有的nodemanager
-
如果配置好了历史服务器和日志聚集也可以启动单节点启动 mr-jobhistory-daemon.sh -start historyserver
(5)web端查看secondarynamenode
- 192.168.255.104:50090 secondarynamenode节点信息
(6)集群基本测试
- 上传小文件
- 上传大文件
- HDFS的文件会根据设置在各个节点上进行备份,每个文件的默认块的大小是128M,HDFS文件的存放位置在:/opt/module/hadoop-2.7.2/data/tmp/dfs/data/current/BP-938951106-192.168.10.107-1495462844069/current/finalized/subdir0/subdir0这个地方!!
- 对于分成两个块的文件可以使用拼接>>指令进行拼接到一个文件内。拼接后就是原来的大文件。
(7)集群群关
- stop-dfs.sh (namenode节点关闭hdfs进程)
- stop-yarn.sh(resourcemanager节点关闭yarn进程)
(8)集群时间同步
时间同步会在集群中找一台服务器作为时间服务器,其他的节点都会跟他进行时间同步。比如每十分钟同步一次时间。
-
时间同步原理:

-
时间服务器配置(必须root用户)
-
检查ntp是否安装
rpm -qa |grep ntp # 如果没有安装可以使用rpm -i ntp去安装 # 也可以使用yum install ntp去安装 -
修改ntp配置文件
vim /etc/ntp.conf # 在里面修改: 1. restrict 192.168.255.0 mask 255.255.255.0 nomodify notrap # 此网段的所有机器都能从这台机器上查询和同步时间 2.修改。集群在局域网中,不适用其他互联网上的时间。 server 0.centos.pool.ntp.org iburst server 1.centos.pool.ntp.org iburst server 2.centos.pool.ntp.org iburst server 3.centos.pool.ntp.org iburst为 #server 0.centos.pool.ntp.org iburst #server 1.centos.pool.ntp.org iburst #server 2.centos.pool.ntp.org iburst #server 3.centos.pool.ntp.org iburst 3.添加(当该节点丢失网络连接,依然可以采用本地时间作为时间服务器为集群中的其他节点提供时间同步) server 127.127.1.0 fudge 127.127.1.0 stratum 10 -
修改/etc/sysconfig/ntpd文件
增加内容如下(让硬件时间与系统时间一起同步) SYNC_HWCLOCK=yes -
重启ntpd服务
service ntpd status # 查看ntpd服务 chkconfig ntpd --list # 查看ntpd服务开启启动情况 # 开启ntpd服务 service ntpd start # 开启自启ntpd服务 chkconfig ntpd on
-
-
其他机器配置(必须root用户)
-
其他机器每十分钟同步一次时间
crontab -e # 创建定时任务 # 输入定时任务 */10 * * * * /usr/sbin/ntpdate hadoop102 每十分钟 与hadoop102进行同步时间。 -
修改时间和查看时间
# 修改时间 date -s “2018-11-11 11:11:11” # -s修改时间 # 查看时间 date
-
3 Hadoop-Linux操作
当配置好了一台服务器之后,没有必要也没有精力去配置其他机器,完全可以使用一些Linux操作比如scp,rsync,和集群分发脚本xsync去便捷配置环境。
①安全拷贝scp
- scp 语法
- scp -r 文件的路径 目的用户@目的hostname:目的路径
- 案例1:
- 在hadoop101上,将hadoop101中/opt/module目录下的软件拷贝到hadoop102上.
- scp -r /opt/module root@hadoop102:/opt/module
- 需要注意的是:注意查看目的路径文件的所有者!!!
- 拷贝过去之后为了能使hadoop2下的atguigu用户能够使用还要修改文件权限:
- sudo chown -R atguigu:atguigu /opt/module
- 在创建集群的时候,可以安全拷贝配置好的软件,以及环境变量。
②远程同步工具rsync
突然想起,关机时按下的sync将数据保存到磁盘。
- rsync 主要用于备份和镜像,速度快,只对差异文件做更新。scp是全部拷贝过去。
- rsync 语法:
- rsync -rvl 文件路径 目的用户@目的hostname:目的路径
- -r 递归拷贝
- -v 显示拷贝过程
- -l 拷贝符号连接
- 实例1:
- rsync -rvl /opt/software root@hadoop102:/opt/software
③集群分发脚本xsync
思考:如果有1000个节点,上面的复制拷贝也是很麻烦。
-
xsync +要同步的文件名称
-
脚本的实现步骤:
-
在/home/atguigu目录下创建bin目录,并在bin目录下创建xsync文件
-
在文件中编写如下代码:
#!/bin/bash #1 获取输入参数个数,如果没有参数直接退出 pcount=$# if ((pcount==0));then echo no args; exit; fi #2 获取文件名称 p1=$1 fname=basename $p1 echo fname=$fname #3 获取上级目录到绝对路径 pdir='cd -p $(dirname $p1); pwd' echo pdir-$pdir #4 获取当前用户名称 user=`whoami` #5 循环 for((host=103; host<105; host++)); do echo ------------------- hadoop$host -------------- rsync -rvl $pdir/$fname $user@hadoop$host:$pdir done -
修改脚本文件权限
chmod 777 xsync
-
调用脚本形式:xsync 文件名称
xsync /home/atguigu/bin
-
-
如果xsync放到/home/atguigu/bin目录下仍然不能实现全局使用,就放在/usr/local/bin目录下。
④SSH无密登录
设置好ssh无密登录就可以群起集群。
-
ssh基本语法:ssh 另一台电脑的ip
-
无密登录原理

-
服务器的公钥和私钥都放在~/.ssh文件下
-
生成公钥和私钥
ssh-keygen -t rsa
此时看到.ssh文件下面多了两个文件id_rsa(私钥);id_rsa.pub(公钥)
-
将公钥拷贝到要免密登录的机器上
ssh-copy-id hadoop102
ssh-copy-id hadoop103
也需要将公钥拷贝到本机!
-
-
上面是将hadoop102下的atguigu用户的公钥分发给各个节点,还需要将root用户的分发给各个节点;还需要将hadoop103atguigu的公钥分发给各个
| known_hosts | 记录ssh访问过计算机的公钥(public key) |
|---|---|
| id_rsa | 生成的私钥 |
| id_rsa.pub | 生成的公钥 |
| authorized_keys | 存放授权过得无密登录服务器公钥 |
⑤定时任务crontab
# 重启定时任务
service crond restart
# 动态显示定时信息的更新
tail -f banzhang.txt # tail显示底部更新 -f动态显示更新

4 Hadoop编译源码
5 Hadoop琐碎知识总结
①端口号总结:
- HDFS端口号:50070
- yarn端口号:8088
- 历史服务器端口号:19888
- Sercondarynode端口号:50090
②配置文件总结
按照组件去分:
-
Hadoop:(★)
- hadoop-env.sh
- core-site.xml
- fs.defaultFS namonode节点地址
- hadoop.tmp.dir hadoop运行时的产生的临时文件存储目录
-
HDFS(★)
-
hdfs-site.xml
- dfs.replication HDFS的副本数,默认为3
- dfs.namenode.secondary.http-address辅助名称节点主机配置
-
YARN(★)
- yarn-env.sh
- yarn-site.xml
- yarn.nodemanager获取数据方式
- yarn.resourcemanager地址
-
MapReduce(★)
- mapred-env.sh
- mapred-site.xml
- mapreduce.framework.name指定MR运行在YARN上
-
历史服务器
- mapred-site.xml
- mapreduce.jobhistory.address历史服务器地址
- mapreduce.jobhistory.webapp.address历史服务器web端地址
- mapred-site.xml
-
日志聚集
- yarn-site.xml
- yarn.log-aggregation-enable日志聚集功能开启
- yarn.log-aggregation.retain-seconds日志保留时间设置为7天
- yarn-site.xml
注意只要是***-env.sh都是修改JAVA_HOME
③一些错误信息
- 注意1:历史服务器不随yarn群起,要单独启动historyserver
- 注意2:历史服务器需要配置resourcemanager节点,也在其节点启动。
本文详细介绍了如何在Linux环境下搭建和管理Hadoop集群,包括虚拟机配置、JDK与Hadoop的安装、环境变量配置、Hadoop运行模式(本地、伪分布式、完全分布式)、YARN设置、历史服务器配置、日志聚集功能以及SSH无密登录。此外,还提到了常用Linux操作如scp、rsync和xsync,以及Hadoop相关配置文件和端口的总结。

被折叠的 条评论
为什么被折叠?



