在虚拟机或Docker中搭建大数据伪分布式集群(一):hadoop基础功能——hdfs 与 yarn

在虚拟机或Docker中搭建大数据伪分布式集群(一):hadoop基础功能——hdfs 与 yarn

参考官网教程:https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-common/SingleCluster.html

参考教程:使用Docker搭建Hadoop集群环境 - 简书


目录

环境准备

一、集群搭建

1、VM虚拟机

2、Docker集群搭建

(1)拉去Centos镜像

(2)创建容器

(3)启动控制台并进入docker容器中:

3、安装OpenSSH免密登录

(1)各节点分别安装

(2)生成公钥

(3)公钥分发

二、软件安装与环境配置

1、宿主机向Docker容器传送软件安装包

2、软件环境配置

三、配置hadoop运行所需文件

1、修改core-site.xml

2、修改hdfs-site.xml

3、修改mapred-site.xml

4、修改yarn-site.xml

5、在hadoop-env.sh中设JAVA_HOME

6、修改etc/hadoop/workers 配置 需要启动DataNode的机器名

7、修改Hadoop启动文件

8、hadoop复制分发

四、Hadoop 启动

1、格式化namenode

2、启动集群

主节点 JPS

从节点

3、问题注意

问题一: tput: command not found

问题二:hadoop java.lang.IllegalArgumentException: Does not contain a valid host:port 8020

问题三:在安装配置hadoop的过程中,很可能发生错误导致datanode或者namenode 启动失败,这时我们可以选择重新格式化 namenode。

问题四:时间同步问题

4、验证服务

hadoop

yarn

 5、基准测试


环境准备

虚拟机软件下载地址请自行搜索: VMWare 软件(建议使用16.0以上版本,与 docker 不冲突)或 Docker 

开发软件清华镜像下载地址:清华大学开源软件镜像站 | Tsinghua Open Source Mirror

centos7、OpenJDK8、hadoop-3.2.2.tar.gz

注意软件版本,以上是我多次踩坑后,得出的最佳版本配方(jdk必须是8以上),不然安装时总一些奇怪的问题解决不了,很让人崩溃的。

建议使用docker的镜像生成,或者使用VMWare的快照功能,每到一个环节就保存一次,这样随时可回退,重新开始。

Docker 或 VMWare 的搭建方式只有前期有所不同,后面的基本一致。

一、集群搭建

1、VM虚拟机

具体可参考:通过VMware搭建分布式集群基础环境_老农小江的博客-CSDN博客

虚拟机克隆后,记得修改机器的相关配置

# 修改虚拟机网卡文件
vi /etc/sysconfig/network-scripts/ifcfg-ens33

将BOOTPROTO=dhcp修改为BOOTPROTO=static
将ONBOOT=no 修改为 ONBOOT=yes

添加配置: 网关与子网掩码必须与虚拟网卡中的配置一致,ip必须在设定的范围中
IPADDR=192.168.78.128
NETMASK=255.255.255.0
GATEWAY=192.168.78.2

# 修改完成保存

# 配置hosts
vi /etc/hosts

192.168.78.128 node1
192.168.78.129 node2
192.168.78.130 node3


# 重启网络服务
service network restart

# 关闭并禁用防火墙
systemctl stop firewalld
systemctl disable firewalld
systemctl status firewalld

# 修改主机名
vi /etc/hostname
hadoop-master

# 重启
reboot

搞定的话,直接看第3步

2、Docker集群搭建

(1)拉去Centos镜像

docker pull centos:latest

使用docker images 查看下载的镜像

(2)创建容器

按照集群的架构,创建容器时需要设置固定IP,所以先要在docker使用如下命令创建固定IP的子网

network create --subnet=172.19.0.0/16 hadoop-group

docker的子网创建完成之后就可以创建固定IP的容器了

当然,对docker比较熟悉的同学,可以先建立基础容器,安装配置后,再生成镜像,最后使用新镜像来搭建集群

嫌麻烦的,可直接拉取相关镜像:hermesfuxi/centos-hadoop-base

Docker Hub 地址:Docker Hub

# node1
# -p 设置docker映射到容器的端口 后续查看web管理页面使用
docker run -d --privileged -ti -v /sys/fs/cgroup:/sys/fs/cgroup --name hadoop-master -h hadoop-master -p 18088:18088 -p 9870:9870 -p 16010:16010 --net hadoop-group --ip 172.19.0.2 centos /usr/sbin/init

