hadoop集群搭建
相关文件下载及配置
VMware16 prow 下载地址
linux操作系统 centos7
xftp
xshell
先安装vmware再将centos导入创建虚拟机 再配置网络
网络配置
vmware安装完成后会自动生成 vmnet1 vment8两个网卡
网络编辑器可以有三个模式功能都不相同
- VMnet1
使用Host-Only模式的guest系统与主机通信需要VMnet1网卡的支持 - VMnet8
使用NAT网络模式,在宿主机安装多台虚拟机,和宿主组成一个小局域网,宿主机,虚拟机之间都可以互相通信,虚拟机也可访问外网,例如 搭建 hadoop 集群,分布式服务 - 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 datanode和yarn-daemon.sh start nodemanager启动DataNode和NodeManager。
回到master主机,执行start-balancer.sh平衡节点。
上传文件测试,该节点正常接收分块: