hadoop集群搭建(笔记版)手把手教你搭建hadoop3.x集群(高可用)(易错点分析)常用命令笔记

相关文件下载及配置

VMware16 prow 下载地址
linux操作系统 centos7
xftp
xshell
先安装vmware再将centos导入创建虚拟机 再配置网络

网络配置

vmware安装完成后会自动生成 vmnet1 vment8两个网卡
网络编辑器可以有三个模式功能都不相同

  1. VMnet1
    使用Host-Only模式的guest系统与主机通信需要VMnet1网卡的支持
  2. VMnet8
    使用NAT网络模式,在宿主机安装多台虚拟机,和宿主组成一个小局域网,宿主机,虚拟机之间都可以互相通信,虚拟机也可访问外网,例如 搭建 hadoop 集群,分布式服务
  3. VMNet0
    使用桥接模式,安装VM后,在VM里建立虚拟机 默认 就是该模式。
    如果你只是需要一台虚拟机可以和宿主互通,并可以访问外网,此模式即可。

网络配置

su root          //管理员模式
systemctl status firewalld //查看防火墙
systemctl stop firewalld //停止防火墙
systemctl disable firewalld //彻底关闭防火墙
vi /etc/sysconfig/network-scripts/ifcfg-ens33 //设置VMware主机IP地址

ifconfig//查ip

BOOTPROTO=static
ONBOOT=yes
IPADDR=192.168.100.10
NETMASK=255.255.255.0
GATEWAY=192.168.100.20
DNS1=8.8.8.8

BOOTPROTO:是获取的ip地址类型,static和none为静态地址。dhcp为静止获取IP地址。
ONB:设置网卡是否在Linux系统启动时激活,一般设置为yes
IPADDR=本机IP地址
NETMASK:子网掩码
GATEWAY:网关
DNS1:首选DNS服务器

service NetworkManager start

service network restart //重启网络
通过ping baidu.com检测外网环境
ping 虚拟机ip地址检测内部网络环境

注意NAT中的网关ip需外联设置
注意设置的ip要在DHCP中的IP段内

注意vmware有自己的一套网络配置系统,其网段与虚拟机网网段相同,但ip不同,否则xshell无法连接

基础配置

vi /etc/sysconfig/network //设置主机名
NETWORK=yes
HOSTNAME=主机名

vi /etc/hostname

修改网络地址
vi /etc/sysconfig/network-scripts/ifcfg-ens33 //设置VMware主机IP地址
service network restart //重启网络

//解压缩
tar -zxvf hadoop-2.5.2.tar.gz

在master配置节点
cd /opt/hadoop/etc/hadoop
vi slaves

在master中格式化系统

hadoop namenode-format

//启用配置文件
source /etc/profile

start-all.sh
然后在三台虚拟机输入jps查看是否有节点显示

linux查看开放端口的方法:
1、使用rpm安装nmap工具,执行“nmap 127.0.0.1”命令即可查看本机开放的端口;
2、执行“netstat -anp”命令进行查看开放的端口。

编辑hosts文件

获取权限

chmod 777 /opt/hadoop/...

在虚拟机上输入命令:vi /etc/hosts

127.0.0.1    localhost  localhost.localdomain localhost4 localhost4.localdomain4
::1          localhost  localhost.localdomain localhost6 localhost6.localdomain6
192.168.244.100 master
192.168.244.101 slave01
192.168.244.102 slave02

SSH免密登陆

免密登录原理

每台主机authorized_keys文件里面包含的主机(ssh密钥),该主机都能无密码登录,所以只要每台主机的authorized_keys文件里面都放入其他主机(需要无密码登录的主机)的ssh密钥就行了。
三个虚拟机上均要执行下面的操作

创建一对钥匙 (私钥 + 密钥) :  ssh-keygen
cd .ssh
ssh-copy-id hadoop101
yes
密码

ssh-copy-id -i id_rsa.pub root@主机名 将密钥发送到目标主机
ssh-copy-id -i id_rsa.pub root@
ssh-copy-id -i id_rsa.pub root@
ssh-copy-id -i id_rsa.pub root@
# 发现一个问题,目录的属主和权限配置不当
Authentication refused: bad ownership or modes for directory /root

SSH不希望home目录和~/.ssh目录对组有写权限
修改权限
chmod 700 /root
chmod 700 /root/.ssh 
chmod 644 /root/.ssh/authorized_keys

scp、xsync集群分发脚本

