说明
记录大数据疫情可视化平台项目的基础环境搭建:虚拟机搭建Hadoop3.2.1环境。环境说明
- 虚拟机配置CentOS 7.6一台
- Hadoop3.2.1的安装tar包
- JDK11的安装tar包(使用yum安装也可,提前需要配置虚拟机的桥接模式连上网络,这里使用JDK11就先埋下了一个坑,后续进行到Hive安装的时候不得不降为JDK8!!!)
目录
- 环境搭建步骤
- sprigboot整合hdfs
- JDK11报错解决
步骤记录
一、环境搭建步骤1、安装基础服务版CentOS7
2、使用root用户做以下操作:
1、关闭防护墙并修改成开机不启动
systemctl stop firewalld
systemctl disable firewalld
2、修改主机名为hadoop101
hostnamectl set-hostname hadoop101
3、修改ip地址 设置网关等操作
vim /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="static" **************
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens33"
UUID="8125b2f3-1e37-4b5d-8027-0e9776c61af3" 删除UUID ********
DEVICE="ens33"
ONBOOT="yes" *************
IPADDR=192.168.1.101 *********
GATEWAY=192.168.1.2 **********
PREFIX=24 ********************
DNS1=192.168.1.2 ********
4、配置hosts文件 添加ip地址和主机名的映射
vim /etc/hosts
添加
192.168.1.101 hadoop101
192.168.1.102 hadoop102
192.168.1.103 hadoop103
3、同样也要配置windows系统的hosts文件
C:WindowsSystem32driversetchosts
192.168.24.101 hadoop101
192.168.24.102 hadoop102
192.168.24.103 hadoop103
4、重启网络服务
systemctl restart network(reboot)
6、安装JDK
1)查看是否已安装jdk,如已安装请卸载
rpm -qa | grep java
rpm -e --nodeps 查到java软件包 或使用 yum -y remove *java*
2)准备工作
visudo
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
## Allows members of the 'sys' group to run networking, software,
## service management apps and more.
# %sys ALL = NETWORKING, SOFTWARE, SERVICES, STORAGE, DELEGATING, PROCESSES, LOCATE, DRIVERS
## Allows people in group wheel to run all commands
%wheel ALL=(ALL) ALL
%offcn ALL=(ALL) NOPASSWD:ALL
3) 在 /home/offcn下创建目录 ,存放用户需要安装的软件以及日志
mkdir bin app data logs software
4)上传jdk1.8安装包到 software目录中(注意!!!,不要使用JDK11版本,Hadoop3.2.1暂时不支持JDK11,后面会有很多问题,我坚持了一段时间,后来到hive就不行了,又安装的JDK8)
1)解压到 apps目录 tar -zxvf jdk-8u144-linux-x64.tar.gz -C /home/offcn/apps
2)配置jdk环境变量
a)先获取jdk路径:
[offcn@hadoop101 jdk1.8.0_144]$ pwd
/home/offcn/app/jdk1.8.0_144
b)编辑内容/etc/profile
[offcn@hadoop101 software]$ sudo vim /etc/profile
#JAVA_HOME
export JAVA_HOME=/home/offcn/apps/jdk1.8.0_144
export PATH=$PATH:$JAVA_HOME/bin
c)保存后退出:
:wq
d)让修改后的文件生效:
[offcn@hadoop101 jdk1.8.0_144]$ source /etc/profile
5)测试jdk是否安装成功
[offcn@hadoop101 jdk1.8.0_144]# java -version
java version "1.8.0_144"
6、Xshell、Xftp连接虚拟机上参考:https://blog.csdn.net/qing3154/article/details/104883345
7、克隆虚拟机 ,整出来Hadoop102、Hadoop103,然后 修改主机名和ip地址
8、配置免密登录(三台机器使用联合操作,root用户配置一次)
1)生成公钥和私钥 ssh-keygen 4个回车 会生成在/homt/offcn/.ssh目录中
2)分别向3台机器发送公钥(注意,向自己也要发)
ssh-copy-id hadoop101
ssh-copy-id hadoop102
ssh-copy-id hadoop103
# 免密登录配置完成
9、配置集群时间同步策略(也就是三台虚拟机需要保证一致的时间,此步为搭建集群分布式的必须!!)时间同步的方式:在集群中找一台机器,作为时间服务器,集群中其他机器与这台机器定时的同步时间,比如,每隔十分钟,同步一次时间。
# 配置时间同步实操:三台机器同时执行,使用Xshell三台同时执行命令 (1)时间服务器配置(必须root用户) a) 检查ntp是否安装,若没有安装则使用yum install -y ntp进行安装 [offcn@hadoop101 ~]$ rpm -qa|grep ntp ntpdate-4.2.6p5-28.el7.centos.x86_64 python-ntplib-0.3.2-1.el7.noarch fontpackages-filesystem-1.44-8.el7.noarch ntp-4.2.6p5-28.el7.centos.x86_64 b) 修改ntp配置文件 [offcn@hadoop101 ~]$ sudo vim /etc/ntp.conf # 修改内容如下 i. 修改1(授权192.168.1.0网段上的所有机器可以从这台机器上查询和同步时间),注意要将网段和掩码改成自己本地的 restrict 192.168.24.10 101 mask 255.255.255.0 nomodify notrap ii. 修改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 iii.添加3(当该节点丢失网络连接,依然可以作为时间服务器为集群中的其他节点提供时间同步) server 127.127.1.0 fudge 127.127.1.0 stratum 10 c) 修改/etc/sysconfig/ntpd 文件 [offcn@hadoop101 ~]$ sudo vim /etc/sysconfig/ntpd。增加内容如下(让硬件时间与系统时间一起同步):SYNC_HWCLOCK=yes d) 重新启动ntpd [offcn@hadoop101 ~]$ systemctl status ntpd … Stopped Network Time Service. … [offcn@hadoop101 ~]$ sudo systemctl start ntpd e) 执行设置Hadoop101开机自启: [offcn@hadoop101 ~]$ sudo systemctl enable ntpd # 单独的机器Hadoop101执行 f) 编写脚本 10s同步一次 [offcn@hadoop101 ~]$ crontab -e 在文件中添加:*/1 * * * * sudo /usr/sbin/ntpdate ntp.aliyun.com # 单独的机器执行 (2) 将其它机器的ntp服务停掉并关闭开机启动 [offcn@hadoop102 ~]$ sudo systemctl stop ntpd [offcn@hadoop102 ~]$ sudo systemctl disable ntpd a) 在其他机器配置1分钟与时间服务器同步一次 [offcn@hadoop102 ~]$ crontab -e #编写脚本 */1 * * * * sudo /usr/sbin/ntpdate hadoop101 b) 修改任意机器时间 [offcn@hadoop102 ~]$ sudo date -s "2017-9-11 11:11:11" c) 十分钟后查看机器是否与时间服务器同步 [offcn@hadoop102 ~]$ date
# 举栗效果演示 [root@hadoop102 ~]# systemctl stop ntpd [root@hadoop102 ~]# systemctl disable ntpd [root@hadoop102 ~]# crontab -e no crontab for root - using an empty one crontab: installing new crontab [root@hadoop102 ~]# [root@hadoop103 ~]# sudo /usr/sbin/ntpdate hadoop101 16 May 19:35:37 ntpdate[11888]: adjust time server 192.168.24.101 offset 0.000058 sec 您在 /var/spool/mail/root 中有新邮件 [root@hadoop103 ~]# date 2022年 05月 16日 星期一 19:35:47 CST [root@hadoop103 ~]#
10、安装Hadoop(暂时只在一台机器执行即可,安装完成之后利用配置好的免密登录 发送到另外两台服务器即可)。Hadoop下载地址:https://archive.apache.org/dist/hadoop/common/hadoop-3.2.1/
(1)将hadoop-3.2.1.tar.gz 上传到/home/offcn/software [offcn@hadoop101 software]$ pwd /home/offcn/software [offcn@hadoop101 software]$ ll 总用量 531948 -rw-r--r--. 1 root root 359196911 3月 8 11:00 hadoop-3.2.1.tar.gz -rw-r--r--. 1 root root 185515842 3月 5 16:22 jdk-8u144-linux-x64.tar.gz (2)将hadoop-3.2.1.tar.gz解压到/home/offcn/apps [offcn@hadoop101 software]$ tar -zxvf hadoop-3.2.1.tar.gz -C ../apps/ [offcn@hadoop101 software]$ ll -rw-r--r--. 1 root root 359196911 3月 8 11:00 hadoop-3.2.1.tar.gz (3)将Hadoop添加到环境变量 [offcn@hadoop101 apps]$ sud o vim /etc/profile #HADOOP_HOME export HADOOP_HOME=/home/offcn/apps/hadoop-3.2.1 export PATH=$PATH:$HADOOP_HOME/bin export PATH=$PATH:$HADOOP_HOME/sbin (4)让修改后的文件生效 [offcn@hadoop101 apps]$ source /etc/profile (5)测试是否安装成功 [offcn@hadoop101 apps]$ hadoop version Hadoop 3.2.1 # 注意:如果hadoop命令不能用可reboot尝试重启
集群规划
hadoop101 hadoop102 hadoop103 HDFS NameNode SecondaryNameNode DataNode DataNode DataNode YARN ResourceManager NodeManager NodeManager NodeManager
修改配置文件
(1)配置Hadoop所使用Java的环境变量以及日志存储路径 [offcn@hadoop101 hadoop]$ cd $HADOOP_HOME/etc/hadoop [offcn@hadoop101 hadoop]$ pwd /home/offcn/apps/hadoop-3.2.1/etc/hadoop [offcn@hadoop101 hadoop]$ vim hadoop-env.sh export JAVA_HOME=/home/offcn/apps/jdk1.8.0_144 export HADOOP_LOG_DIR=/home/offcn/logs/hadoop-3.2.1 【必选】 export HDFS_NAMENODE_USER=offcn export HDFS_DATANODE_USER=offcn export HDFS_SECONDARYNAMENODE_USER=offcn export YARN_RESOURCEMANAGER_USER=offcn export YARN_NODEMANAGER_USER=offcn (2)核心配置文件core-site.xml [offcn@hadoop101 hadoop]$ vim core-site.xml 文件内容如下:(3)HDFS配置文件 配置hdfs-site.xml [offcn@hadoop101 hadoop]$ vim hdfs-site.xml 文件内容如下: [offcn@hadoop101 hadoop]$ vim hdfs-site.xml fs.defaultFS hdfs://hadoop101:8020 hadoop.data.dir /home/offcn/data/hadoop-3.2.1 hadoop.proxyuser.offcn.hosts * hadoop.proxyuser.offcn.groups * (4)YARN配置文件 配置yarn-site.xml [offcn@hadoop101 hadoop]$ vim yarn-site.xml 文件内容如下: dfs.namenode.name.dir file://${hadoop.data.dir}/name dfs.datanode.data.dir file://${hadoop.data.dir}/data dfs.namenode.checkpoint.dir file://${hadoop.data.dir}/namesecondary dfs.client.datanode-restart.timeout 30 dfs.namenode.secondary.http-address hadoop103:9868 dfs.permissions false (5)MapReduce配置文件 配置mapred-site.xml [offcn@hadoop101 hadoop]$ vim mapred-site.xml 文件内容如下: yarn.nodemanager.aux-services mapreduce_shuffle yarn.resourcemanager.hostname hadoop102 yarn.nodemanager.env-whitelist JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME (6)配置works(去掉localhost,添加如下内容) [offcn@hadoop101 hadoop]$ vim workers hadoop101 hadoop102 hadoop103 (7)在集群上分发配置好的Hadoop [offcn@hadoop101 apps]$ scp -r /home/offcn/apps/hadoop-3.2.1 hadoop102:$PWD [offcn@hadoop101 apps]$ scp -r /home/offcn/apps/hadoop-3.2.1 hadoop103:$PWD 发送hadoop101的hadoop的环境变量配置文件到hadoop102和hadoop103 sudo scp /etc/profile hadoop102:/etc/ sudo scp /etc/profile hadoop103:/etc/ # 切记刷新配置文件 mapreduce.framework.name yarn
11、集群启停及测试
1、单点启动 (1)如果集群是第一次启动,需要格式化NameNode(格式化只进行一次!!!) 在格式化时,要保证一切正常,不要出现错误、异常、或者提示让选择yes或者no;如果出现错误等情况,把所有的配置检查一遍确认无误后,将hadoop安装目录下的data、pid、logs目录删除重新格式化。 [offcn@hadoop101 hadoop-3.2.1]$ hadoop namenode -format 2、集群群起启动 (1)如果集群是第一次启动,需要格式化NameNode(格式化只进行一次!!!),操作方式详见单点启动。 (2)启动HDFS [offcn@hadoop101 hadoop-3.2.1]$ start-dfs.sh Starting namenodes on [hadoop101] Starting datanodes Starting secondary namenodes [hadoop103] (3)在配置了ResourceManager的节点(hadoop102)启动YARN [offcn@hadoop102 hadoop-3.2.1]$ start-yarn.sh Starting resourcemanager Starting nodemanagers
12、 查看Web界面
# 首先关闭防火墙 查看防火墙状态systemctl status firewalld.service 关闭防火墙 systemctl stop firewalld.service 开机禁用防火墙 sudo systemctl disable firewalld.service (1)查看Hdfs的Web界面 浏览器输入地址:https://hadoop的ip地址:9870/ (2)查看Yarn的Web界面 浏览器输入地址:https://hadoop102:8088/
Yarn启动报错
Error injecting constructor, java.lang.NoClassDefFoundError: javax/activation/DataSource at org.apache.hadoop.yarn.server.nodemanager.webapp.JAXBContextResolver.(JAXBContextResolver.java:52) at org.apache.hadoop.yarn.server.nodemanager.webapp.WebServer$NMWebApp.setup(WebServer.java:153) while locating org.apache.hadoop.yarn.server.nodemanager.webapp.JAXBContextResolver 因为是JDK11的问题,参考解决:https://blog.csdn.net/tjcyjd/article/details/105631639 https://issues.apache.org/jira/browse/HADOOP-14978 官网说的不支持: https://cwiki.apache.org/confluence/display/HADOOP/Hadoop+Java+Versions 解决方法: URL=https://jcenter.bintray.com/javax/activation/javax.activation-api/1.2.0/javax.activation-api-1.2.0.jar wget $URL -P /home/xiaosi/apps/hadoop-3.2.1/etc/hadoop/lib echo 'export HADOOP_CLASSPATH+=" /home/xiaosi/apps/hadoop-3.2.1/etc/hadoop /lib/*.jar"' >>/home/xiaosi/apps/hadoop-3.2.1/etc/hadoop/hadoop-env.sh
成功解决
13、Windows下 HDFS API搭建
要想在windows环境下进行hadoop开发,必须先将hadoop的源码下载下来进行编译,然后配置到环境变量里面,这里我们已经提前编译好了。
# 问题:在windows上做HDFS客户端应用开发,需要设置Hadoop环境,而且要求是windows平台编译的Hadoop,不然会报以下的错误: # 缺少winutils.exe Could not locate executable null binwinutils.exe in the hadoop binaries # 缺少hadoop.dll Unable to load native-hadoop library for your platform… using builtin-Java classes where applicable
搭建步骤
-
将已经编译好的Windows版本Hadoop解压到到一个没有中文没有空格的路径下面
-
在windows上面配置hadoop的环境变量: HADOOP_HOME,并将%HADOOP_HOME%bin添加到path中
配置HADOOP_HOME
配置PATH目录
-
把hadoop3.2.1文件夹中bin目录下的hadoop.dll文件放到系统盘: C:WindowsSystem32 目录
创建maven工程导入pom文件,完整源码见github: https://github.com/sichaolong/spring-demo/tree/main/springboot-hdfs-demo
注意:如果报错sl4j错误,参考解决:报错8_引入Sl4j报错 Class path contains multiple SLF4J bindings.
# 创建一个Maven工程myhdfs # 导入相应的依赖坐标+日志添加# 在项目的src/main/resources目录下,新建一个文件,命名为“log4j.properties”,在文件中填入 # 控制台输出配置 log4j.appender.Console=org.apache.log4j.ConsoleAppender log4j.appender.Console.layout=org.apache.log4j.PatternLayout log4j.appender.Console.layout.ConversionPattern=%d [%t] %p [%c] - %m%n # 指定日志的输出级别与输出端 log4j.rootLogger=DEBUG,Console # 日志级别: # OFF FATAL ERROR WARN INFO DEBUG TRACE ALL # ERROR>WARN>INFO>DEBUG # 如果springboot-start对应版本也存在依赖sl4j2,则会发生依赖冲突,排除一个即可 org.apache.hadoop hadoop-common 3.2.1 org.apache.hadoop hadoop-client 3.2.1 org.apache.hadoop hadoop-hdfs 3.2.1 junit junit 4.13
日志工具的简单使用
package com.offcn.hdfs;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
public class MyLogger {
public static void main(String[] args) {
// Logger myloger = LogManager.getLogger("logname");
Logger myloger = LogManager.getLogger(MyLogger.class);
myloger.error("error");
myloger.warn("warn");
myloger.info("info");
myloger.debug("debug");
}
}
三、过程JDK11各种报错解决
# 以下记录过程出现的错误及解决 1. 使用hadoop-java-api,安装hadoop-client客户端设置完之后,JDK11目录因为包含空格报错: 解决参考:https://stackoverflow.com/questions/31621032/hadoop-on-windows-error-java-home-is-incorrectly-set 2. 可视化界面报错:Failed to retrieve data from /webhdfs/v1/?op=LISTSTATUS: Server Error 上传文件报错:Couldn't find datanode to write file. Server Error 重启也没用,应该是JDK11版本的问题。。。修改hadoop-env.sh文件添加export HADOOP_OPTS="--add-modules java.activation" 解决参考:https://stackoverflow.com/questions/48735869/error-failed-to-retrieve-data-from-webhdfs-v1-op-liststatus-server-error-wh,然后还是报错,最后修改配置文件为下面,才解决 3. Java-api上传文件报错但是文件夹也创建成功了:java.io.FileNotFoundException: Could not locate Hadoop executable: E:hadoop-clienthadoop-3.2.1binwinutils.exe -see https://wiki.apache.org/hadoop/WindowsProblems 解决:提示缺少winutils.exe,复制到bin目录即可 4. 日志依赖冲突hadoop-common中的slf4j-reload4j和spring-boot-starter中的logback-classic冲突,注释一个即可org.apache.hadoop hadoop-common 3.2.1 org.apache.hadoop hadoop-client 3.2.1 org.apache.hadoop hadoop-hdfs 3.2.1 org.springframework.boot spring-boot-starter logback-classic ch.qos.logback org.projectlombok lombok true org.springframework.boot spring-boot-starter-test test
对于报错2的可视化界面报错,解决参考



