Hadoop 组成
HDFS 架构
NameNode(nn)
存储文件的元数据,如文件名、文件目录结构、文件属性(生成时间、副本数、文件权限),以及每个文件的块列表和块所在的DataNode
等。DataNode(dn)
在本地文件系统存储文件快数据,以及块数据的校验和。Secondary NameNode(2nn)
用来监控HDFS
状态的辅助后台程序,每隔一段时间获取HDFS
元数据的快照。
YARN 架构
ResouceManager(RM)
- 处理客户端请求
- 监控
NodeManager
- 启动或监控
ApplicationMaster
- 资源的分配与调度
NodeManager(NM)
- 管理单个节点上的资源
- 处理来自
ResouceManager
的命令 - 处理来自
ApplicationMaster
的命令
ApplicationMaster(AM)
- 负责数据的切分
- 为应用程序申请资源并分配给内部的任务
- 任务的监控与容错
Container
- 是
YARN
中的资源抽象,封装了某个节点上的多维度资源,如内存、CPU、磁盘、网络等
- 是
MapReduce 架构
Map
阶段并行处理输入数据Reduce
阶段对Map
结果进行汇总
生态体系
配置环境
使用 sudo vim /etc/sysconfig/network-scripts/ifcfg-eth0
配置网络:
DEVICE=eth0
HWADDR=你的MAC地址
TYPE=Ethernet
UUID=
ONBOOT=yes # 开机启动
NM_CONTROLLED=yes
BOOTPROTO=static # 方式
IPADDR=你的ip地址
GATEWAY=网关地址
DNS1=dns地址
使用 sudo vim /etc/sysconfig/network
配置 HOSTNAME
:
NETWORKING=yes
HOSTNAME=你的hostname
如果是使用 VM 克隆出的虚拟机,则需要修改 MAC 地址对应的 IP 地址:
使用 sudo vim /etc/udev/rules.d/70-persistent-net.rules
复制当前的 MAC 地址:
将 MAC 地址复制到上面的 ifcfg-eth0
文件的 HWADDR
后面
使用 sudo vim /etc/hosts
将当前虚拟机的 hostname
映射到 ip地址上:
创建一个普通用户,然后使用 root 用户sudo vim /etc/sudoers
给普通用户 sudo 的权限:
在 /opt
目录下创建两个目录并修改所属用户和组,然后将 jdk 和 hadoop 文件导入至 software 文件夹:
[jkfx@hadoop101 ~]$ cd /opt
[jkfx@hadoop101 opt]$ sudo mkdir module
[sudo] password for jkfx:
[jkfx@hadoop101 opt]$ sudo mkdir software
[jkfx@hadoop101 opt]$ ll
总用量 12
drwxr-xr-x. 2 root root 4096 10月 16 10:38 module
drwxr-xr-x. 2 root root 4096 10月 4 2017 rh
drwxr-xr-x. 2 root root 4096 10月 16 10:38 software
[jkfx@hadoop101 opt]$ sudo rm -rf rh
[jkfx@hadoop101 opt]$ ll
总用量 8
drwxr-xr-x. 2 root root 4096 10月 16 10:38 module
drwxr-xr-x. 2 root root 4096 10月 16 10:38 software
[jkfx@hadoop101 opt]$ sudo chown jkfx:jkfx module/ software/
[jkfx@hadoop101 opt]$ cd software/
[jkfx@hadoop101 software]$ ls
hadoop-2.7.2.tar.gz jdk-8u241-linux-x64.tar.gz
将 jdk 压缩至 module 文件夹下然后在 /etc/profile
文件配置 jdk 的目录和 PATH 环境变量:
[jkfx@hadoop101 software]$ ls
hadoop-2.7.2.tar.gz jdk-8u241-linux-x64.tar.gz
[jkfx@hadoop101 software]$ tar -zxf jdk-8u241-linux-x64.tar.gz -C /opt/module/
[jkfx@hadoop101 software]$ cd ../module/jdk1.8.0_241/
[jkfx@hadoop101 jdk1.8.0_241]$ pwd
/opt/module/jdk1.8.0_241
[jkfx@hadoop101 jdk1.8.0_241]$ sudo vim /etc/profile
[jkfx@hadoop101 jdk1.8.0_241]$ tail /etc/profile -n 5
## JAVA_HOME
export JAVA_HOME=/opt/module/jdk1.8.0_241
export PATH=$PATH:$JAVA_HOME/bin
[jkfx@hadoop101 jdk1.8.0_241]$ source /etc/profile
[jkfx@hadoop101 jdk1.8.0_241]$ java -version
java version "1.8.0_241"
Java(TM) SE Runtime Environment (build 1.8.0_241-b07)
Java HotSpot(TM) 64-Bit Server VM (build 25.241-b07, mixed mode)
将 hadoop 压缩文件压缩至 module 文件夹下再次配置 /etc/profile
文件:
[jkfx@hadoop101 software]$ ls
hadoop-2.7.2.tar.gz jdk-8u241-linux-x64.tar.gz
[jkfx@hadoop101 software]$ tar -zxf hadoop-2.7.2.tar.gz -C /opt/module/
[jkfx@hadoop101 software]$ cd ../module/hadoop-2.7.2/
[jkfx@hadoop101 hadoop-2.7.2]$ pwd
/opt/module/hadoop-2.7.2
[jkfx@hadoop101 hadoop-2.7.2]$ sudo vim /etc/profile
[jkfx@hadoop101 hadoop-2.7.2]$ tail /etc/profile -n 4
export HADOOP_HOME=/opt/module/hadoop-2.7.2
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
[jkfx@hadoop101 hadoop-2.7.2]$ source /etc/profile
[jkfx@hadoop101 hadoop-2.7.2]$ hadoop version
Hadoop 2.7.2
Hadoop 目录结构
本地模式
- Local (Standalone) Mode
- Pseudo-Distributed Mode
- Fully-Distributed Mode
Grep 案例
By default, Hadoop is configured to run in a non-distributed mode, as a single Java process. This is useful for debugging.
The following example copies the unpacked conf directory to use as input and then finds and displays every match of the given regular expression. Output is written to the given output directory.
$ mkdir input
$ cp etc/hadoop/*.xml input
$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.2.1.jar grep input output 'dfs[a-z.]+'
$ cat output/*
到 output
文件夹下查看输出结果:
WordCount 案例
[jkfx@hadoop101 hadoop-2.7.2]$ mkdir wcinput
[jkfx@hadoop101 hadoop-2.7.2]$ cd wcinput/
[jkfx@hadoop101 wcinput]$ vim wc.input
[jkfx@hadoop101 wcinput]$ cat wc.input
hadoop yarn
hadoop spark hive hbase
hadoop hdfs
hadoop mapreduce
hadoop
jkfx
jkfx
[jkfx@hadoop101 wcinput]$ cd ..
[jkfx@hadoop101 hadoop-2.7.2]$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount wcinput wcoutput
然后到 wcoutput 目录下查看运行结果:
[jkfx@hadoop101 hadoop-2.7.2]$ cd wcoutput/
[jkfx@hadoop101 wcoutput]$ ll
总用量 4
-rw-r--r--. 1 jkfx jkfx 65 10月 16 11:40 part-r-00000
-rw-r--r--. 1 jkfx jkfx 0 10月 16 11:40 _SUCCESS
[jkfx@hadoop101 wcoutput]$ cat part-r-00000
hadoop 5
hbase 1
hdfs 1
hive 1
jkfx 2
mapreduce 1
spark 1
yarn 1
即可查看到输出文件中的单词计数的结果
伪分布式模式
- Local (Standalone) Mode
- Pseudo-Distributed Mode
- Fully-Distributed Mode
启动 HDFS 并运行 MapReduce 程序
配置集群
首先 hadoop-env.sh
文件下的 JAVA_HOME
变量,将默认的 ${JAVA_HOME}
修改为绝对路径:
配置 core-site.xml
文件为:
<!-- 指定HDFS中NameNode的地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop101:9000</value>
</property>
<!-- 指定Hadoop运行时产生文件的存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop-2.7.2/data/tmp</value>
</property>
配置 hdfs-site.xml
文件:
<!-- 指定HDFS副本的数量 -->
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
启动集群
首先需要使用 bin/hdfs namenode -format
对 NameNode
进行格式化
然后使用 sbin/hadoop-daemon.sh start namenode
启动 NameNode
使用 sbin/hadoop-daemon.sh start datanode
[jkfx@hadoop101 hadoop-2.7.2]$ hadoop-daemon.sh start namenode
starting namenode, logging to /opt/module/hadoop-2.7.2/logs/hadoop-jkfx-namenode-hadoop101.out
[jkfx@hadoop101 hadoop-2.7.2]$ jps
2800 NameNode
2869 Jps
[jkfx@hadoop101 hadoop-2.7.2]$ hadoop-daemon.sh start datanode
starting datanode, logging to /opt/module/hadoop-2.7.2/logs/hadoop-jkfx-datanode-hadoop101.out
[jkfx@hadoop101 hadoop-2.7.2]$ jps
2800 NameNode
2901 DataNode
2975 Jps
可以使用 jps
命令查看进程是否启动
jps
是 JDK 的命令,使用之前应该正确安装 JDK
然后在 web 端访问地址:http://hadoop101:50070/dfshealth.html#tab-overview
如果无法正常访问,可以查看 Linux 系统的防火墙状态,将其关闭:
service iptables status # 查看防火墙状态
sertive iptables stop # 关闭防火墙
chkconfig iptables off # 设置开机不启动防火墙
可以在 logs
目录下查看产生的 Log 日志:
[jkfx@hadoop101 hadoop-2.7.2]$ ll logs/
总用量 152
-rw-rw-r--. 1 jkfx jkfx 61880 10月 18 11:08 hadoop-jkfx-datanode-hadoop101.log
-rw-rw-r--. 1 jkfx jkfx 715 10月 18 11:08 hadoop-jkfx-datanode-hadoop101.out
-rw-rw-r--. 1 jkfx jkfx 715 10月 18 11:05 hadoop-jkfx-datanode-hadoop101.out.1
-rw-rw-r--. 1 jkfx jkfx 715 10月 18 11:02 hadoop-jkfx-datanode-hadoop101.out.2
-rw-rw-r--. 1 jkfx jkfx 59394 10月 18 11:21 hadoop-jkfx-namenode-hadoop101.log
-rw-rw-r--. 1 jkfx jkfx 5007 10月 18 11:21 hadoop-jkfx-namenode-hadoop101.out
-rw-rw-r--. 1 jkfx jkfx 715 10月 18 11:04 hadoop-jkfx-namenode-hadoop101.out.1
-rw-rw-r--. 1 jkfx jkfx 715 10月 18 11:02 hadoop-jkfx-namenode-hadoop101.out.2
-rw-rw-r--. 1 jkfx jkfx 0 10月 18 11:02 SecurityAuth-jkfx.audit
[jkfx@hadoop101 hadoop-2.7.2]$ head logs/hadoop-jkfx-namenode-hadoop101.log
2020-10-18 11:02:03,477 INFO org.apache.hadoop.hdfs.server.namenode.NameNode: STARTUP_MSG:
/************************************************************
STARTUP_MSG: Starting NameNode
STARTUP_MSG: host = hadoop101/192.168.106.101
STARTUP_MSG: args = []
STARTUP_MSG: version = 2.7.2
如果需要第二次格式化,则需要先使用 jps
查看 NameNode
和 DataNode
进程是否还在运行,应该将其关闭,然后将 tmp
和 logs
的目录删除,然后再进行格式化
为什么不要总是格式化
NamoNode
?
格式化NameNode
,会产生新的集群id
,导致NameNode
和DataNode
的集群id
不一致,集群找不到已往数据。所以,格式NameNode
时,一定要先删除data
数据和log
日志,然后再格式化NameNode
可以查看 NameNode
和 DataNode
的集群 id:
[jkfx@hadoop101 hadoop-2.7.2]$ cd data/tmp/dfs/
[jkfx@hadoop101 dfs]$ ll
总用量 8
drwx------. 3 jkfx jkfx 4096 10月 18 11:08 data
drwxrwxr-x. 3 jkfx jkfx 4096 10月 18 11:13 name
[jkfx@hadoop101 dfs]$ cat name/current/VERSION
#Sun Oct 18 11:13:37 CST 2020
namespaceID=1127195070
clusterID=CID-cb738158-9d00-4d9d-a3f8-6832bccc6a48
cTime=0
storageType=NAME_NODE
blockpoolID=BP-1827602297-192.168.106.101-1602990817201
layoutVersion=-63
[jkfx@hadoop101 dfs]$ cat data/current/VERSION
#Sun Oct 18 11:08:47 CST 2020
storageID=DS-28e4f9e6-9cf2-43d8-b6f1-c51e1b1c03ef
clusterID=CID-2d242b98-a0bf-4c72-b642-5591d0150769
cTime=0
datanodeUuid=8750d6f9-0099-41cc-b7f5-98b1d550b254
storageType=DATA_NODE
layoutVersion=-56
NameNode
和 DataNode
的 clusterID
必须一样,否则将不会正常启动
操作集群
在 HDFS
文件系统上创建一个 input 文件夹: bin/hdfs dfs -mkdir -p /user/jkfx/input
将测试文件上传到文件系统: bin/hdfs dfs -put wcinput/wc.input /user/jkfx/input
查看 HDFS
文件系统:
也可以不在 web 端查看文件,在服务器端可以直接查看 HDFS
中的内容:
[jkfx@hadoop101 hadoop-2.7.2]$ hdfs dfs -cat /user/jkfx/input/wc.input
hadoop yarn
hadoop spark hive hbase
hadoop hdfs
hadoop mapreduce
hadoop
jkfx
jkfx
运行 MapReduce 程序并查看运行结果:
[jkfx@hadoop101 hadoop-2.7.2]$ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount /user/jkfx/input/wc.input /user/jkfx/output
[jkfx@hadoop101 hadoop-2.7.2]$ hdfs dfs -cat /user/jkfx/output/*
hadoop 5
hbase 1
hdfs 1
hive 1
jkfx 2
mapreduce 1
spark 1
yarn 1
Note: 在这里执行的 MapReduce 程序的输入和输出目录不再是服务器本地的路径,而是
HDFS
文件系统的路径
也可以在 web 端查看运行结果:
启动 YARN 并运行 MapReduce 程序
配置集群
首先配置 yarn-env.sh
中的 JAVA_HOME
将注释符号去除并且修改成 JDK 的路径:
配置 yarn-site.xml
:
<configuration>
<!-- Reducer获取数据的方式 -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 指定YARN的ResourceManager的地址 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop101</value>
</property>
</configuration>
配置 mapred-env.sh
中的 JAVA_HOME
值:
配置 mapred-site.xml
:
这里将 mapred-site.xml.template
重命名为 mapred-site.xml
然后配置 MapReduce
程序运行在 YARN
上,默认是 local
:
<configuration>
<!-- 指定MR运行在YARN上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
启动集群
启动前需要保证 NameNode
和 DataNode
已经启动
使用 ./sbin/yarn-daemon.sh start resourcemanager
启动 ResourceManager
:c
使用 ./sbin/yarn-daemon.sh start nodemanager
启动 NodeManager
:
集群操作
通过浏览器打开 http://hadoop101:8088 查看:
使用 ./bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount /user/jkfx/input /user/jkfx/output
执行 MapReduce
程序:
可以在浏览器查看运行情况:
配置历史服务器
为了查看程序的历史运行情况,需要配置一下历史服务器
首先配置 mapred-site.xml
:
<!-- 历史服务器端地址 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop101:10020</value>
</property>
<!-- 历史服务器web端地址 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop101:19888</value>
</property>
然后可以使用 ./sbin/mr-jobhistory-deamon.sh start historyserver
直接启动历史服务器
可以使用 jps
查看服务器进程是否启动
[jkfx@hadoop101 hadoop-2.7.2]$ vim etc/hadoop/mapred-site.xml
[jkfx@hadoop101 hadoop-2.7.2]$ ./sbin/mr-jobhistory-daemon.sh start historyserver
starting historyserver, logging to /opt/module/hadoop-2.7.2/logs/mapred-jkfx-historyserver-hadoop101.out
[jkfx@hadoop101 hadoop-2.7.2]$ jps
2913 NameNode
3862 NodeManager
4472 JobHistoryServer
3609 ResourceManager
4510 Jps
3007 DataNode
然后进入到了历史服务器的 web 界面:
配置日志聚集
日志聚集概念:应用运行完成以后,将程序运行日志信息上传到HDFS系统上。
日志聚集功能好处:可以方便的查看到程序运行详情,方便开发调试。
注意:开启日志聚集功能,需要重新启动 NodeManager
、 ResourceManager
和 HistoryManager
。
首先配置 yarn-site.xml
:
<!-- 日志聚集功能使能 -->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!-- 日志保留时间设置7天 -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
关闭并重新启动 NodeManager
/ ResourceManager
/ JobHistoryServer
[jkfx@hadoop101 hadoop-2.7.2]$ vim etc/hadoop/yarn-site.xml
[jkfx@hadoop101 hadoop-2.7.2]$ jps
2913 NameNode
3862 NodeManager
4472 JobHistoryServer
3609 ResourceManager
27370 Jps
3007 DataNode
[jkfx@hadoop101 hadoop-2.7.2]$ ./sbin/yarn-daemon.sh stop nodemanager
stopping nodemanager
nodemanager did not stop gracefully after 5 seconds: killing with kill -9
[jkfx@hadoop101 hadoop-2.7.2]$ jps
27408 Jps
2913 NameNode
4472 JobHistoryServer
3609 ResourceManager
3007 DataNode
[jkfx@hadoop101 hadoop-2.7.2]$ ./sbin/yarn-daemon.sh stop resourcemanager
stopping resourcemanager
[jkfx@hadoop101 hadoop-2.7.2]$ jps
2913 NameNode
27444 Jps
4472 JobHistoryServer
3007 DataNode
[jkfx@hadoop101 hadoop-2.7.2]$ ./sbin/mr-jobhistory-daemon.sh stop historyserver
stopping historyserver
[jkfx@hadoop101 hadoop-2.7.2]$ jps
2913 NameNode
27484 Jps
3007 DataNode
[jkfx@hadoop101 hadoop-2.7.2]$ ./sbin/yarn-daemon.sh start nodemanager
starting nodemanager, logging to /opt/module/hadoop-2.7.2/logs/yarn-jkfx-nodemanager-hadoop101.out
[jkfx@hadoop101 hadoop-2.7.2]$ ./sbin/yarn-daemon.sh start resourcemanager
starting resourcemanager, logging to /opt/module/hadoop-2.7.2/logs/yarn-jkfx-resourcemanager-hadoop101.out
[jkfx@hadoop101 hadoop-2.7.2]$ ./sbin/mr-jobhistory-daemon.sh start historyserver
starting historyserver, logging to /opt/module/hadoop-2.7.2/logs/mapred-jkfx-historyserver-hadoop101.out
[jkfx@hadoop101 hadoop-2.7.2]$ jps
2913 NameNode
27666 ResourceManager
27955 Jps
27917 JobHistoryServer
27519 NodeManager
3007 DataNode
然后重新在 YARN
上运行 MapReduce
程序,记得删除输出文件夹后在运行
即可在历史服务器的 web 端界面查看 log
配置文件说明
Hadoop 配置文件分两类: 默认配置文件 和 自定义配置文件 ,只有用户想修改某一默认配置值时,才需要修改自定义配置文件,更改相应属性值
默认配置文件
要获取的默认文件 | 文件存放在Hadoop的jar包中的位置 |
---|---|
[core-default.xml] |
hadoop-common-2.7.2.jar / core-default.xml |
[hdfs-default.xml] |
hadoop-hdfs-2.7.2.jar / hdfs-default.xml |
[yarn-default.xml] |
hadoop-yarn-common-2.7.2.jar / yarn-default.xml |
[mapred-default.xml] |
hadoop-mapreduce-client-core-2.7.2.jar / mapred-default.xml |
也可以在 Hadoop 文档的网站中查看默认配置文件:
自定义配置文件
core-site.xml
/ hdfs-site.xml
/ yarn-site.xml
/ mapred-site.xml
四个配置文件存放在 $HADOOP_HOME/etc/hadoop
这个路径上,用户可以根据项目需求重新进行修改配置
完全布式模式
- Local (Standalone) Mode
- Pseudo-Distributed Mode
- Fully-Distributed Mode
首先将之前最原始的虚拟机的镜像克隆 3 份,分别是 hadoop102
/ hadoop103
/ hadoop104
,并修改 ip 地址、 hostname等
scp 安全拷贝
scp
(secure copy) 可以实现服务器与服务器之间的数据拷贝(from server1 to server2)
可以将 hadoop101
上已经解压好的软件通过 scp
直接复制到其他服务器集群上
cp -r $pdir/$fname $user@hadoop$host:$pdir/$fname
命令 递归 要拷贝的文件路径/名称 目的用户@主机:目的路径/名称
在 hadoop101 将 hadoop101 复制到 hadoop102
在源主机上将自己的目录复制到目标服务器主机
使用命令 scp -r module root@hadoop102:/opt
即可通过网络复制到目标服务器
然后可以在目标服务器上修改下文件目录的所属者和所属组:
[jkfx@hadoop102 opt]$ ll
总用量 8
drwxr-xr-x. 5 root root 4096 10月 24 19:42 module
drwxr-xr-x. 2 jkfx jkfx 4096 10月 24 04:28 software
[jkfx@hadoop102 opt]$ sudo chown -R jkfx:jkfx module
[sudo] password for jkfx:
[jkfx@hadoop102 opt]$ ll
总用量 8
drwxr-xr-x. 5 jkfx jkfx 4096 10月 24 19:42 module
drwxr-xr-x. 2 jkfx jkfx 4096 10月 24 04:28 software
在 hadoop103 将 hadoop101 复制到 hadoop103
在目标服务器上将源目录主机复制到自己主机上
因为登陆的是 jkfx 用户而 /opt
目录所属者是 root ,所以需要加 sudo ,使用 sudo scp -r jkfx@hadoop101:/opt/module ./
在 hadoop103 将 hadoop101 复制到 hadoop104
在中间的服务器将一个服务器的文件目录复制到另一个服务器中,需要知道两者的用户密码
使用 scp -r jkfx@hadoop101:/opt/module root@hadoop104:/opt/
复制到目标主机后不要忘记修改下目录的所属者:所属目录
rsync 远程同步
rsync
主要用于备份和镜像,具有速度快、避免复制相同内容和支持符号链接的优点
rsync
和 scp
区别:用 rsync
做文件的复制要比 scp
的速度快, rsync
只对差异文件做更新, scp
是把所有文件都复制过去
基本语法: rsync -rvl source/dir user@hostname:dest/dir
选项 | 功能说明 |
---|---|
-r |
递归 |
-v |
显示复制过程 |
-l |
拷贝符号链接 |
把 hadoop101 机器上的 /opt/software
目录同步到 hadoop102 机器的 root 用户下的 /opt
目录:
[jkfx@hadoop101 opt]$ ll
总用量 12
-rw-r--r--. 1 root root 13 10月 25 18:49 jkfx.txt
drwxr-xr-x. 5 jkfx jkfx 4096 10月 24 04:28 module
drwxr-xr-x. 2 jkfx jkfx 4096 10月 24 04:28 software
[jkfx@hadoop101 opt]$ sudo vim jkfx.txt
[jkfx@hadoop101 opt]$ cat jkfx.txt
Hello World!
Hello mxnet!
[jkfx@hadoop101 opt]$ sudo rsync -rvl jkfx.txt root@hadoop102:/opt
root@hadoop102's password:
sending incremental file list
jkfx.txt
sent 100 bytes received 37 bytes 54.80 bytes/sec
total size is 26 speedup is 0.19
集群分发脚本
循环复制文件到所有节点的相同目录下
#!/bin/bash
#1. 获取输入参数的个数,如果没有参数,直接退出
pcount=$#
if((pcount==0)); then
echo no args;
exit;
fi
#2. 获取文件名称
p1=$1
fname=`basename $p1`
echo fname=$fname
#3. 获取上级目录到绝对路径
pdir=`cd -P $(dirname $p1); pwd`
echo pdir=$pdir
#4. 获取当前用户名称
user=`whoami`
#5. 循环分发
for((host=103; host<105; host++)); do
echo ------------------- hadoop$host --------------
rsync -rvl $pdir/$fname $user@hadoop$host:$pdir
done
然后查看运行结果:
[jkfx@hadoop102 bin]$ xsync /home/jkfx/bin/xsync
fname=xsync
pdir=/home/jkfx/bin
------------------- hadoop103 --------------
The authenticity of host 'hadoop103 (192.168.186.103)' can't be established.
RSA key fingerprint is b6:22:10:22:59:5a:57:10:55:ac:9a:2f:2d:43:f6:57.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'hadoop103,192.168.186.103' (RSA) to the list of known hosts.
jkfx@hadoop103's password:
Permission denied, please try again.
jkfx@hadoop103's password:
sending incremental file list
xsync
sent 573 bytes received 31 bytes 48.32 bytes/sec
total size is 502 speedup is 0.83
------------------- hadoop104 --------------
The authenticity of host 'hadoop104 (192.168.186.104)' can't be established.
RSA key fingerprint is b6:22:10:22:59:5a:57:10:55:ac:9a:2f:2d:43:f6:57.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'hadoop104,192.168.186.104' (RSA) to the list of known hosts.
jkfx@hadoop104's password:
sending incremental file list
xsync
sent 573 bytes received 31 bytes 172.57 bytes/sec
total size is 502 speedup is 0.83
集群配置
集群部署规划
hadoop102 | hadoop103 | hadoop104 | |
---|---|---|---|
HDFS |
NameNode DataNode |
DataNode |
SecondaryNameNode DataNode |
YARN |
NodeManager |
ResourceManager NodeManager |
NodeManager |
配置集群配置文件
核心配置文件
配置 core-site.xml
:
<!-- 指定 HDFS 中 NameNode 的地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop102:9000</value>
</property>
<!-- 指定 Hadoop 运行时产生文件的存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop-2.7.2/data/tmp</value>
</property>
HDFS 配置文件
配置 hadoop-env.sh
:
export JAVA_HOME=/opt/module/jdk1.8.0_144
配置 hdfs-site.xml
:
<!-- 默认不写也为 3 -->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<!-- 指定 Hadoop 辅助名称节点主机配置 -->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop104:50090</value>
</property>
YARN 配置文件
配置 yarn-env.sh
:
export JAVA_HOME=/opt/module/jdk1.8.0_144
配置 yarn-site.xml
:
<!-- Reducer 获取数据的方式 -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 指定 YARN 的 ResourceManager 的地址 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop103</value>
</property>
MapReduce 配置文件
配置 mapred-env.sh
:
export JAVA_HOME=/opt/module/jdk1.8.0_144
配置 mapred-site.xml
:
<!-- 指定MR运行在Yarn上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
在集群上分发配置文件
xsync /opt/module/hadoop-2.7.2/
[jkfx@hadoop102 hadoop-2.7.2]$ vim etc/hadoop/core-site.xml
[jkfx@hadoop102 hadoop-2.7.2]$ vim etc/hadoop/hadoop-env.sh
[jkfx@hadoop102 hadoop-2.7.2]$ vim etc/hadoop/hdfs-site.xml
[jkfx@hadoop102 hadoop-2.7.2]$ vim etc/hadoop/yarn-env.sh
[jkfx@hadoop102 hadoop-2.7.2]$ vim etc/hadoop/yarn-site.xml
[jkfx@hadoop102 hadoop-2.7.2]$ vim etc/hadoop/mapred-env.sh
[jkfx@hadoop102 hadoop-2.7.2]$ vim etc/hadoop/mapred-site.xml
[jkfx@hadoop102 hadoop-2.7.2]$ xsync /opt/module/hadoop-2.7.2/
集群单点启动
如果集群是第一次启动,需要使用 ./bin/hadoop namenode -format
对 NameNode
进行格式化
格式化之前需要删除
rm -rf data/ logs/
这两个目录,并且确保jps
没有NameNode
进程在运行
然后手动开启每个集群:
在 hadoop102 开启 NameNode
:
./sbin/hadoop-daemon.sh start namenode
jps
在 hadoop102 / hadoop103 / hadoop104 开启 DataNode
:
./sbin/hadoop-daemon.sh start datanode
jps
如果每个集群节点需要手动启动,那么将会是非常浪费时间的
ssh 无密登录
ssh ipaddr
分别在 hadoop102 / hadoop103 上执行 ssh-keygen
命令:
[jkfx@hadoop103 .ssh]$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/jkfx/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/jkfx/.ssh/id_rsa.
Your public key has been saved in /home/jkfx/.ssh/id_rsa.pub.
The key fingerprint is:
85:26:61:2e:16:71:fc:61:e7:f8:3b:a9:ee:f3:ec:e6 jkfx@hadoop103
The key's randomart image is:
+--[ RSA 2048]----+
| oo+ |
| =..o.. |
| o ooo=. |
| . . oo.. |
| S. |
| . |
| o |
| ..= |
| o+BE. |
+-----------------+
生成公钥和私钥后使用 ssh-copy-id
将公钥复制到其它 3 台集群的 authorized_keys
里(包括自己):
[jkfx@hadoop103 .ssh]$ ssh-copy-id hadoop102
[jkfx@hadoop103 .ssh]$ ssh-copy-id hadoop103
[jkfx@hadoop103 .ssh]$ ssh-copy-id hadoop104
The authenticity of host 'hadoop104 (192.168.186.104)' can't be established.
RSA key fingerprint is b6:22:10:22:59:5a:57:10:55:ac:9a:2f:2d:43:f6:57.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'hadoop104,192.168.186.104' (RSA) to the list of known hosts.
jkfx@hadoop104's password:
Now try logging into the machine, with "ssh 'hadoop104'", and check in:
.ssh/authorized_keys
to make sure we haven't added extra keys that you weren't expecting.
还需要使用 hadoop101 集群的
root
账户配置无密登录到三台集群服务器
known_hosts
: 记录 ssh 访问过计算机的公钥(public key)id_rsa
: 生成的私钥id_rsa.pub
: 生成的公钥authorized_keys
: 存放授权过的无密登录服务器公钥
群起集群
首先需要配置 slaves
[jkfx@hadoop102 hadoop-2.7.2]$ vim etc/hadoop/slaves
[jkfx@hadoop102 hadoop-2.7.2]$ cat etc/hadoop/slaves
hadoop102
hadoop103
hadopp104
注意:该文件内不允许有多余的空格、空行
然后使用 xsync
脚本分发配置文件:
[jkfx@hadoop102 hadoop-2.7.2]$ xsync etc/hadoop/slaves
fname=slaves
pdir=/opt/module/hadoop-2.7.2/etc/hadoop
------------------- hadoop103 --------------
sending incremental file list
slaves
sent 102 bytes received 37 bytes 278.00 bytes/sec
total size is 30 speedup is 0.22
------------------- hadoop104 --------------
sending incremental file list
slaves
sent 102 bytes received 37 bytes 278.00 bytes/sec
total size is 30 speedup is 0.22
如果是第一次启动,需要格式化 NameNode
,注意格式化之前先停止进程,然后删除 data 和 log 数据
启动 HDFS
注意是在 hadoop102 集群上开启 HDFS 因为 hadoop102 配置的 NameNode
启动 YARN
注意是在 hadoop103 机器上启动 YARN 并且如果 NameNode
和 ResourceManager
不在同一台机器,就不能再 NameNode
上启动 YARN 应该在 ResourceManager
机器上启动 YARN
启动之后在 Web 端查看 SecondaryNameNode
浏览器输入 http://hadoop104:50090/status.html
注意:启动之后一定要在每台服务器上使用
jps
查看每个进程是否正常启动!
基本测试
启动集群完成后,我们需要上传大小不同的文件进行测试,为了更好的阐述 HDFS 的存储机制,我们分别存储一个小于一个块大小的(128M)的文件和一个大于块大小的文件
首先上传文件:
[jkfx@hadoop102 hadoop-2.7.2]$ ./bin/hdfs dfs -put wcinput/wc.input /
[jkfx@hadoop102 hadoop-2.7.2]$ ./bin/hdfs dfs -put /opt/software/hadoop-2.7.2.tar.gz /
[jkfx@hadoop102 hadoop-2.7.2]$ ./bin/hdfs dfs -ls /
Found 2 items
-rw-r--r-- 3 jkfx supergroup 197657687 2020-10-30 18:10 /hadoop-2.7.2.tar.gz
-rw-r--r-- 3 jkfx supergroup 82 2020-10-30 18:10 /wc.input
如果刚启动集群时,上传文件显示
put: Cannot create file/wc.input._COPYING_. Name node is in safe mode.
则说明当前的NameNode
正处于安全模式,无需强制退出安全模式,等待一会儿即可,也可以使用hadoop dfsadmin -safemode leave
强制退出
分别上传了两个文件,在浏览器中打开 http://hadoop102:50070/ 查看两个文件的存储情况:
首先查看小文件的属性:
然后查看大文件的属性:
然后查看上传到 HDFS 的文件存储在了:/opt/module/hadoop-2.7.2/data/tmp/dfs/data/current/BP-2100340801-192.168.186.102-1604114055352/current/finalized/subdir0/subdir0
[jkfx@hadoop102 subdir0]$ pwd
/opt/module/hadoop-2.7.2/data/tmp/dfs/data/current/BP-2100340801-192.168.186.102-1604114055352/current/finalized/subdir0/subdir0
[jkfx@hadoop102 subdir0]$ ll
总用量 194552
-rw-rw-r--. 1 jkfx jkfx 82 10月 31 11:17 blk_1073741825
-rw-rw-r--. 1 jkfx jkfx 11 10月 31 11:17 blk_1073741825_1001.meta
-rw-rw-r--. 1 jkfx jkfx 134217728 10月 31 11:17 blk_1073741826
-rw-rw-r--. 1 jkfx jkfx 1048583 10月 31 11:17 blk_1073741826_1002.meta
-rw-rw-r--. 1 jkfx jkfx 63439959 10月 31 11:17 blk_1073741827
-rw-rw-r--. 1 jkfx jkfx 495635 10月 31 11:17 blk_1073741827_1003.meta
可以查看这几个 blk_*
文件的内容为:
我们将后缀为 26、27 的两个文件拼接到一起,查看会发生什么:
[jkfx@hadoop102 subdir0]$ cat blk_1073741826 >> temp.file
[jkfx@hadoop102 subdir0]$ cat blk_1073741827 >> temp.file
[jkfx@hadoop102 subdir0]$ tar -zxf temp.file
[jkfx@hadoop102 subdir0]$ ll
总用量 387584
-rw-rw-r--. 1 jkfx jkfx 82 10月 31 11:17 blk_1073741825
-rw-rw-r--. 1 jkfx jkfx 11 10月 31 11:17 blk_1073741825_1001.meta
-rw-rw-r--. 1 jkfx jkfx 134217728 10月 31 11:17 blk_1073741826
-rw-rw-r--. 1 jkfx jkfx 1048583 10月 31 11:17 blk_1073741826_1002.meta
-rw-rw-r--. 1 jkfx jkfx 63439959 10月 31 11:17 blk_1073741827
-rw-rw-r--. 1 jkfx jkfx 495635 10月 31 11:17 blk_1073741827_1003.meta
drwxr-xr-x. 9 jkfx jkfx 4096 5月 22 2017 hadoop-2.7.2
-rw-rw-r--. 1 jkfx jkfx 197657687 10月 31 11:32 temp.file
[jkfx@hadoop102 subdir0]$ cd hadoop-2.7.2/
[jkfx@hadoop102 hadoop-2.7.2]$ ll
总用量 52
drwxr-xr-x. 2 jkfx jkfx 4096 5月 22 2017 bin
drwxr-xr-x. 3 jkfx jkfx 4096 5月 22 2017 etc
drwxr-xr-x. 2 jkfx jkfx 4096 5月 22 2017 include
drwxr-xr-x. 3 jkfx jkfx 4096 5月 22 2017 lib
drwxr-xr-x. 2 jkfx jkfx 4096 5月 22 2017 libexec
-rw-r--r--. 1 jkfx jkfx 15429 5月 22 2017 LICENSE.txt
-rw-r--r--. 1 jkfx jkfx 101 5月 22 2017 NOTICE.txt
-rw-r--r--. 1 jkfx jkfx 1366 5月 22 2017 README.txt
drwxr-xr-x. 2 jkfx jkfx 4096 5月 22 2017 sbin
drwxr-xr-x. 4 jkfx jkfx 4096 5月 22 2017 share
可以看到两个文件拼接后就是原文件的内容,没有经过任何修改。
集群的启动 / 停止
各个服务组件逐一启动 / 停止
HDFS 组件
hadoop-daemon.sh start / stop namenode / datanode
YARN 组件
yarn-daemon.sh start / stop resourcemanager / nodemanager
各个模块启动 / 停止
配置 ssh 是关键
整体启动 HDFS
start-dfs.sh / stop-dfs.sh
整体启动 YARN
start-yarn.sh / stop-yarn.sh
crond 服务管理
重新启动一下服务: service crond restart
基本语法
crondtab [选项]
选项说明:
选项 | 功能 |
---|---|
-e |
编辑 crondtab 定时任务 |
-l |
查询 crondtab 任务 |
-r |
删除当前用户所有的 crondtab 任务 |
参数说明
首先使用 crondtab -e
进入编辑界面,使用 vim 编辑定时任务:
编辑格式: * * * * * 要执行的任务
项目 | 含义 | 范围 |
---|---|---|
第一个 * |
一小时当中的第几分钟 | 0-59 |
第二个 * |
一天当中的第几小时 | 0-23 |
第三个 * |
一个月当中的第几天 | 1-31 |
第四个 * |
一年当中的第几个月 | 1-12 |
第五个 * |
一周当中的星期几 | 0-7 |
特殊符号
特殊符号 | 含义 |
---|---|
* |
代表任何时间。比如第一个 * 代表一小时的每分钟都执行一次 |
, |
代表不连续的时间。比如 0 8,12,16 * * * 表示每天的 8 点、12点、16点整执行一次 |
- |
代表连续的时间范围。比如 0 5 * * 1-6 表示在周一到周六的凌晨 5 点整执行 |
*
|
代表每隔多久时间执行一次。比如 *10 * * * * 表示每隔 10 分钟就执行一次 |
举例说明
时间 | 含义 |
---|---|
45 22 * * * |
在 22 点 45 分执行 |
0 17 * * 1 |
在周一的 17 点 0 分执行 |
0 5 1,15 * * |
在每月的 1 号和 15 号的凌晨 5 点 0 分执行 |
40 4 * * 1-5 |
在周一到周五的凌晨 4 点 40 分执行 |
*10 4 * * * |
每天的凌晨 4 点,每隔 10 分钟执行一次 |
0 0 1,15 * 1 |
每月 1 号和 15 号,每周一的 0 点 0 分执行 |
注意 星期几和几号最好不要同时出现,它们的定义都是天,容易让人混乱
集群时间同步
时间同步的方式:找一个机器,作为时间服务器,所有的机器与这台集群时间进行定时的同步,比如,每隔十分钟,同步一次时间。
时间服务器配置
首先使用 rpm -qa | grep ntp
查看服务是否安装,然后修改 /etc/ntp.conf
配置文件
[jkfx@hadoop102 hadoop-2.7.2]$ su root
密码:
[root@hadoop102 hadoop-2.7.2]# rpm -qa | grep ntp
fontpackages-filesystem-1.41-1.1.el6.noarch
ntp-4.2.6p5-12.el6.centos.2.x86_64
ntpdate-4.2.6p5-12.el6.centos.2.x86_64
[root@hadoop102 hadoop-2.7.2]# vim /etc/ntp.conf
打开 ntp.conf
配置文件后,首先授权 192.168.1.0
这个网段的机器可以向本机器查询和同步时间:
然后将 ntp 默认的 5 个其它互联网上的时间服务器注释掉,表示集群只在局域网内同步查询时间:
然后为当前节点添加,当该节点丢失网络连接时,依然采用本地时间作为时间服务器为集群中的其它节点提供时间同步,在文件尾添加如下两行:
server 127.127.1.0
fudge 127.127.1.0 stratum 10
修改完 ntp.conf
文件后,开始修改 /etc/sysconfig/ntpd
文件,添加 SYNC_HWCLOCK=yes
表示让硬件时间和系统时间一起同步
然后使用 service ntpd restart
重启 ntpd
服务
然后使用 chkconfig ntpd on
让 ntpd
服务开机自启动
[root@hadoop102 hadoop-2.7.2]# vim /etc/sysconfig/ntpd
[root@hadoop102 hadoop-2.7.2]# service ntpd status
ntpd (pid 1727) 正在运行...
[root@hadoop102 hadoop-2.7.2]# service ntpd restart
关闭 ntpd: [确定]
正在启动 ntpd: [确定]
[root@hadoop102 hadoop-2.7.2]# chkconfig ntpd on
其它机器配置
在其它机器上配置 crondtab 定时任务让机器每 10 分钟与时间服务器同步一次时间
首先使用 root
用户,使用 crontab -e
打开编辑界面,编写定时任务 */10 * * * * /usr/sbin/ntpdate hadoop102
配置完成后,每个集群就可以时间同步
[jkfx@hadoop103 hadoop-2.7.2]$ su root
密码:
[root@hadoop103 hadoop-2.7.2]# date
2020年 10月 31日 星期六 12:38:54 CST
[root@hadoop103 hadoop-2.7.2]# date -s "1999-10-30 10:30:00"
1999年 10月 30日 星期六 10:30:00 CST
[root@hadoop103 hadoop-2.7.2]# ntpdate hadoop102
31 Oct 12:39:12 ntpdate[25673]: step time server 192.168.186.102 offset 662868545.048074 sec
[root@hadoop103 hadoop-2.7.2]# date
2020年 10月 31日 星期六 12:39:13 CST