最近学大数据导论课程,要求学学hadoop,本教程主要讲述如何配置 Hadoop 集群(这里用的 Hadoop3.1.3),由于我也是自己捣鼓的,很多问题其实是没有解决的,该教程只是为了提供方案与参考,尚有不足可提出。
目录
1.1 准备
由于资源限制,这里简单使用了两个节点(两台服务器)来搭建集群环境,一台服务器作为 Master 节点,运行内容:
[root@Master ~]# jps
81634 Jps
6377 NameNode
6985 ResourceManager
6718 SecondaryNameNode
一台服务器作为 Slave 节点,运行内容:
[root@Slave ~]# jps
2176 DataNode
207243 Jps
2349 NodeManager
1.2 简介步骤
-
- 选定一台服务器作为 Master 节点,其他作为 Slave 节点;
-
- 所有节点需安装 SSH 服务端、JAVA环境;
-
- Master 节点配置安装 Hadoop;
-
- 将 Master 节点的 Hadoop 目录拷贝到其他 Slave 节点;
-
- Master 节点开启 Hadoop
-
- 命令测试
1.3 环境配置
2.1 安装 Haoop 前奏
-
用户
对于 hadoop 操作需要确定一个操作用户,拥有与 root 相当的权限,不然后面会出现很多权限问题(对,我没解决这些问题,嫌麻烦,所以这里用的是 root 用户直接操作,当然其实不推荐这样的,因为风险很多,但是我只是用于初入课程操作,所以就简略如此了)
当然这里提供创建用户方法:
创建新用户 并设置密码sudo useradd -m username -s /bin/bash sudo passwd username
给用户 root 权限 ( 没写 )(放 sudo 用户组里 或者 直接授予权限)
-
安装 SSH、配置SSH无密码登陆
Hadoop 集群运行需要用到 SSH 登陆,(Master 节点 运行 Hadoop 时会远程登陆 Slave 节点),一般服务器都默认安装了 SSH server,所以这里就不介绍如何安装SSH,自行百度。由于SSH登陆每次都需要输入密码,所以我们用 ssh密钥 来设置无密码登陆,详情见 SSH 原理与运用。
参考命令
ssh-copy-id username@host /dirname
2.2 安装 Hadoop3.1.3
2.2.1 下载解压
Hadoop 安装文件可以在 [Hadoop官网](http://hadoop.apache.org/)下载 hadoop-3.1.3.tar.gz,也可以看镜像站,我用的[北京信息学院](http://mirror.bit.edu.cn/apache/hadoop/common/)。
下载到本地后,我安装到了 /opt 中:
```shell
sudo tar -zxf ~/Downloads/hadoop-3.1.3.tar.gz -C /opt # 解压
cd /opt
sudo mv ./hadoop-3.1.3/ ./hadoop # 修改文件夹名
sudo chown -R hadoop ./hadoop # 修改文件权限
```
检查是否可用:
```shell
cd /opt/hadoop
./bin/hadoop version
```
2.2.2 配置环境
PATH 环境变量
sudo vi /etc/profile
# 结尾添加 Hadoopp 环境变量,我就把啥都加上来了,有赘余别骂
export HADOOP_HOME=/opt/hadoop
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export YARN_HOME=$HADOOP_HOME
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib"
export JAVA_LIBRARY_PATH=$HADOOP_HOME/lib/native:$JAVA_LIBRARY_PATH
为方便起见这里将服务器ip什么的就给了个名字。
sudo vi /etc/hosts
XX.XX.XX.XX Master
XX.XX.XX.XX Slave
然后就是对hadoop目录下的配置文件进行填写了,文件目录在 /opt/hadoop/etc/hadoop
hadoop-env.sh 直接在开头加载 PATH 就好。
. /etc/profile
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 ..............
core-site.xml
这里数据存储是放在 /data 目录下,里面有 tmp,name,datanode 三个文件夹,自行创建。放默认目录的话,出现了一些临时文件不存在的问题,所以如此做。
<configuration>
<!-- Master addr -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://Master:9000</value>
</property>
<!-- temporary directories -->
<property>
<name>hadoop.tmp.dir</name>
<value>file:/data/tmp</value>
</property>
</configuration>
hdfs-site.xml
<configuration>
<!-- hdfs namenode http connection -->
<property>
<name>dfs.namenode.http-address</name>
<value>Master:50070</value>
</property>
<!-- hdfs secondarynamenode http connection -->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>Master:50090</value>
</property>
<!-- hdfs 副本数量 -->
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<!-- namenode 存放路径 -->
<property>
<name>dfs.namenode.name.dir</name>
<value>/data/name</value>
</property>
<!-- datanode 存放路径 -->
<property>
<name>dfs.datanode.data.dir</name>
<value>/data/datanode</value>
</property>
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
</configuration>
mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>Master:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>Master:19888</value>
</property>
<property>
<name>yarn.app.mapreduce.am.env</name>
<value>HADOOP_MAPRED_HOME=/opt/hadoop</value>
</property>
<property>
<name>mapreduce.map.env</name>
<value>HADOOP_MAPRED_HOME=/opt/hadoop</value>
</property>
<property>
<name>mapreduce.reduce.env</name>
<value>HADOOP_MAPRED_HOME=/opt/hadoop</value>
</property>
<property>
<name>mapreduce.application.classpath</name>
<value>
/opt/hadoop/etc/hadoop,
/opt/hadoop/share/hadoop/common/*,
/opt/hadoop/share/hadoop/common/lib/*,
/opt/hadoop/share/hadoop/hdfs/*,
/opt/hadoop/share/hadoop/hdfs/lib/*,
/opt/hadoop/share/hadoop/mapreduce/*,
/opt/hadoop/share/hadoop/mapreduce/lib/*,
/opt/hadoop/share/hadoop/yarn/*,
/opt/hadoop/share/hadoop/yarn/lib/*
</value>
</property>
</configuration>
(写到这里发现自己 jobhistory 还没开)
yarn-site.xml
<configuration>
<!-- Site specific YARN configuration properties -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>Master</value>
</property>
<property>
<description>The http address of the RM web application.</description>
<name>yarn.resourcemanager.webapp.address</name>
<value>${yarn.resourcemanager.hostname}:8088</value>
</property>
<property>
<description>The address of the applications manager interface in the RM.</description>
<name>yarn.resourcemanager.address</name>
<value>${yarn.resourcemanager.hostname}:8032</value>
</property>
<property>
<description>The address of the scheduler interface.</description>
<name>yarn.resourcemanager.scheduler.address</name>
<value>${yarn.resourcemanager.hostname}:8030</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>${yarn.resourcemanager.hostname}:8031</value>
</property>
<property>
<description>The address of the RM admin interface.</description>
<name>yarn.resourcemanager.admin.address</name>
<value>${yarn.resourcemanager.hostname}:8033</value>
</property>
</configuration>
start-dfs.sh stop-dfs.sh 脚本里加个修改下用户(我用的root)
function hadoop_usage
{
echo "Usage: start-dfs.sh [-upgrade|-rollback] [-clusterId]"
}
HDFS_DATANODE_USER=root
HDFS_DATANODE_SECURE_USER=hdfs
HDFS_NAMENODE_USER=root
HDFS_SECONDARYNAMENODE_USER=root
start-yarn.sh stop-yarn.sh 脚本里加个修改下用户(我用的root)
function hadoop_usage
{
echo "Usage: start-dfs.sh [-upgrade|-rollback] [-clusterId]"
}
YARN_RESOURCEMANAGER_USER=root
HDFS_DATANODE_SECURE_USER=yarn
YARN_NODEMANAGER_USER=root
HADOOP_SECURE_DN_USER 已经被HDFS_DATANODE_SECURE_USER替代了
2.2.3 文件拷贝
Slave 节点其实就是用到 Master 的hadoop 文件副本就行了。这里传输就打个包再传。
cd /opt
sudo tar -zcf ./hadoop.tar.gz ./hadoop
sudo scp /opt/hadoop.tar.gz Slave:/opt/hadoop.tar.gz
然后 Slave 端解压
cd /opt
sudo tar -zxf ./hadoop.tar.gz ./
这些都有个权限的问题,如果用户不是root的话, 需要用到 sudo,另外需要用 chown 命令对 hadoop 文件夹赋予权限。
sudo chown -R username ./hadoop
2.3 Hadoop 运行
2.3.1 格式化操作
首次启动 hadoop 集群,需要对名称节点进行格式化(只有首次启动才格式化,多次格式化会引起 namenode 与 datanode 的 clusterID 不符,报错)
hdfs namenode -format
或者在 /hadoop/sbin 里面执行 hdfs
2.3.2 运行hadoop
start-all.sh
对然后可能就会报很多错,自己排查。
另外 jps 命令可以查看已经运行的 hadoop 进程。
还有 hdfs dfsadmin -report 可以查看报错。
还有 tail -200 /hadoop/logs/hadoop-username-xxxx-Master.log 可以看看日志最后 200 行,一般会有对应的错误信息。
2.3.3 这里讲讲我遇到的错误:
-
- 由于是服务器的原因,其实本质也是服务运营商那里的云虚拟机,所以在 Master 节点的 Hosts 中的 Master ip用服务器的内网地址,不然是连不通的。(fail to connect)
-
- 服务器需要开放对应的端口号,具体哪些去配置文件里看,这里不说明。
-
- 服务器防火墙需要关闭,或者对那些开放端口关闭,不然Slave不能连通Master,这个时候进程其实都开了的,但是你去看Slave日志它会一直报 connection fail 的错。
-
- 之前有报错说找不到native的库,我已经在 env 文件里加上了库路径。
-
- 其实配置的时候只要多看 /hadoop/log 下的日志就好了,基本上看了都能解决问题。