赞
踩
说明
记录大数据疫情可视化平台项目的基础环境搭建:虚拟机搭建Hadoop3.2.1环境。环境说明
目录
步骤记录
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:\Windows\System32\drivers\etc\hosts
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
文件内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop101:8020</value>
</property>
<property>
<name>hadoop.data.dir</name>
<value>/home/offcn/data/hadoop-3.2.1</value>
</property>
<property>
<name>hadoop.proxyuser.offcn.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.offcn.groups</name>
<value>*</value>
</property>
</configuration>
(3)HDFS配置文件
配置hdfs-site.xml
[offcn@hadoop101 hadoop]$ vim hdfs-site.xml
文件内容如下:
[offcn@hadoop101 hadoop]$ vim hdfs-site.xml
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>dfs.namenode.name.dir</name>
<value>file://${hadoop.data.dir}/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file://${hadoop.data.dir}/data</value>
</property>
<property>
<name>dfs.namenode.checkpoint.dir</name>
<value>file://${hadoop.data.dir}/namesecondary</value>
</property>
<property>
<name>dfs.client.datanode-restart.timeout</name>
<value>30</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop103:9868</value>
</property>
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
</configuration>
(4)YARN配置文件
配置yarn-site.xml
[offcn@hadoop101 hadoop]$ vim yarn-site.xml
文件内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop102</value>
</property>
<property>
<name>yarn.nodemanager.env-whitelist</name>
<value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>
</property>
</configuration>
(5)MapReduce配置文件
配置mapred-site.xml
[offcn@hadoop101 hadoop]$ vim mapred-site.xml
文件内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
(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/
# 切记刷新配置文件
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.<init>(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 \bin\winutils.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:\Windows\System32 目录
创建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
# 导入相应的依赖坐标+日志添加
<dependencies>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>3.2.1</version>
</dependency>
# 如果springboot-start对应版本也存在依赖sl4j2,则会发生依赖冲突,排除一个即可
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>3.2.1</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-hdfs</artifactId>
<version>3.2.1</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
</dependency>
</dependencies>
# 在项目的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
日志工具的简单使用
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");
}
}
# 以下记录过程出现的错误及解决
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-client\hadoop-3.2.1\bin\winutils.exe -see https://wiki.apache.org/hadoop/WindowsProblems
解决:提示缺少winutils.exe,复制到bin目录即可
4. 日志依赖冲突hadoop-common中的slf4j-reload4j和spring-boot-starter中的logback-classic冲突,注释一个即可
<dependencies>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>3.2.1</version>
<!-- 运行test模块要排除依赖-->
<!-- <exclusions>-->
<!-- <exclusion>-->
<!-- <artifactId>slf4j-reload4j</artifactId>-->
<!-- <groupId>org.slf4j</groupId>-->
<!-- </exclusion>-->
<!-- </exclusions>-->
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>3.2.1</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-hdfs</artifactId>
<version>3.2.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<exclusion>
<artifactId>logback-classic</artifactId>
<groupId>ch.qos.logback</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
对于报错2的可视化界面报错,解决参考
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。