(1) scp命令(安全拷贝)
实现服务器与服务器之间的数据拷贝
这里以以复制master–>其他服务器上为例,在master服务器中进入module文件夹下,输入命令
scp -r jdk/ root@master:/opt/module/
表示将master上的jdk复制到slave01中的module里
scp -r /opt/module/* root@slave01:/opt/module/
表示将master上module文件夹中的所有内容的拷贝到slave01服务器中的module里
(2)rsync 远程同步工具
rsync用于备份和镜像。具有速度快、避免复制相同内容和支持符号链接的优点
(3)xsync

修改核心配置文件

core-site.xml、

<configuration>
	<!-- 指定 NameNode 的地址 --> 
	<property>
	<name>fs.defaultFS</name>
	<value>hdfs://hadoop101:8020</value> 
	</property>
	<!-- 指定 hadoop 数据的存储目录 -->
	<property>
		<name>hadoop.tmp.dir</name> 
		<value>/opt/module/hadoop-3.1.4/data</value>
	</property>
	<!-- 配置 HDFS 网页登录使用的静态用户为 root --> 
	<property>
		<name>hadoop.http.staticuser.user</name>
		<value>root</value> 
	</property>
</configuration>

hdfs-site.xml、

configuration>
      <!-- nn web端访问地址-->
      <property>
            <name>dfs.namenode.http-address</name>
            <value>hadoop101:9870</value>
      </property>
      <!-- 2nn web 端访问地址--> 
      <property>
        	<name>dfs.namenode.secondary.http-address</name>
        	<value>hadoop103:9868</value>
      </property>
</configuration>

yarn-site.xml、

<configuration>
	<!-- 指定 MR 走 shuffle --> 
	<property>
		<name>yarn.nodemanager.aux-services</name>
		<value>mapreduce_shuffle</value> 
	</property>
	<!-- 指定 ResourceManager 的地址--> <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>

mapred-site.xml

<configuration>
    <!-- 指定 MapReduce 程序运行在 Yarn 上 -->
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
        <property>
        <name>yarn.app.mapreduce.am.env</name>
        <value>HADOOP_MAPRED_HOME=/opt/module/hadoop-3.1.4</value>
    </property>
    <property>
        <name>mapreduce.map.env</name>
        <value>HADOOP_MAPRED_HOME=/opt/module/hadoop-3.1.4</value>
    </property>
    <property>
        <name>mapreduce.reduce.env</name>
        <value>HADOOP_MAPRED_HOME=/opt/module/hadoop-3.1.4</value>
    </property>
        <!-- 历史服务器端地址 -->
    <property>
        <name>mapreduce.jobhistory.address</name>
        <value>hadoop101:10020</value>
    </property>
    <!-- 历史服务器 web 端地址 -->
    <property>
        <name>mapreduce.jobhistory.webapp.address</name>
        <value>hadoop101:19888</value>
    </property>
</configuration>

关于hadoop节点无法启动

转自https://www.csdn.net/tags/MtTaYgzsMjQxMi1ibG9n.html
hadoop无法启动
千次阅读
这段时间自己的操作系统从windows完全换为Deepin Linux.主要是想感受下国产操作系统.经过一段时间的使用,感觉确实不错.可是要想让完全不懂Linux的用户来使用,光是文件管理就可以让绝大多数人奔溃啦。好了言归正传。我使用Deepin Linux搭建了Hadoop3.2.但是在启动的过程中无法打开50070端口.有重新Format之后,发现NameNode无法启动.

1、问题产生原因
当我们执行文件系统格式化时,会在namenode数据文件夹(即配置文件中dfs.namenode.name.dir在本地系统的路径)中保存一个current/VERSION文件,记录clusterID,标识了所格式化的 namenode的版本。如果我们频繁的格式化namenode,那么datanode中保存(即配置文件中dfs.data.dir在本地系统的路径)的current/VERSION文件只是你第一次格式化时保存的namenode的ID,因此就会造成datanode与namenode之间的 id 不一致。

2 解决办法
删除HDFS上的原有数据,重新Format.

gosaint@gosaint:/usr/local/hadoop$ jps
Picked up _JAVA_OPTIONS:   -Dawt.useSystemAAFontSettings=gasp
9976 SecondaryNameNode
10153 Jps
9627 NameNode
=====发现没有DataNode

gosaint@gosaint:/usr/local/hadoop$ ./sbin/stop-dfs.sh
Stopping namenodes on [192.168.1.175]
Stopping datanodes
Stopping secondary namenodes [account.jetbrains.com]
Picked up _JAVA_OPTIONS:   -Dawt.useSystemAAFontSettings=gasp

====停止NameNode以及DataNode

==== 删除tmp文件夹
gosaint@gosaint:/usr/local/hadoop$ rm -rf ./tmp

==== 重新Format 
gosaint@gosaint:/usr/local/hadoop$ ./bin/hdfs namenode -format

==== 启动NameNode\DataNode
gosaint@gosaint:/usr/local/hadoop$ ./sbin/start-dfs.sh
Starting namenodes on [192.168.1.175]
Starting datanodes
Starting secondary namenodes [account.jetbrains.com]
Picked up _JAVA_OPTIONS:   -Dawt.useSystemAAFontSettings=gasp

==== 查看进程
gosaint@gosaint:/usr/local/hadoop$ jps
Picked up _JAVA_OPTIONS:   -Dawt.useSystemAAFontSettings=gasp
11419 SecondaryNameNode
11115 DataNode
11564 Jps
10974 NameNode
gosaint@gosaint:/usr/local/hadoop$ ^C

关于环境变量配置的说明

在这里插入图片描述
由于/etc/profie 在非登陆模式下无法获取配置 我们选择使用自定义的.sh文件
在/etc/profile.d下vim一个自定义文件,里面包含需要加载的环境变量

zk的一键启动脚本

配置zk

/opt/zookeeper/zkData/myid


/opt/zookeeper/conf/zoo.cfg
#修改dataDir,需要自己创建该目录:
dataDir=/opt/zookeeper/zkData
 
 
#添加集群中其他节点的信息
server.1=master:2888:3888
server.2=slave01:2888:3888
server.3=slave02:2888:3888
server.4=slave03:2888:3888
#!/bin/bash

case $1 in
"start"){
    for i in master slave01 slave02 slave03
    do
     	echo ---------- zookeeper $i 启动 ------------
        sshpass -p root ssh -o StrictHostKeyChecking=no $i "/opt/zookeeper/bin/zkServer.sh start"
    done
};;
"stop"){
    for i in master slave01 slave02 slave03
    do
     	echo ---------- zookeeper $i 停止 ------------
        sshpass -p root ssh -o StrictHostKeyChecking=no $i "/opt/zookeeper/bin/zkServer.sh stop"
    done
};;
"status"){
    for i in master slave01 slave02 slave03
    do
     	echo ---------- zookeeper $i 状态 ------------
        sshpass -p root ssh -o StrictHostKeyChecking=no $i "/opt/zookeeper/bin/zkServer.sh status"
    done
};;
esac

Linux默认未安装sshpash 需要使用命令安装

yum -y install sshpass

kafka的配置与启动脚本

环境变量
#KAFKA_HOME
export KAFKA_HOME=/opt/kafka
export PATH=$PATH:$KAFKA_HOME/bin


在/opt/zookeeper/ 目录下创建数据文件目录
mkdir /opt/zookeeper/datas


修改配置文件/opt/kafka/config/server.properties
# The id of the broker. This must be set to a unique integer for each broker.
每台机器一个,从0开始
broker.id=0

zookeeper服务相关
zookeeper.connect=master:2181,slave01:2181,slave02:2181,slave03:2181/kafka

# A comma separated list of directories under which to store log files
数据存放地址 自己创建的安全地址
log.dirs=/opt/kafka/datas

集群启动脚本

#!/bin/bash
 
case $1 in "start"){
  for i in master slave01 slave02 slave03
      do 
        echo "========== $i kafka开启=========="  
        ssh $i '/opt/kafka/bin/kafka-server-start.sh -daemon /opt/kafka/config/server.properties' 
 
      done
};;
"stop"){
  for i in master slave01 slave02 slave03
      do 
         echo "========== $i kafka关闭=========="  
         ssh $i '/opt/kafka/bin/kafka-server-start.sh' 
      done
};;
 
esac

注意 :kafka默认启动的最小内存为1G,内存不足则无法启动
在启动脚本中配置

/opt/kafka/bin/kafka-server-start.sh

 export KAFKA_HEAP_OPTS="-Xmx256M -Xms128M"

启动

启动命令:

bin/kafka-server-start.sh config/server.properties
此方式可以实时查看日志.

后台启动方式:

./kafka-server-start.sh -daemon ../config/server.properties

填坑

关于zookeeper无法关闭的问题

由于kafka中也存在zk服务所以在kafka/bin目录下执行关闭操作

ZooKeeper JMX enabled by default
Using config: /usr/local/apache-zookeeper-3.5.8-bin/bin/../conf/zoo.cfg
Stopping zookeeper ... no zookeeper to stop (could not find file /tmp/zookeeper/zookeeper_server.pid)

之前启动的是kafka里面的zookeeper,是在kafka目录里,用的是nohup bin/zookeeper-server-start.sh config/zookeeper.properties > zk.log 2>&1 &启动,而我是在zookeeper目录里,用./zkServer.sh start启动,两个应该启动的不是同一个服务,也就不能用对方的命令来关闭。
  所以只需要到kafka的目录里,使用./zookeeper-server-stop.sh关闭就行了

关于增加服务器导致datanode不可用问题

由于/opt/hadoop/hadoopdata/dfs/data下的VERSION也被复制进去,dfs无法找到真正的datanodeID 所以将hadoopdata删除,按照节点服役退役方式重启datanode

在NameNode节点上执行hdfs dfsadmin -refreshNode,在
ResourceManagerNode节点上执行yarn rmadmin -refreshNodes。

进入slave3,执行hadoop-daemon.sh start datanode和yarn-daemon.sh start nodemanager启动DataNode和NodeManager。

在NameNode节点上执行hdfs dfsadmin -refreshNode,在ResourceManagerNode节点上执行yarn rmadmin -refreshNodes。

进入slave3,执行hadoop-daemon.sh start datanodeyarn-daemon.sh start nodemanager启动DataNode和NodeManager。
回到master主机,执行start-balancer.sh平衡节点。
上传文件测试,该节点正常接收分块:

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值