【Hadoop】一、Hadoop入门:基础配置、集群配置、常用脚本
基础设置
网络设置
创建好一个 centos 虚拟机,修改网络配置文件:
/etc/sysconfig/network-scripts/ifcfg-ens33
修改 BOOTPROTO 为 static
以及添加 IPADDR、GATEWAY、DNS1
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="896ed56e-1848-44a7-98ed-244ebc978e1c"
DEVICE="ens33"
ONBOOT="yes"
IPADDR=192.168.202.142
GATEWAY=192.168.202.1
DNS1=192.168.202.1
修改主机名称:
/etc/hostname
修改为 hadoop100
在主机名映射文件中添加映射
/etc/hosts
192.168.202.142 hadoop100
192.168.202.143 hadoop101
192.168.202.144 hadoop102
192.168.202.145 hadoop103
192.168.202.146 hadoop104
192.168.202.147 hadoop105
192.168.202.148 hadoop106
192.168.202.149 hadoop107
192.168.202.150 hadoop108
关闭防火墙
systemctl status firewalld
systemctl stop firewalld
systemctl disable firewalld.service
之后检查 ifconfgi 中 ens33 的ip、hostname、ping www.baidu.com 进行检查,都通过则证明网络配置成功
文件设置
配置用户 root 权限:
打开
/etc/sudoers
并在这个位置这样配:
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
hadoop ALL=(ALL) NOPASSWD:ALL
之后我们在 hadoop 用户下面的 sudo 指令就会生效
切换到 opt 目录
sudo rm -rf rh
在 opt 目录下进行后续操作:
创建两个目录module 用于存放安装包、software 用与存放软件
sudo mkdir -p module
sudo mkdir -p software
现在我们创建的这两个文件是属于 root 的,所以我们要修改这两个目录的归属:
sudo chown hadoop:hadoop module
sudo chown hadoop:hadoop software
将这两个目录的归属全部改为 hadoop(自己的用户)
之后我们需要将自带的 jdk 删除:
rpm -qa | grep -i java | xargs -n1 rpm -e --nodeps
注意这句话的前半句话意思是找到所有文件名带有 java 的文件,后半句话是依次独立删除
注意这个操作必须在 root 的场景下进行
-
虚拟机克隆:注意克隆完整虚拟机
克隆三台虚拟机,之后修改其 网络配置文件中的 ip 地址和主机名
JDK与Hadoop的安装
hadoop下载地址:
https://archive.apache.org/dist/hadoop/common/hadoop-3.1.3/
将下载好的文件发送到虚拟机的 /opt/software 路径中
将 JDK 压缩包解压到 module 目录下,同时配置环境变量
环境变量位置的配置,我们的常用做法是在 /etc/profile 下进行配置,但是此处我们选择在 /etc/profile.d 目录下新建 .sh 文件的方式进行配置,这样也可以配置的原因是 /etc/profile 文件中声明了遍历 /etc/profile.d 目录中所有以 .sh 结尾的文件,将其所有的文件都遍历执行一遍
在 /etc/profile.d 目录中创建:
my_env.sh
#JAVA_ENV
export JAVA_HOME=/opt/module/jdk1.8.0_212
export PATH=$JAVA_HOME/bin
之后还是需要进行 source 操作 就可以使用 java -version 看到 jdk 版本了
解压 Hadoop 到 module 目录,之后同样在 my_env.sh 上配置环境变量,注意 hadoop 的环境变量需要配置 /bin 和 /sbin
# BASE_PATH
export PATH=/bin:/usr/bin:$PATH
#JAVA_ENV
export JAVA_HOME=/opt/module/jdk1.8.0_212
export PATH=$PATH:$JAVA_HOME/bin
# HADOOP
export HADOOP_HOME=/opt/module/hadoop-3.1.3
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
配置好 hadoop 之后,文件应该是上面这样
-
hadoop基础文件结构介绍
hadoop 文件中 bin 目录中存放hadoop中可执行的许多命令,例如:hdfs、yarn、mapred 等
etc/hadoop 目录中存放配置文件信息,关键的配置文件信息有:core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml
sbin 目录中存放的是 我们需要使用到的一些命令:例如 start-all.sh 这种
-
分布式介绍
本地分布式:仅用于测试,数据存储在本地
伪分布式:仅有一台服务器,假装是很多台服务器,数据存储在 HDFS
完全分布式:有很多服务器,数据分布式存储在多台服务器上,是标准的分布式
wordcount 案例测试:
随意新建一个 txt 里面补充一些单词
之后像下面这样执行就可以尝试进行一个大数据计算
bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount wcinput wcoutput
后面的wcoutput 是输出文件夹,要求这个输出文件夹不存在,里面会生成两个文件,cat 其中一个文件就可以看到结果,另一个文件是成功或者失败的标识。
使用SCP 命令编写集群文件分发脚本
首先保证目录是创建好的
之后使用下面的命令将 102 中的文件传入 自己,自己传给别人,别人传给别人
scp -r /opt/module/jdk1.8.0_212/ hadoop@hadoop102:/opt/module
scp -r hadoop@hadoop102:/opt/module/jdk1.8.0_212 /opt/module
scp -r hadoop@hadoop102:/opt/module/hadoop-3.1.3 hadoop@hadoop104:/opt/module
但是如果我们不需要全部复制,而是需要同步文件内容,比如说有某个文件修改了,就可以使用同步命令进行修正:rsync…(注意:第一次同步等同于拷贝)具体用法和远程同步的方法和 scp 命令一致
rsync -av /from /to
但要注意 rsync 要求目的地和出发地不能都是远程连接
-
我们创建一个脚本(在 ~/bin 下创建),实现同步两台机器上的文件内容,致使文件内容的同步,同时实现配置环境变量以达到在任意位置都可以使用
#!/bin/bash # 检查是否至少有一个参数传递给脚本 if [ "$#" -lt 1 ]; then echo "Not Enough Argument!" exit 1 # 通常使用非零值来表示异常退出 fi # 遍历所有集群中的机器 for host in hadoop102 hadoop103 hadoop104 do echo "=================== $host ===================" # 遍历所有目录,挨个发送 for file in $@ do if [ -e $file ]; then # 获取父目录 pdir=$(cd -P $(dirname $file); pwd) # 获取当前文件名称 fname=$(basename $file) ssh $host "mkdir -p $pdir" rsync -av $pdir/$fname $host:$pdir else echo "$file does not exists" fi done done
这个脚本这样子就实现了 xsync from 直接在另两台机器上的对应位置直接进行同步的操作】
接下来,就使用这个脚本来同步环境变量信息 /etc/profile.d/my-env.sh
sudo ./xsync /etc/profile.d/my_env.sh
之后就同步完成了
配置 ssh 免密登录
我们为三台机器实现免密登录
在家目录中键入下面的命令可以生成一个密钥对,这个密钥对存储在 .ssh 文件夹中,公钥为 id_rsa.pub 这个公钥是要发送到所有主机的(保存在 连接目的地主机的 authorized 文件中),id_rsa 则为私钥,私钥自己保存
ssh-keygen -t rsa
之后进行公钥的拷贝(注意自己也要拷贝):
ssh-copy-id hadoop102
ssh-copy-id hadoop103
ssh-copy-id hadoop104
对三台机器都这样进行操作,就可以实现三台机器的相互免密登录
注意,这里的免密登录是针对于 用户的,也就是说,这个登录在 root 上也需要再配置一遍
集群配置
集群结构:
Hadoop 集群结构:
- hadoop102:
- HDFS:NameNode、DataNode
- YARN:NodeManager
- hadoop103:
- HDFS:DataNode
- YARN:ResourceManager、NodeManager
- hadoop104:
- HDFS:SecondaryNameNode、DataNode
- YARN:NodeManager
配置 core-site.xml:
这里第一个是 hadoop 的对内数据传输暴露地址,第二个是hadoop数据文件的存储地址
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop102:8020</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop-3.1.3/data</value>
</property>
</configuration>
配置 hdfs-site.xml:
这里的两个配置分别是 hadoop外部访问地址和secondarynamenode的地址:
<configuration>
<property>
<name>dfs.namenode.http-address</name>
<value>hadoop102:9870</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop104:9868</value>
</property>
</configuration>
配置 yarn-site.xml:
第一个是建议的配置、第二个是 resourcemanager的地址、第三个是环境变量白名单
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop103</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 令 mapreduce在yarn 上运行
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
之后进行分发:
xsync /opt/module/hadoop-3.1.3/etc/hadoop
workers的配置:只有配置了 workers,我们的启动命令才能够找到正确的服务器地址进行启动
/opt/module/hadoop-3.1.3/etc/hadoop/workers
hadoop102
hadoop103
hadoop104
之后进行分发
xsync workers
初始化,只有第一次启动需要初始化
hdfs namenode -format
初始化完毕后,hadoop-3.1.3 中会多出两个文件,分别是 data 和 logs
此时我们使用:
.../sbin/start-dfs.sh
就可以启动集群的hadoop服务了,这里启动之后只会启动 hadoop相关的服务:
NameNode、DataNode 和 SecondaryNameNode
此时还差 ResourceManager、NodeManager,这个需要我们在 103服务器中使用
.../sbin/start-yarn.sh
命令进行启动
此时我们可以打开两个页面,一个是 hdfs 的文件管理界面,另一个是yarn的资源调度界面:
hadoop102:9870
hadoop103:8088
集群基本测试
创建目录
hadoop fs -mkdir /wcinput
我们将 wordcount 上传
hadoop fs -put wcinput/test.txt /wcinput
之后,我们可以在前端展示界面找到我们的文件,这个文件的真实存储是存在于 hadoop的 data目录内的,其原路径是:/data/dfs/data/current/xxxxxx/current/finalized/subdir0/subdir0 小文件会存储在一块中,大文件会存储在多块中,我们可以使利用 cat xxx >> tmp.tar.gz 的方式来追加,从而实现拼接处源文件的效果,但这只是一个尝试,正常不会这么做。
注意,在默认情况下,我们上传上去的数据会被复制两份,共计三份存储在不同的服务器上
此时,我们运行一下 wordcount 程序尝试一下,注意这里的所有操作都是基于 HDFS 文件系统的
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /wcinput /output
此时程序正常运行
-
注意此处:若集群因为配置失败或操作不当删除导致集群无法启动
应先关闭集群:sbin/stop-dfs.sh、sbin/stop-yarn.sh
之后删除每个集群上的 data 和 logs 命令,然后初始化:hdfs namenode -format
之后再启动就可以了,但是这样会删除历史记录。
-
此时还有一个问题需要注意,就是此处执行的任务无法保存,无法在历史中查看,这是我们必要的功能,所以我们进一步进行配置:
我们 配置 mapred-site.xml 文件:
添加如下配置,上面是内部通信地址,下面是web页面展示地址
<property> <name>mapreduce.jobhistory.address</name> <value>hadoop102:10020</value> </property> <property> <name>mapreduce.jobhistory.webapp.address</name> <value>hadoop102:19888</value> </property>
之后我们使用如下指令启动历史服务:
bin/mapred --daemon start historyserver
之后就可以通过 jps 看到启动了jobHistoryServer 服务
关闭指令:
bin/mapred --daemon stop historyserver
-
配置日志
在 yarn-site.xml 中进行日志功能的配置,注意日志需要集成在 jobhistory对应的端口,并且只需要保存七天
配置分别是:开启日志聚集、对应日志端口、保存时间
<property> <name>yarn.log-aggregation-enable</name> <value>true</value> </property> <property> <name>yarn.log.server.url</name> <value>http://hadoop102:19888/jobhistory/logs</value> </property> <property> <name>yarn.log-aggregation.retain-seconds</name> <value>604800</value> </property>
之后记得分发重启就可以实现日志操作啦
-
对于Manager的服务:
yarn --daemon start/stop xxxxmanager
对于 node 的服务
hdfs --daemon start/stop xxx
这两个命令可以实现单个服务的启停
服务一键启停脚本和jps全部脚本
一键启停脚本(myhadoop.sh):
记得要添加权限以允许所有用户都执行脚本
chmod 777 myhadoop.sh
#!/bin/bash
if [ $# -lt 1 ]
then
echo "No Args Input..."
exit ;
fi
case $1 in
"start")
echo " ========== 启动 hadoop 集群 ========== "
echo " ---------- 启动 hdfs ---------- "
ssh hadoop102 "/opt/module/hadoop-3.1.3/sbin/start-dfs.sh"
echo " ---------- 启动 yarn ----------"
ssh hadoop103 "/opt/module/hadoop-3.1.3/sbin/start-yarn.sh"
echo " ---------- 启动 historyserver ---------- "
ssh hadoop102 "/opt/module/hadoop-3.1.3/bin/mapred --daemon start historyserver"
;;
"stop")
echo " ========== 关闭 hadoop 集群 ========== "
echo " ---------- 关闭 historyserver ----------"
ssh hadoop102 "/opt/module/hadoop-3.1.3/bin/mapred --daemon stop historyserver"
echo " ---------- 关闭 yarn ----------"
ssh hadoop103 "/opt/module/hadoop-3.1.3/sbin/stop-yarn.sh"
echo " ---------- 关闭 hdfs ---------- "
ssh hadoop102 "/opt/module/hadoop-3.1.3/sbin/stop-dfs.sh"
;;
*)
echo "Input Args Error..."
;;
esac
chmod 777 jpsall
jps集群脚本(jpsall):
#!/bin/bash
for host in hadoop102 hadoop103 hadoop104
do
echo ========== $host =========
ssh $host jps
done
同样,两个脚本都放在 ~/bin 中
如果需要的话,也可以使用 xsync 进行分发来让所有集群都使用到这两个脚本
其他问题
-
hadoop 常用端口号
HDFS Namenode 内部端口:8020/9000/9820
HDFS Namenode 对外暴露端口:9870
Yarn 查看任务运行情况端口:8088
历史服务器查看端口:19888
时间同步
使用 ntpd 服务实现时间同步功能
在 hadoop102 中进行时间服务的配置
systemctl status ntpd
systemctl start ntpd
systemctl is-enabled ntpd # 自启动情况
之后进行时间服务器配置的修改:
sudo vim /etc/ntp.conf
修改几项:
-
打开 restrict 192.168.xx.0 mask 255.255.255.0 nomodify notrap 的注释,这代表允许所有在 192.168.xx.0 网段的服务器访问自己
-
之后注释掉 server 0、server 1、server 2、server 3 这四行,这代表从互联网获取时间信息,若我们是公网服务器,则无需进行修改
-
在文件最末尾添加如下信息:
server 127.127.1.0 fudge 127.127.1.0 stratum 10
这段代码允许当丢失网络连接时依然使用本地服务器作为集群中心为其他节点提供时间同步
-
之后配置硬件时间信息:
在末尾添加
sudo vim /etc/sysconfig/ntpd SYNC_HWCLOCK=yes
-
之后我们先关闭所有节点上的 ntpd 服务并关闭其自启动,这是为了避免一会在配置的时候出现外网和内网交替同步的乱象
sudo systemctl stop ntpd sudo systemctl disable ntpd
-
在其他机器上配置时间同步机制:一分钟同步一次
sudo crontab -e
之后进行编写定时同步
在编辑crontab文件时,你可以添加新的计划任务或者修改现有的计划任务。每一行都代表一个计划任务,格式如下: 0 3 * * * /path/to/command */1 * * * * /usr/sbin/ntpdate hadoop102
-
之后我们可以进行测试,输入 date 可以查看系统时间
sudo date -s "2015-6-5 11:11:15"
这样调整系统时间之后,我们过一分钟就会自动将时间同步
注意在修改完之后,这子服务器的 ntpd 是关闭的状态,时间服务器的 ntpd 是启用的状态
ENS33 消失的处理方式
systemctl stop NetworkManager #关闭NetworkManager
systemctl disable NetworkManager #开机禁用NetworkManager
systemctl start network.service #开启网卡
service network restart #重启网卡
添加用户展示页面的操作权限
在正常情况下,hdfs 页面只有展示查询权限,是没有修改和删除权限的,基于这种情况,我们可以在 core-site.xml 中添加配置来添加用户的查询权限:
<property>
<name>hadoop.http.staticuser.user</name>
<value>hadoop</value>
</property>