前言
官网:https://hadoop.apache.org/releases.html
本文环境软件版本
名称 | 版本 |
---|---|
JDK | 1.8.0_221 |
Hadoop | 2.7.7 |
注意
一定要保证开发环境和部署的环境保持一致!否则运行时会报各种错误。
基础环境配置
https://www.psvmc.cn/article/2022-03-31-bigdata-environment.html
下载解压
https://archive.apache.org/dist/hadoop/common/hadoop-2.7.7/
服务器中运行
1 | wget https://archive.apache.org/dist/hadoop/common/hadoop-2.7.7/hadoop-2.7.7.tar.gz |
或者使用百度云下载
链接:https://pan.baidu.com/s/1OPzD9V_mBnBz06JQ3X5DSA
提取码:psvm
解压
1 | tar -zxvf hadoop-2.7.7.tar.gz |
配置环境变量
1 | cd /etc/profile.d/ |
创建配置文件
1 | vi /etc/profile.d/hadoop.sh |
内容设置为
1 | #HADOOP_HOME |
配置生效
1 | source /etc/profile |
查看是否生效
1 | echo $HADOOP_HOME |
伪分布式部署
添加文件夹
1 | ssh hadoop01 "mkdir -p /data/tools/bigdata/zdata/hadoop/tmp" |
其他服务器上创建文件夹
1 | ssh hadoop02 "mkdir -p /data/tools/bigdata/zdata/hadoop/tmp" |
修改配置文件
注意
本文是伪分布式部署
进入配置文件目录
1 | cd /data/tools/bigdata/hadoop-2.7.7/etc/hadoop |
hadoop-env.sh
将原本的JAVA_HOME 替换为绝对路径就可以了
1 | #export JAVA_HOME=${JAVA_HOME} |
注意
虽然系统已经设置
JAVA_HOME
,但是运行时依旧无法找到,所以配置的绝对路径一定要配置,否则会产生运行正常,但是远程连接服务器的时候报
Error:JAVA_HOME is not set and could not be found
core-site.xml
1 |
|
hdfs-site.xml
1 |
|
mapred-site.xml
1 |
|
yarn-site.xml
1 |
|
log4j.properties
剔除警告(可选)
添加
1 | log4j.logger.org.apache.hadoop.util.NativeCodeLoader=ERROR |
启动/停止
1 | sudo chmod -R 755 $HADOOP_HOME |
这个操作主要是创建fsimage和edits文件。
只要看到信息中有一句关键:
INFO common.Storage: Storage directory /data/tools/bigdata/hadoop-2.7.7/tmp/dfs/name has been successfully formatted.
则格式化成功.
运行
1 | sh $HADOOP_HOME/sbin/start-all.sh |
输入
1 | jps |
如图
访问
我的服务器的IP为 192.168.7.101
HDFS监控页面查询:
查看文件可以访问这个地址
http://192.168.7.101:50070/explorer.html#/
Yarn监控页面查询:
http://192.168.7.101:8088/cluster
停止
1 | sh $HADOOP_HOME/sbin/stop-all.sh |
端口说明:
端口 | 作用 |
---|---|
8088 | cluster and all applications |
50070 | Hadoop NameNode |
50090 | Secondary NameNode |
50075 | DataNode |
停止所有服务
1 | sh $HADOOP_HOME/sbin/stop-all.sh |
测试
1 | mkdir -p /data/hadooptest/input |
随便添加一些文本
1 | 1111 |
复制文件到hadoop中
1 | hadoop fs -mkdir /data/ |
测试
1 | cd /data/tools/bigdata/hadoop-2.7.7 |
结果
它就把统计给生成了
注册为服务
添加服务
1 | cd /etc/init.d |
内容如下:
1 |
|
注意
路径要使用完整路径,不能使用类似于
$HADOOP_HOME/sbin/stop-all.sh
的路径。
赋予权限
1 | sudo chmod +x hadoop |
设置开机启动
1 | sudo chkconfig --add hadoop |
启动服务
1 | service hadoop start |
查看hadoop服务
1 | chkconfig --list hadoop |
HA部署
添加文件夹
1 | ha-call.sh "mkdir -p /data/tools/bigdata/zdata/hadoop/tmp" |
修改配置文件
进入配置文件目录
1 | cd $HADOOP_HOME/etc/hadoop |
core-site.xml
1 |
|
hdfs-site.xml
1 |
|
注意
2.7.7版本最多支持2个NameNode
mapred-site.xml
mapred-site.xml.template 重命名为 mapred-site.xml
1 |
|
yarn-site.xml
1 |
|
capacity-scheduler.xml
1 | <configuration> |
slaves
1 | hadoop01 |
log4j.properties
剔除警告(可选):
添加
1 | log4j.logger.org.apache.hadoop.util.NativeCodeLoader=ERROR |
删除日志
刚开始部署时每次启动前我们可以删除之前的日志文件,方便排查问题。
1 | ha-call.sh "rm -rf $HADOOP_HOME/logs/*" |
配置分发
1 | ha-fenfa.sh $HADOOP_HOME |
初始前删除之前的文件
只有初始化集群的时候执行一次,以后不再执行。
创建脚本
1 | vi /data/tools/bigdata/mysh/ha-hadoop-init.sh |
内容如下:
1 |
|
赋权限
1 | chmod +x /data/tools/bigdata/mysh/ha-hadoop-init.sh |
执行
1 | bash /data/tools/bigdata/mysh/ha-hadoop-init.sh |
如果运行报错
未预期的符号 `$’{\r’’ 附近有语法错误
考虑到代码是从windows下复制过来的,脚本可能在格式上存在问题
解决方案:
方法1:
文本编辑器打开设置换行编码为Unix。
方法2:
1 | sudo yum install dos2unix |
初始化集群
只用执行一次,以后启动不用再执行。
(1). 启动3个Zookeeper
要保证ZK为启动状态
1 | ha-call.sh "zkServer.sh start" |
(2). 启动3个JournalNode
JournalNode的作用:NameNode之间共享数据
1 | ha-call.sh "hadoop-daemon.sh start journalnode" |
(3). 格式化NameNode
格式化前删除之前的文件
仅hadoop01
1 | sudo chmod -R 755 /data/tools/bigdata/zdata/hadoop |
这个操作主要是创建fsimage和edits文件。
只要看到信息中有一句关键:
INFO common.Storage: Storage directory /data/tools/bigdata/zdata/dfs/name has been successfully formatted.
则格式化成功.
(4). 复制hadoop01上的NameNode的元数据到hadoop02
1 | scp -r /data/tools/bigdata/zdata/hadoop/dfs/namenode_data/current/ root@hadoop02:/data/tools/bigdata/zdata/hadoop/dfs/namenode_data/ |
(5). 在NameNode节点(hadoop01或hadoop02)格式化zkfc
1 | ssh hadoop01 "hdfs zkfc -formatZK" |
(6). 停止3个JournalNode
JournalNode的作用:NameNode之间共享数据
1 | ha-call.sh "hadoop-daemon.sh stop journalnode" |
启动集群
(1). 在hadoop01上启动HDFS相关服务
1 | ssh hadoop01 "start-dfs.sh" |
对应日志
1 | Starting namenodes on [hadoop01 hadoop02] |
(2). 在hadoop01上启动YARN相关服务
1 | ssh hadoop01 "start-yarn.sh" |
在启动YARN时,通常可以直接使用start-yarn.sh
脚本来启动资源管理器(ResourceManager)和节点管理器(NodeManager),而不再需要单独调用yarn-daemon.sh
来启动ResourceManager。
start-yarn.sh
脚本会自动启动ResourceManager和NodeManager进程,以及其他与YARN相关的组件。
它会在后台运行这些进程,并根据配置文件中的设置来分配资源和管理任务。
(3). 最后单独启动hadoop01的历史任务服务器
1 | ssh hadoop01 "mr-jobhistory-daemon.sh start historyserver" |
这个历史任务服务器,可以查看已执行的MapReduce任务。
执行MapReduce任务本身不会受到影响,它们仍然可以在YARN集群上正常运行和完成,可以不启动。
或者
用自定义脚本
1 | ha-hadoop.sh start |
我们可以在ZK中看到 我们定义的键都在第二级,第一级是框架定义的。
查看集群
查看
1 | ha-call.sh jps |
结果
1 | --------hadoop01-------- |
【查看NameNode的状态】
1 | hdfs haadmin -getServiceState nn1 |
可以看到一个是active
一个是standby
【查看ResourceManager的状态】
1 | yarn rmadmin -getServiceState rm1 |
可以看到一个是active
一个是standby
访问
我的服务器的IP为 192.168.7.101
HDFS监控页面查询:
查看文件可以访问这个地址
http://192.168.7.101:50070/explorer.html#/
http://192.168.7.102:50070/explorer.html#/
Yarn监控页面查询:
http://192.168.7.102:8088/cluster
http://192.168.7.103:8088/cluster
任务历史
服务无法停止
原因是记录Hadoop启动的PID被修改
我们只能手动停止
1 | jps -l |
为了避免这个问题,可以把PID存放在其他地方
在配置文件中$HADOOP_HOME/conf/hadoop-env.sh
中添加如下
1 | export HADOOP_PID_DIR=/data/tools/bigdata/zdata/hadoop/pids |