# node2 备用主节点,端口号: master映射端口  + 1
docker run -d --privileged -ti -v /sys/fs/cgroup:/sys/fs/cgroup --name hadoop-master -h hadoop-master -p 18081:18088 -p 9871:9870 -p 16011:16010 --net hadoop-group --ip 172.19.0.3 centos /usr/sbin/init

# node3 端口号: master映射端口  + 1
docker run -d --privileged -ti -v /sys/fs/cgroup:/sys/fs/cgroup --name hadoop-slave1 -h hadoop-slave1 --net hadoop-group --ip 172.19.0.4 centos /usr/sbin/init

(3)启动控制台并进入docker容器中:

docker exec -it hadoop-master /bin/bash

3、安装OpenSSH免密登录

(1)各节点分别安装

#安装openssh
[root@hadoop-slave1 /]#yum -y install openssh openssh-server openssh-clients

[root@hadoop-slave1 /]# systemctl start sshd

(2)生成公钥

分别在各机器上执行

ssh-keygen -t rsa
#一路回车

# 将公钥导入到认证文件
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

# 查看 authorized_keys 文件内容
cat ~/.ssh/authorized_keys

chmod 0700 /root -R

(3)公钥分发

文件生成之后用scp将公钥文件分发到集群slave主机

[root@node2 /]# ssh-copy-id -i ~/.ssh/id_rsa.pub node1
[root@node3 /]# ssh-copy-id -i ~/.ssh/id_rsa.pub node1

[root@node1 /]# scp ~/.ssh/authorized_keys root@node2:~/.ssh
[root@node1 /]# scp ~/.ssh/authorized_keys root@node3:~/.ssh

分发完成之后测试(ssh node2 等)是否已经可以免输入密码登录

二、软件安装与环境配置

1、宿主机向Docker容器传送软件安装包

格式:

docker cp 本地文件的路径 container_id:<docker容器内的路径>

比如:

docker cp /Volues/Linux/jdk1.8.0_231.tar.gz node1r:/opt/
docker cp /Volumes/Linux/hadoop-3.2.2.tar.gz  node1:/opt/

2、软件环境配置

解压OpenJDK8U-jdk_x64_linux_hotspot_8u275b01.tar.gz、hadoop-3.2.2.tar.gz至/opt 目录下,并创建链接文件

tar -xzvf OpenJDK8U-jdk_x64_linux_hotspot_8u275b01.tar.gz
mv jdk8u275-b01 jdk8

tar -xzvf hadoop-3.2.2.tar.gz
mv hadoop-3.2.2 hadoop

配置java和hadoop环境变量:编辑 /etc/profile文件

# hadoop
export HADOOP_HOME=/opt/hadoop/
export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH

#java
export JAVA_HOME=/opt/jdk8/
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=.:$JAVA_HOME/bin:$PATH

使文件生效:

source /etc/profile

三、配置hadoop运行所需文件

cd $HADOOP_HOME/etc/hadoop/

1、修改core-site.xml

<configuration>
    <!-- hadoop文件系统依赖的基本配置 -->
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/opt/hadoop/tmp</value>
        <description>A base for other temporary directories.</description>
    </property>

    <!-- fs表示文件系统和default.name表示名称节点
        9000表示datanode将发送心跳到namenode的端口。完整地址是转换为主机名的机器名称 -->
    <property>
        <name>fs.default.name</name>
        <value>hdfs://node1:8020</value>
    </property>

    <!-- 在此回收周期之内,文件实际上是被移动到trash的这个目录下面,而非马上把数据删除掉。等到回收周期真正到了以后,hdfs才会将数据删除。默认的单位是分钟,1440分钟=60*24,为一天,4320为三天 -->
    <property>
        <name>fs.trash.interval</name>
        <value>4320</value>
    </property>

    <!-- 指垃圾回收的检查间隔,应该是小于或者等于fs.trash.interval -->
    <property>
        <name>fs.trash.checkpoint.interval</name>
        <value>4320</value>
    </property>
</configuration>

2、修改hdfs-site.xml

