安装与使用说明
本说明基于 VWware Workstation 15 下的 CentOS 7 系统进行操作,所下载的hadoop 、 hbase 、 spark 、hive 版本分别为 hadoop-3.1.3.tar.gz 、 hbase-2.2.3-bin.tar.gz 、 spark-2.4.5-bin-without-hadoop.tgz 、 apache-hive-3.1.2-bin.tar.gz
一、 Hadoop 3.1.3 分布式安装与使用说明
1. Master 节点:创建用户与SSH,Java 安装配置
1.1 创建用户
创建了可以登陆的 hadoop 用户,并使用 /bin/bash 作为 shell ,并给用户设置密码及增加管理员权限。
su # 以 root 用户登录 useradd -m hadoop -s /bin/bash # 创建新用户hadoop passwd hadoop # 设置密码
执行 visudo 命令,于 root ALL=(ALL) ALL 内容下新增
hadoop ALL=(ALL) ALL
1.2 安装SSH
rpm -qa | grep ssh # 检验 SSH client 、 SSH server 是否已安装 sudo yum install openssh-clients # 安装 SSH client sudo yum install openssh-server # 安装 SSH server
1.3 安装java
yum 安装JDK
sudo yum install java-1.8.0-openjdk java-1.8.0-openjdk-devel # yum 安装 JDK rpm -ql java-1.8.0-openjdk-devel | grep \'/bin/javac\' # 确定刚安装的 yum 安装的路径
确定已有的 java 的版本及路径
java -version # java 的版本 which java # 定位 java 的执行路径 ls -lrt /usr/bin/java # 列出 java 执行路径的具体信息,一般这里都会链接到其他位置
配置java环境变量,可以考虑开发版本或者默认的版本
vim ~/.bashrc export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk # 于文件最后添加 source ~/.bashrc # 使变量设置生效
检验 java 环境变量
echo $JAVA_HOME # 检验变量值 java -version $JAVA_HOME/bin/java -version # 与直接执行 java -version 一样
2. Slave 节点:创建用户与SSH,Java 安装配置
参考Master节点,在其他 Slave 节点上配置 hadoop 用户、安装 SSH server、安装 Java 环境。
3. 网络配置与 SSH 联通
3.1 虚拟机静态IP配置
确定 NAT 模式下的网关:VWware Workstation 工具栏 -> 编辑 -> 虚拟网络编辑器
在终端中输入命令: cd /etc/sysconfig/network-scripts
在该目录下编辑 ifcfg-ens33 文件,如下图红色区域,要求NETMASK,GATEWAY 与虚拟机的子网掩码和网关IP一致。
退出并保存该文件,重启网络服务:service network restart 。通过是否能够ping 通外网以及集群各机器IP,检查是否成功配置。
参考资料:VMware 安装centos7 采用NAT方式如何设置固定IP
https://blog.csdn.net/LUCKWXF/article/details/103949205
3.2 修改主机名以便识别
hostnamectl # 查看当前主机名命令 hostnamectl status # 查看当前主机名命令 hostname temp01 # 临时修改主机名 hostnamectl set-hostname perm01 # 永久修改主机名
修改主机名之后, /etc/hostname 一般会被自动更新,另外还需要手动更新 /etc/hosts 再重启Linux 。在集群配置中,一般把集群节点的主机名与IP地址映射关系配置到 /etc/hosts 。个人配置如下图:
在完成集群各个机器的主机名修改之后,可以通过 ping 命令测试,以便后续的配置。
ping master –c 3 ping slave01 –c 3 ping slave02 –c 3
参考资料:CentOS7修改主机名的三种方法
https://blog.csdn.net/xuheng8600/article/details/79983927
3.3 SSH无密码登陆节点
通过SSH配置,使得master节点可以无密码SSH登陆到各个Slave节点上。于master节点上生成公钥
cd ~/.ssh # 如果没有该目录,先执行一次ssh localhost rm ./id_rsa* # 删除之前生成的公匙(如果有) ssh-keygen -t rsa # 一直按回车完成 cat ./id_rsa.pub >> ./authorized_keys # 将公钥追加到授权 ssh master # SSH登录验证,exit可返回原来终端
将Master节点上的公钥传输到各个Slave节点,并加入授权。以Slave01为例,代码如下:
scp ~/.ssh/id_rsa.pub hadoop@Slave01:/home/hadoop/ mkdir ~/.ssh # 登录到Slave01机器上,创建文件夹(如不存在该文件夹) cat ~/id_rsa.pub >> ~/.ssh/authorized_keys ssh slave01 # 切换回Master机器上,验证能否成功SSH登录Slave01
参考资料1:SSH免密码登录Permission denied (publickey,gssapi-keyex,gssapi-with-mic) 的解决方案
https://www.cnblogs.com/xubing-613/p/6844564.html
参考资料2:CentOS7.4配置SSH登录密码与密钥身份验证踩坑
https://www.cnblogs.com/Leroscox/p/9627809.html
4. 配置集群/分布式环境
4.1 hadoop 解压、授权与环境变量配置
sudo tar -zxf ~/Downloads/hadoop-3.1.3.tar.gz -C /usr/local # 解压到/usr/local中
cd /usr/local/
sudo mv ./hadoop-3.1.3/ ./hadoop # 将文件夹名改为hadoop,也可以考虑软链目录 ln -s hadoop-3.1.3/ hadoop
sudo chown -R hadoop:hadoop ./hadoop # 修改文件权限
配置环境变量
gedit ~/.bashrc
# 使用 gedit 文本编辑器配置 hadoop,在文本编辑器中输入新增如下内容
# Hadoop Environment Variables
export HADOOP_HOME=/usr/local/hadoop
export HADOOP_INSTALL=$HADOOP_HOME
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 PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin
source ~/.bashrc # 使变量设置生效
集群/分布式模式需要修改 /usr/local/hadoop/etc/hadoop 中的配置文件。hadoop 3.1.3正常启动所必须的设置项包括:workers、core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml。其中workers 在hadoop 2.6.0 版本中为slaves 。
workers 中写入作为DataNode的主机名,每行一个。可以自行选择是否保留localhost作为DataNode使用。
core-site.xml 修改为:
<configuration> <property> <name>fs.defaultFS</name> <value>hdfs://Master:9000</value> </property> <property> <name>hadoop.tmp.dir</name> <value>file:/usr/local/hadoop/tmp</value> <description>Abase for other temporary directories.</description> </property> </configuration>
hdfs-site.xml 修改为如下配置。dfs.replication 一般设为 3,因实际节点只有两个Slave节点,所以如下设置。
<configuration> <property> <name>dfs.namenode.secondary.http-address</name> <value>Master:50090</value> </property> <property> <name>dfs.replication</name> <value>2</value> </property> <property> <name>dfs.namenode.name.dir</name> <value>file:/usr/local/hadoop/tmp/dfs/name</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>file:/usr/local/hadoop/tmp/dfs/data</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> </configuration>
yarn-site.xml 修改为:
<configuration> <property> <name>yarn.resourcemanager.hostname</name> <value>Master</value> </property> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> </configuration>
4.2 节点文件移植
在Master节点上删除之前的临时文件、日志文件(如果有),再将文件压缩复制传输到其他节点。
cd /usr/local sudo rm -r ./hadoop/tmp # 删除 Hadoop 临时文件 sudo rm -r ./hadoop/logs/* # 删除日志文件 tar -zcf ~/hadoop.master.tar.gz ./hadoop # 先压缩再复制 cd ~ scp ./hadoop.master.tar.gz Slave01:/home/Hadoop
以Slave01节点为例,进行文件的解压缩与授权
sudo rm -r /usr/local/hadoop # 删掉旧的(如果存在) sudo tar -zxf ~/hadoop.master.tar.gz -C /usr/local sudo chown -R hadoop /usr/local/hadoop
于Master节点上执行NameNode的格式化
hdfs namenode -format # 首次运行需要执行初始化,之后不需要
5. Hadoop 分布式启动与实例运行
5.1 关闭防火墙
在各节点机器上关闭防火墙,避免集群内通信不成功。
systemctl stop firewalld.service # 关闭firewall
systemctl disable firewalld.service # 禁止firewall开机启动
systemctl status firewalld # 查看防火墙状态
5.2 Hadoop启动与检查
于Master节点上启动hadoop,yarn,historyserver 。
start-dfs.sh start-yarn.sh mapred --daemon start historyserver
启动后,Master节点进程情况如下:
启动后,各Slave节点进程情况如下:
以上各节点进行,缺少任一进程都表示出错。另外还需要在 Master 节点上通过命令 hdfs dfsadmin -report 查看 DataNode 是否正常启动,如果 Live datanodes 不为 0 ,则说明集群启动成功。
另外,也可以通过 Web 页面看到查看 DataNode 和 NameNode 的状态:http://master:9870/。如果不成功,可以通过启动日志排查原因。
相应地,关闭hadoop集群的命令如下:
stop-yarn.sh stop-dfs.sh mapred --daemon stop historyserver
报错:WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
解决方案:于配置文件 /etc/profile 中新增如下环境变量,并使之生效;同时于 $HADOOP_HOME/etc/hadoop/hadoop-env.sh文件中同样新增该环境变量。
export HADOOP_HOME=/usr/local/hadoop export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib:$HADOOP_COMMON_LIB_NATIVE_DIR"
参考资料:Hadoop_疑难杂症 解决1 - WARN util.NativeCodeLoader: Unable to load native-hadoop library for your plat
https://blog.csdn.net/u010003835/article/details/81127984
5.3 Hadoop 实例运行与监测
hdfs dfs -mkdir -p /user/hadoop # 创建hadoop用户目录 hdfs dfs -mkdir input hdfs dfs -put /usr/local/hadoop/etc/hadoop/*.xml input # 复制输入文件 hadoop jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar grep input output \'dfs[a-z.]+\' # 运行 MapReduce 作业
报错:[pid=11486,containerID=container_1590592556465_0002_01_000002] is running 464517632B beyond the \'VIRTUAL\' memory limit. Current usage: 78.4 MB of 1 GB physical memory used; 2.5 GB of 2.1 GB virtual memory used. Killing container.
解决方案:hadoop运行时使用的虚拟内存不足, hadoop物理内存默认与主机的内存一致,hadoop虚拟内存默认是hadoop物理内存的2.1倍。于master节点的 $HADOOP_HOME/etc/hadoop/mapred-site.xml文件中新增/修改如下配置,修改hadoop的物理内存大小:
<property> <name>mapreduce.map.memory.mb</name> <value>2048</value> </property> <property> <name>mapreduce.reduce.memory.mb</name> <value>2048</value> </property>
参考资料:running beyond virtual/physical memory limits问题解决
https://blog.csdn.net/jp413670706/article/details/77602540
报错:Error: Could not find or load main class org.apache.hadoop.mapreduce.v2.app.MRAppMaster
解决方案:于master节点下修改配置文件 $HADOOP_HOME/etc/Hadoop/mapred-site.xml,添加如下内容:
<property> <name>yarn.app.mapreduce.am.env</name> <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value> </property> <property> <name>mapreduce.map.env</name> <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value> </property> <property> <name>mapreduce.reduce.env</name> <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value> </property>
参考资料:Hadoop之——hadoop 3.x Could not find or load main class org.apache.hadoop.mapreduce.v2.app.MRAppMaster