从VMware到Hadoop的基础搭建
一、安装VMware
-
虚拟网络编辑器:
配置NAT类型的网络,配置网关
二、虚拟机系统安装
-
整体思路:
- 共安装三台机器,名称分别为 node1,node2,node3
- 完整配置一个,另外两个使用克隆,克隆后修改 IP、MAC地址、主机名hostname
-
修改IP、主机名
- 命令修改 临时生效 重启无效
- 修改底层配置文件 永久生效 重启才能生效。
# 主机名修改 vim /etc/hostname node1.itcast.cn
#修改IP vim /etc/sysconfig/network-scripts/ifcfg-ens33 TYPE="Ethernet" #网卡类型 以太网 PROXY_METHOD="none" BROWSER_ONLY="no" BOOTPROTO="none" #ip等信息是如何决定的? dhcp动态分配、 static|node 手动静态分配 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="74c3b442-480d-4885-9ffd-e9f0087c9cf7" DEVICE="ens33" ONBOOT="yes" #是否开机启动网卡服务 IPADDR="192.168.88.151" #IP地址 PREFIX="24" #子网掩码 等效: NETMASK=255.255.255.0 GATEWAY="192.168.88.2" #网关服务 DNS1="192.168.88.2" #网关DNS解析 DOMAIN="114.114.114.114" #公网DNS解析 114.114.114.114 谷歌:8.8.8.8 阿里百度DNS IPV6_PRIVACY="no
- node2、node3一样要改
-
host映射修改
目的:实现本地查找解析
-
linux上(每个虚拟机都要配置)
vim /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.88.151 node1 192.168.88.152 node2 192.168.88.153 node3
-
windows上
C:\Windows\System32\drivers\etc\hosts 192.168.88.151 node1 192.168.88.152 node2 192.168.88.153 node3
-
-
linux上防火墙关闭
-
firewalld
#查看防火墙状态 systemctl status firewalld #关闭防火墙 systemctl stop firewalld #关闭防火墙开机自启动 systemctl disable firewalld #centos服务开启关闭命令 centos6:(某些可以在centos7下使用) service 服务名 start|stop|status|restart chkconfig on|off 服务名 centos7: systemctl start|stop|status|restart 服务名 systemctl disable|enable 服务名 #开机自启动 关闭自启
-
selinux
vim /etc/selinux/config # This file controls the state of SELinux on the system. # SELINUX= can take one of these three values: # enforcing - SELinux security policy is enforced. # permissive - SELinux prints warnings instead of enforcing. # disabled - No SELinux policy is loaded. SELINUX=disabled
-
-
集群时间同步
目的:分布式软件主从角色之间通常基于心跳时间差来判断角色工作是否正常。
linux同步时间:
# 查看当前的系统时间 [root@node1 ~]# date Thu May 20 14:50:30 CST 2021 #ntpdate 授时服务器 ntpdate ntp5.aliyun.com [root@node1 ~]# ntpdate ntp5.aliyun.com 20 May 14:53:07 ntpdate[2187]: step time server 203.107.6.88 offset -1.354309 sec
-
ssh免密登录
目的:集群中node1使用ssh登录其他机器时免密码直接登录
#实现node1----->node2 #step1 在node1生成公钥私钥 [root@node1 ~]# ssh-keygen #一顿回车 在当前用户的home下生成公钥私钥 隐藏文件 [root@node1 .ssh]# pwd /root/.ssh [root@node1 .ssh]# ll total 12 -rw------- 1 root root 1675 May 20 11:59 id_rsa -rw-r--r-- 1 root root 402 May 20 11:59 id_rsa.pub -rw-r--r-- 1 root root 183 May 20 11:50 known_hosts #step2 copy公钥给node2 [root@node1 ~]# ssh-copy-id node2 注意第一次需要密码 #step3 [root@node1 .ssh]# ssh node2 Last login: Thu May 20 12:03:30 2021 from node1 [root@node2 ~]# exit logout Connection to node2 closed.
要求:至少打通node1---->node1 node2 node3 这三个免密登录
-
linux软件安装—MySQL
-
软件安装目录规范:
/export/server #软件安装目录 /export/software #安装包的目录 /export/data #软件运行数据保存的目录 /export/logs #软件运行日志 mkdir -p /export/server mkdir -p /export/software mkdir -p /export/data mkdir -p /export/logs
提示:MySQL只需要安装在node1服务器即可
安装步骤:
-
卸载Centos7自带的mariadb
[root@node3 ~]# rpm -qa|grep mariadb mariadb-libs-5.5.64-1.el7.x86_64 [root@node3 ~]# rpm -e mariadb-libs-5.5.64-1.el7.x86_64 --nodeps [root@node3 ~]# rpm -qa|grep mariadb [root@node3 ~]#
-
安装mysql
mkdir /export/software/mysql #上传mysql-5.7.29-1.el7.x86_64.rpm-bundle.tar 到上述文件夹下 解压 tar xvf mysql-5.7.29-1.el7.x86_64.rpm-bundle.tar #执行安装依赖 yum -y install libaio [root@node3 mysql]# rpm -ivh mysql-community-common-5.7.29-1.el7.x86_64.rpm mysql-community-libs-5.7.29-1.el7.x86_64.rpm mysql-community-client-5.7.29-1.el7.x86_64.rpm mysql-community-server-5.7.29-1.el7.x86_64.rpm warning: mysql-community-common-5.7.29-1.el7.x86_64.rpm: Header V3 DSA/SHA1 Signature, key ID 5072e1f5: NOKEY Preparing... ################################# [100%] Updating / installing... 1:mysql-community-common-5.7.29-1.e################################# [ 25%] 2:mysql-community-libs-5.7.29-1.el7################################# [ 50%] 3:mysql-community-client-5.7.29-1.e################################# [ 75%] 4:mysql-community-server-5.7.29-1.e################ ( 49%)
-
mysql初始化设置
#初始化 mysqld --initialize #更改所属组 chown mysql:mysql /var/lib/mysql -R #启动mysql systemctl start mysqld.service #查看生成的临时root密码 cat /var/log/mysqld.log [Note] A temporary password is generated for root@localhost: o+TU+KDOm004
-
修改root密码 授权远程访问 设置开机自启动
[root@node2 ~]# mysql -u root -p Enter password: #这里输入在日志中生成的临时密码 Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 3 Server version: 5.7.29 Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> #更新root密码 设置为root mysql> alter user user() identified by "root"; Query OK, 0 rows affected (0.00 sec) #授权 mysql> use mysql; mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root' WITH GRANT OPTION; mysql> FLUSH PRIVILEGES; #mysql的启动和关闭 状态查看 (这几个命令必须记住) systemctl stop mysqld systemctl status mysqld systemctl start mysqld #建议设置为开机自启动服务 [root@node2 ~]# systemctl enable mysqld Created symlink from /etc/systemd/system/multi-user.target.wants/mysqld.service to /usr/lib/systemd/system/mysqld.service. #查看是否已经设置自启动成功 [root@node2 ~]# systemctl list-unit-files | grep mysqld mysqld.service enabled
补:干净卸载mysql 5.7
#关闭mysql服务 systemctl stop mysqld.service #查找安装mysql的rpm包 [root@node3 ~]# rpm -qa | grep -i mysql mysql-community-libs-5.7.29-1.el7.x86_64 mysql-community-common-5.7.29-1.el7.x86_64 mysql-community-client-5.7.29-1.el7.x86_64 mysql-community-server-5.7.29-1.el7.x86_64 #卸载 [root@node3 ~]# yum remove mysql-community-libs-5.7.29-1.el7.x86_64 mysql-community-common-5.7.29-1.el7.x86_64 mysql-community-client-5.7.29-1.el7.x86_64 mysql-community-server-5.7.29-1.el7.x86_64 #查看是否卸载干净 rpm -qa | grep -i mysql #查找mysql相关目录 删除 [root@node1 ~]# find / -name mysql /var/lib/mysql /var/lib/mysql/mysql /usr/share/mysql [root@node1 ~]# rm -rf /var/lib/mysql [root@node1 ~]# rm -rf /var/lib/mysql/mysql [root@node1 ~]# rm -rf /usr/share/mysql #删除默认配置 日志 rm -rf /etc/my.cnf rm -rf /var/log/mysqld.log
-
-
-
Linux软件安装–JDK
-
简单:解压即可使用 但是通常配置环境变量,以便于在各个路径下之间使用java。
-
要求:JDK1.8版本
-
步骤
#上传安装包到/export/server下 jdk-8u241-linux-x64.tar.gz #解压到当前目录 [root@node1 ~]# tar zxvf jdk-8u241-linux-x64.tar.gz #删除红色安装包(可选) [root@node1 ~]# rm -rf jdk-8u241-linux-x64.tar.gz #配置环境变量 [root@node1 ~]# vim /etc/profile #G + o export JAVA_HOME=/export/server/jdk1.8.0_65 export PATH=$PATH:$JAVA_HOME/bin export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar #重新价值环境变量文件 让配置生效 [root@node1 ~]# source /etc/profile [root@node1 ~]# java -version java version "1.8.0_241"
-
将node1的JDK安装包scp给其他机器
#scp安装包 cd /export/server/ scp -r jdk1.8.0_241/ root@node2:$PWD #scp环境变量文件 scp /etc/profile node2:/etc/cd #别忘了 其他机器source哦 source /etc/profile
-
三、linux中zookeeper安装
-
安装前提
- 服务器基础环境配置完成
- IP
- 主机名
- hosts映射
- 防火墙关闭
- 时间同步
- ssh免密登录
- JDK环境
- jdk1.8
- 服务器基础环境配置完成
-
上传并解压安装包
cd /export/server tar zxvf zookeeper-3.4.6.tar.gz mv zookeeper-3.4.6/ zookeeper
-
修改配置文件
-
zoo.cfg
#zk默认加载的配置文件是zoo.cfg 因此需要针对模板进行修改。保证名字正确。 cd zookeeper/conf mv zoo_sample.cfg zoo.cfg vi zoo.cfg #修改 dataDir=/export/data/zkdata #文件最后添加 2888心跳端口 3888选举端口 server.1=node1:2888:3888 server.2=node2:2888:3888 server.3=node3:2888:3888
-
myid
#在每台机器的dataDir指定的目录下创建一个文件 名字叫做myid #myid里面的数字就是该台机器上server编号。server.N N的数字就是编号 [root@node1 conf]# mkdir -p /export/data/zkdata [root@node1 conf]# echo 1 >/export/data/zkdata/myid
-
-
把安装包同步到其他服务器上
cd /export/server scp -r zookeeper/ node2:$PWD scp -r zookeeper/ node3:$PWD
-
创建其他机器上myid和datadir目录
[root@node2 ~]# mkdir -p /export/data/zkdata [root@node2 ~]# echo 2 > /export/data/zkdata/myid [root@node3 ~]# mkdir -p /export/data/zkdata [root@node3 ~]# echo 3 > /export/data/zkdata/myid
-
zookeeper–集群启停、进程查看、日志查看
-
每台机器单独启动
#在哪个目录执行启动命令 默认启动日志就生成当前路径下 叫做zookeeper.out /export/server/zookeeper/bin/zkServer.sh start|stop|status #3台机器启动完毕之后 可以使用status查看角色是否正常。 #还可以使用jps命令查看zk进程是否启动。 [root@node3 ~]# jps 2034 Jps 1980 QuorumPeerMain #看我,我就是zk的java进程
-
一键启动脚本(需要ssh免密登录)
[root@node1 ~]# vim startZk.sh #!/bin/bash hosts=(node1 node2 node3) for host in ${hosts[*]} do ssh $host "source /etc/profile;/export/server/zookeeper/bin/zkServer.sh start" done
- 启动java进程的时候 需要JDK。
- 因为shell程序ssh登录的时候不会自动加载/etc/profile 需要shell程序中自己加载。
-
-
一键关闭脚本(需要ssh免密登录)
[root@node1 ~]# vim stopZk.sh #!/bin/bash hosts=(node1 node2 node3) for host in ${hosts[*]} do ssh $host "/export/server/zookeeper/bin/zkServer.sh stop" done
- 注意:关闭java进程时候 根据进程号 直接杀死即可就可以关闭。
四、Hadoop基础框架搭建
-
源码编译
- 需要自己编译源码以适应自己所需要的环境和软件
-
集群规划
-
根据软件和硬件的特性,合理的安排各个角色在不同的机器上。
properties node1: namenode datanode | resourcemanager nodemanger node2: datanode secondarynamenode| nodemanger node3: datanode | nodemanger
-
扩容增加的角色
properties node4: datanode nodemanger node5: datanode nodemanger node6: datanode nodemanger .....
-
-
Hadoop-服务器基础环境准备
-
Hadoop-配置文件
文件位置:/export/server/hadoop-3.3.0/etc/hadoop
-
文件分类
- 第一类 1个 hadoop-env.sh
- 第二类 4个 core|hdfs|mapred|yarn-site.xml
-
core-site.xml 核心模块配置
-
hdfs-site.xml hdfs文件系统模块配置
-
mapred-site.xml MapReduce模块配置
-
yarn-site.xml yarn模块配置
-
- 第三类 1个 workers
-
文件配置
-
hadoop-env.sh
#java home (jdK版本要和自己装的对应) export JAVA_HOME=/export/server/jdk1.8.0_241 #Hadoop各个组件启动运行身份 export HDFS_NAMENODE_USER=root export HDFS_DATANODE_USER=root export HDFS_SECONDARYNAMENODE_USER=root export YARN_RESOURCEMANAGER_USER=root export YARN_NODEMANAGER_USER=root
-
core-site.xml
<!-- 设置默认使用的文件系统 Hadoop支持file、HDFS、GFS、ali|Amazon云等文件系统 --> <property> <name>fs.defaultFS</name> <value>hdfs://node1:8020</value> </property> <!-- 设置Hadoop本地保存数据路径 --> <property> <name>hadoop.tmp.dir</name> <value>/export/data/hadoop-3.3.0</value> </property> <!-- 设置HDFS web UI用户身份 --> <property> <name>hadoop.http.staticuser.user</name> <value>root</value> </property> <!-- 整合hive 用户代理设置 --> <property> <name>hadoop.proxyuser.root.hosts</name> <value>*</value> </property> <property> <name>hadoop.proxyuser.root.groups</name> <value>*</value> </property> <!-- 文件系统垃圾桶保存时间 单位:分 --> <property> <name>fs.trash.interval</name> <value>1440</value> </property>s
-
hdfs-site.xml
<!-- 设置SNN进程运行机器位置信息 --> <property> <name>dfs.namenode.secondary.http-address</name> <value>node2:9868</value> </property>
-
mapred-site.xml
<!-- 设置MR程序默认运行模式: yarn集群模式 local本地模式 --> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> <!-- MR程序历史服务器端地址 --> <property> <name>mapreduce.jobhistory.address</name> <value>node1:10020</value> </property> <!-- 历史服务器web端地址 --> <property> <name>mapreduce.jobhistory.webapp.address</name> <value>node1:19888</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>
-
yarn-site.xml
<!-- 设置YARN集群主角色运行机器位置 --> <property> <name>yarn.resourcemanager.hostname</name> <value>node1</value> </property> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <!-- 是否将对容器实施物理内存限制 --> <property> <name>yarn.nodemanager.pmem-check-enabled</name> <value>false</value> </property> <!-- 是否将对容器实施虚拟内存限制。 --> <property> <name>yarn.nodemanager.vmem-check-enabled</name> <value>false</value> </property> <!-- 开启日志聚集 --> <property> <name>yarn.log-aggregation-enable</name> <value>true</value> </property> <!-- 设置yarn历史服务器地址 --> <property> <name>yarn.log.server.url</name> <value>http://node1:19888/jobhistory/logs</value> </property> <!-- 日志保存的时间 7天 --> <property> <name>yarn.log-aggregation.retain-seconds</name> <value>604800</value> </property>
-
workers
node1.itcast.cn node2.itcast.cn node3.itcast.cn
-
-
-
Hadoop-scp同步、环境变量配置
-
Hadoop-namenode format操作
-
format准确来说翻译成为初始化比较好。对namenode工作目录、初始文件进行生成。
-
通常在namenode所在的机器执行 执行一次。首次启动之前
#在node1 部署namenode的这台机器上执行 hadoop namenode -format #执行成功 日志会有如下显示 21/05/23 15:38:19 INFO common.Storage: Storage directory /export/data/hadoopdata/dfs/name has been successfully formatted. [root@node1 server]# ll /export/data/hadoopdata/dfs/name/current/ total 16 -rw-r--r-- 1 root root 321 May 23 15:38 fsimage_0000000000000000000 -rw-r--r-- 1 root root 62 May 23 15:38 fsimage_0000000000000000000.md5 -rw-r--r-- 1 root root 2 May 23 15:38 seen_txid -rw-r--r-- 1 root root 207 May 23 15:38 VERSION
-
若不小心初始化多次
-
现象:主从之间互不识别
-
解决:
#学习环境 删除每台机器上hadoop.tmp.dir配置指定的文件夹/export/data/hadoop-3.3.0。 重新format。
-
-
-
Hadoop-集群启停-命令与状态日志查看
-
单节点单进程逐个手动启动
-
优点:精准的控制每个角色每个进程的启停。避免了群起群停(时间成本)
-
HDFS集群
#hadoop2.x版本命令 hadoop-daemon.sh start|stop namenode|datanode|secondarynamenode #hadoop3.x版本命令 hdfs --daemon start|stop namenode|datanode|secondarynamenode
-
YARN集群
#hadoop2.x版本命令 yarn-daemon.sh start|stop resourcemanager|nodemanager #hadoop3.x版本命令 yarn --daemon start|stop resourcemanager|nodemanager
-
-
脚本一键启动
-
前提:提前配置好ssh免密登录。
-
HDFS集群
start-dfs.sh stop-dfs.sh
-
YARN集群
start-yarn.sh stop-yarn.sh
-
一键启动/停止两个集群
start-all.sh stop-all.sh [root@node1 ~]# start-all.sh This script is Deprecated. Instead use start-dfs.sh and start-yarn.sh
-
错误排查
# 确认是否成功 [root@node1 ~]# jps 8000 DataNode 8371 NodeManager 8692 Jps 8264 ResourceManager 7865 NameNode
-
若进程不存在,则看启动日志!!
#默认情况下 日志目录 cd /export/server/hadoop-3.3.0/logs/ #注意找到对应进程名字 以log结尾的文件
-
-
-
-
Hadoop-Web UI页面
- HDFS集群:http://node1:9870/explorer.html#/
- YARN集群:http://node1:8088/cluster
-
Hadoop–jobhistory服务配置与功能
-
目的:保存yarn上已经完成的MapReduce的执行信息。
-
配置(配置好重启后才能生效)
vim mapred-site.xml <property> <name>mapreduce.jobhistory.address</name> <value>node1:10020</value> </property> <property> <name>mapreduce.jobhistory.webapp.address</name> <value>node1:19888</value> </property>
- 配置完一台机器后使用scp同步给其他服务器
-
手动启停jobhistory服务
#hadoop2.x版本命令 mr-jobhistory-daemon.sh start|stop historyserver #hadoop3.x版本命令 mapred --daemon start|stop historyserver [root@node1 ~]# jps 13794 JobHistoryServer 13060 DataNode 12922 NameNode 13436 NodeManager 13836 Jps 13327 ResourceManager
-
每次开机需要手动启动
-
-
Hadoop–HDFS垃圾桶机制
-
类似于windows的回收站
-
本质:HDFS中的一个隐藏目录
-
功能:在删除数据的时候 先去垃圾桶 如果后悔可以复原。
-
配置:
在core-site.xml中开启垃圾桶机制 指定保存在垃圾桶的时间。单位分钟 <property> <name>fs.trash.interval</name> <value>1440</value> </property>
-
集群同步配置 重启hadoop服务。
[root@node1 hadoop]# pwd /export/server/hadoop-3.3.0/etc/hadoop [root@node1 hadoop]# scp core-site.xml node2:$PWD core-site.xml 100% 1027 898.7KB/s 00:00 [root@node1 hadoop]# scp core-site.xml node3:$PWD core-site.xml
-
使用
# 普通的rm删除会放到hdfs的垃圾桶中 hadoop fs -rm /文件位置 # 直接删除文件(跳过垃圾桶) hadoop fs -rm -skipTrash /文件位置
-