<configuration>
<!-- namenode存储元数据位置  -->
<property>
   <name>dfs.namenode.name.dir</name>
   <value>/opt/hadoop/name</value>
 </property>

<!-- datanode存储数据位置  -->
 <property>
   <name>dfs.datanode.data.dir</name>
   <value>/opt/hadoop/data</value>
 </property>

<!-- 默认副本个数  -->
 <property>
   <name>dfs.replication</name>
   <value>3</value>
 </property>

<!-- 开启webhdfs(访问文件内容或者进行打开、上传、修改、下载等操作)  -->
 <property>
   <name>dfs.webhdfs.enabled</name>
   <value>true</value>
 </property>

<!-- hdfs的超级用户组,加入该的用户有超级用户权限  -->
 <property>
   <name>dfs.permissions.superusergroup</name>
   <value>supergroup</value>
 </property>

<!-- true开启权限验证,false关闭  -->
 <property>
   <name>dfs.permissions.enabled</name>
   <value>false</value>
 </property>
 </configuration>

3、修改mapred-site.xml

<configuration>
<property>
  <name>mapreduce.framework.name</name>
  <value>yarn</value>
</property>
<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>
</configuration>

4、修改yarn-site.xml

<?xml version="1.0"?>
<!--
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at
    http://www.apache.org/licenses/LICENSE-2.0
  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License. See accompanying LICENSE file.
-->
<configuration>
    <property>
        <name>yarn.resourcemanager.hostname</name>
        <value>node1</value>
    </property>

    <!-- NodeManager上运行的附属辅助服务,用于提升Shuffle计算性能 -->
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle,spark_shuffle</value>
    </property>
    <!-- NodeManager中辅助服务对应的类 mapreduce_shuffle -->
    <property>
        <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
        <value>org.apache.hadoop.mapred.ShuffleHandler</value>
    </property>
    <!-- NodeManager中辅助服务对应的类:spark_shuffle -->
    <property>
        <name>yarn.nodemanager.aux-services.spark_shuffle.class</name>
        <value>org.apache.spark.network.yarn.YarnShuffleService</value>
    </property>

    <!-- spark.shuffle服务端口,Spark应用使用External shuffle Service时使用 -->
    <property>
        <name>spark.shuffle.service.port</name>
        <value>7338</value>
    </property>

    <!-- 关闭内存资源检测: 配置 Spark On YARN 使用 -->
    <!-- 是否启动一个线程检查每个任务正使用的 物理内存量,如果任务超出分配值,则直接将其杀掉,默认是true -->
    <property>
        <name>yarn.nodemanager.pmem-check-enabled</name>
        <value>false</value>
    </property>
    <!-- 是否启动一个线程检查每个任务正使用的 虚拟内存量,如果任务超出分配值,则直接将其杀掉,默认是true -->
    <property>
        <name>yarn.nodemanager.vmem-check-enabled</name>
        <value>false</value>
    </property>

    <property>
        <name>yarn.resourcemanager.address</name>
        <value>node1:18040</value>
    </property>
    <property>
        <name>yarn.resourcemanager.scheduler.address</name>
        <value>node1:18030</value>
    </property>
    <property>
        <name>yarn.resourcemanager.resource-tracker.address</name>
        <value>node1:18025</value>
    </property>
    <property>
        <name>yarn.resourcemanager.admin.address</name>
        <value>node1:18141</value>
    </property>
    <property>
        <name>yarn.resourcemanager.webapp.address</name>
        <value>node1:18088</value>
    </property>
    <property>
        <name>yarn.log-aggregation-enable</name>
        <value>true</value>
    </property>
    <property>
        <name>yarn.log-aggregation.retain-seconds</name>
        <value>86400</value>
    </property>
    <property>
        <name>yarn.log-aggregation.retain-check-interval-seconds</name>
        <value>86400</value>
    </property>
    <property>
        <name>yarn.nodemanager.remote-app-log-dir</name>
        <value>/yarn/remotelogs</value>
    </property>
    <property>
        <name>yarn.nodemanager.remote-app-log-dir-suffix</name>
        <value>logs</value>
    </property>
</configuration>

5、在hadoop-env.sh中设JAVA_HOME

// 应当使用绝对路径。
export JAVA_HOME=$JAVA_HOME                  //错误,不能这么改
export JAVA_HOME=/opt/jdk8     //正确,应该这么改

6、修改etc/hadoop/workers 配置 需要启动DataNode的机器名

vim $HADOOP_HOME/etc/hadoop/workers

# 添加DataNode
node1
node2
node3

7、修改Hadoop启动文件

在Hadoop安装目录下找到sbin文件夹

cd $HADOOP_HOME/sbin

在里面修改文件

对于start-dfs.sh、stop-dfs.sh、start-all.sh、stop-all.sh文件,添加下列参数:

#!/usr/bin/env bash
HDFS_DATANODE_USER=root
HDFS_DATANODE_SECURE_USER=hdfs
HDFS_NAMENODE_USER=root
HDFS_SECONDARYNAMENODE_USER=root

对于start-yarn.sh和stop-yarn.sh文件,添加下列参数:

#!/usr/bin/env bash
YARN_RESOURCEMANAGER_USER=root
HADOOP_SECURE_DN_USER=yarn
YARN_NODEMANAGER_USER=root

8、hadoop复制分发

scp -r /opt/hadoop node2:/opt/
scp -r /opt/hadoop node3:/opt/

scp -r /opt/jdk8 node2:/opt/
scp -r /opt/jdk8 node3:/opt/

scp /etc/profile node2:/opt/
scp /etc/profile node3:/etc/

# 注意还需要激活各机器的环境变量 /etc/profile
ssh node2 source /etc/profile
ssh node3 source /etc/profile

四、Hadoop 启动

1、格式化namenode

hadoop namenode -format

如果看到storage format success等字样,即可格式化成功

2、启动集群

cd $HADOOP_HOME/sbin
./start-all.sh

# 只起hdfs
./start-dfs.sh

# hdfs 启动后,还可以启动 yarn
./start-yarn.sh

启动后可使用jps命令查看是否启动成功

主节点 JPS

从节点

  

3、问题注意

问题一: tput: command not found

yum install ncurses

问题二:hadoop java.lang.IllegalArgumentException: Does not contain a valid host:port 8020

大概率:主机的hostname不合法,修改为不包含着‘.’ '/' '_'等非法字符。

问题三:在安装配置hadoop的过程中,很可能发生错误导致datanode或者namenode 启动失败,这时我们可以选择重新格式化 namenode。

1.停止正在运行的集群部分(停止集群集成脚本)

$HADOOP_HOME/sbin/stop-all.sh

2.删除/opt/hadoop/ 下的data、tmp、jobhistory文件夹,并清空logs里的日志(参数是自己配置在core-site.xml、hdfs-site.xml中的文件路径 )

cd $HADOOP_HOME
rm -rf  name  data  tmp  jobhistory  logs/*

3.重新格式化

hadoop namenode -format

4.启动集群

$HADOOP_HOME/sbin/start-all.sh

问题四:时间同步问题

Centos 7 直接使用

# 若无ntpdate,请先安装
ntpdate time.nist.gov

CentOS 8中已经无法安装ntpdate,而是使用了chrony模块,安装后修改配置与时区设置即可完成时间同步。具体可见:Centos使用chrony做时间同步 - 驴得水 - 博客园

# yum 下载过慢的话,可更换阿里源
# 下载阿里云源文件
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-8.repo

# 替换 阿里云镜像地址
sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo

# 建立缓存
yum makecache

# 安装chrony
yum install -y chrony

# 修改配置文件
vim /etc/chrony.conf

# 添加如下配置
server 210.72.145.44 iburst
server ntp.aliyun.com iburst
allow 192.168.0.0/16
local stratum 10

# 启动chrony服务
systemctl start chronyd.service

# 设置开机同步时间  
systemctl enable chronyd.service

# 查看服务状态
systemctl status chronyd.service

# 更改时区为上海
timedatectl set-timezone Asia/Shanghai

# 开始时间同步
chronyc sources -v

# 查看
date

4、验证服务

访问组件 webUI 地址(主机没有配置host映射的,请用虚拟机 ip 访问,端口号不变,docker用localhost,端口用映射后的)来查看服务是否启动

hadoop

http://node1:9870/

查看相关的dataNode

yarn

http://node1:8088/cluster/apps

 5、基准测试

参考:

hadoop基准性能测试_dgqg1223-CSDN博客

或使用hibench:https://github.com/Intel-bigdata/HiBench

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值