伪分布式安装 Hadoop 只需要一台机器,硬件配置最低为 4 核 CPU、8G 内存,将 Hadoop 程序安装到 /opt/hadoop 目录下,Hadoop 配置文件放到 /etc/hadoop 目录下。
点击这里下载,https://mirror.bit.edu.cn/apache/hadoop/core/
我用的是3.2.1版本
部署hadoop
[root@hadoop3server ~]#mkdir /opt/hadoop
[root@hadoop3server ~]#cd /opt/hadoop
[root@hadoop3server hadoop]#tar zxvf hadoop-3.2.1.tar.gz
[root@hadoop3server hadoop]#ln -s hadoop-3.2.1 current
[root@hadoop3server ~]#mkdir /etc/hadoop
[root@hadoop3server hadoop]#cp -r /opt/hadoop/current/etc/hadoop /etc/hadoop/conf
目录软链接到 current 是为了后续运维方便,因为可能涉及 Hadoop 版本升级、自动化运维等操作,这样设置后,可以大大减轻运维工作量
部署jdk
[root@hadoop3server ~]#mkdir /usr/java
[root@hadoop3server ~]#cd /usr/java
[root@hadoop3server java]#tar zxvf jdk-8u171-linux-x64.tar.gz
[root@hadoop3server java]#ln -s jdk1.8.0_171 default
这个操作过程的最后一步,做这个软连接,也是为了后续运维自动化配置、升级方便。
环境变量设置
[root@master docker]# pwd
/home/docker
# 用户的根目录
[root@master docker]# cat .bashrc
# .bashrc
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
# Uncomment the following line if you don't like systemctl's auto-paging feature:
# export SYSTEMD_PAGER=
# User specific aliases and functions
# 下面的内容为新增
export JAVA_HOME=/usr/java/default
export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$JAVA_HOME/bin:$PATH
export HADOOP_HOME=/opt/hadoop/current
export HADOOP_MAPRED_HOME=${HADOOP_HOME}
export HADOOP_COMMON_HOME=${HADOOP_HOME}
export HADOOP_HDFS_HOME=${HADOOP_HOME}
export HADOOP_YARN_HOME=${HADOOP_HOME}
export CATALINA_BASE=${HTTPFS_CATALINA_HOME}
export HADOOP_CONF_DIR=/etc/hadoop/conf
export HTTPFS_CONFIG=/etc/hadoop/conf
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
加载
[root@master docker]# source .bashrc
[root@master docker]# java -version
java version "1.8.0_251"
Java(TM) SE Runtime Environment (build 1.8.0_251-b08)
Java HotSpot(TM) 64-Bit Server VM (build 25.251-b08, mixed mode)
[root@master docker]# hadoop version
Hadoop 3.2.1
Source code repository https://gitbox.apache.org/repos/asf/hadoop.git -r b3cbbb467e22ea829b3808f4b7b01d07e0bf3842
Compiled by rohithsharmaks on 2019-09-10T15:56Z
Compiled with protoc 2.5.0
From source with checksum 776eaf9eee9c0ffc370bcbc1888737
This command was run using /opt/hadoop/hadoop-3.2.1/share/hadoop/common/hadoop-common-3.2.1.jar
搞定了, 惊不惊喜,意不意外
Hadoop 安装完成后,先来了解一下其安装目录下几个重要的目录和文件,这里将 Hadoop 安装在了 /opt/hadoop/current 目录下,打开这个目录,需要掌握的几个目录如下表所示:
了解完目录的功能后,就开始进行配置操作了,Hadoop 的配置相当复杂,不过这些是后面要研究的内容。
而在伪分布模式下,仅仅需要修改一个配置文件即可,该文件是 core-site.xml,此文件目前位于 /etc/hadoop/conf 目录下,在此文件 标签下增加如下内容
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://master</value>
</property>
</configuration>
fs.defaultFS 属性描述的是访问 HDFS 文件系统的 URI 加一个 RPC 端口, 不加端口的话,默认是 8020。
hdfs://master可以是服务器的主机名,也可以是任意字符,但都需要将此标识在服务器的 /etc/hosts 进行解析,如下:
[root@master current]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.49.139 master
192.168.49.142 node142
192.168.49.155 node155
启动hadoop
配置操作完成后,下面就可以启动 Hadoop 服务了,虽然是伪分布模式,但 Hadoop 所有的服务都必须要启动,需要启动的服务有如下几个。
启动NameNode
对 NameNode 进行格式化,命令如下:
[root@master current]# bin/hdfs namenode -format
2020-07-04 15:48:41,797 INFO namenode.NameNode: STARTUP_MSG:
/************************************************************
STARTUP_MSG: Starting NameNode
STARTUP_MSG: host = master/192.168.49.139
STARTUP_MSG: args = [-format]
STARTUP_MSG: version = 3.2.1
STARTUP_MSG: ********************************************
********************************************
********************************************
********************************************
2020-07-04 15:48:43,139 INFO namenode.NameNode: SHUTDOWN_MSG:
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at master/192.168.49.139
************************************************************/
启动 NameNode
[root@master current]# hdfs --daemon start namenode
[root@master current]# jps |grep NameNode
4515 NameNode
NameNode的日志文件存放在/opt/hadoop/current/logs/hadoop-docker-namenode-master.log
NameNode 启动完成后,就可以通过 Web 页面查看状态了,默认会启动一个 http 端口 9870,可通过访问地址:http://192.168.49.139:9870 查看 NameNode 服务状态,如下图所示:
启动 NameNode 2
[root@master current]# hdfs --daemon start secondarynamenode
[root@master current]# jps |grep SecondaryNameNode
5308 SecondaryNameNode
启动datanode
[root@master current]# hdfs --daemon start datanode
[root@master current]# jps|grep DataNode
5479 DataNode
[root@master current]#
启动ResourceManager
注意,启动 resourcemanager 服务的命令变成了 yarn
[root@master current]# yarn --daemon start resourcemanager
[root@master current]# jps|grep ResourceManager
5624 ResourceManager
[root@master current]#
esourceManager 服务启动后,会默认启动一个 http 端口 8088,可通过访问 http://192.168.49.139:8088 查看 ResourceManager 的 Web 状态页面,如下图所示:
在上图中,需要重点关注的是 ResourceManager 中可用的内存资源、CPU 资源数及活跃节点数,目前看来,这些数据都是 0,是因为还没有 NodeManager 服务启动。
启动NodeManager
[root@master current]# yarn --daemon start nodemanager
[root@master current]# jps|grep NodeManager
5928 NodeManager
启动Jobhistoryserver
[root@master current]# mapred --daemon start historyserver
[root@master current]# jps|grep JobHistoryServer
6096 JobHistoryServer
注意,启动 Jobhistoryserver 服务的命令变成了 mapred,而非 yarn。这是因为 Jobhistoryserver 服务是基于 MapReduce 的,Jobhistoryserver 服务启动后,会运行一个 http 端口,默认端口号是 19888,可以通过访问此端口查看每个任务的历史运行情况,如下图所示
运用 Hadoop HDFS 命令进行分布式存储
查看根目录
[root@master current]# hadoop fs -ls /
Found 1 items
drwxrwx--- - root supergroup 0 2020-07-04 16:10 /tmp
创建log目录
[root@master current]# hadoop fs -mkdir /logs
[root@master current]# hadoop fs -ls /
Found 2 items
drwxr-xr-x - root supergroup 0 2020-07-04 16:16 /logs
drwxrwx--- - root supergroup 0 2020-07-04 16:10 /tmp
上传本地文件
[root@master current]# tree /opt/hadoop/ -L 1
/opt/hadoop/
├── current -> hadoop-3.2.1
├── hadoop-3.2.1
└── hadoop-3.2.1.tar.gz
2 directories, 1 file
[root@master current]#
[root@master current]# hadoop fs -put /opt/hadoop/hadoop-3.2.1.tar.gz /logs
2020-07-04 16:18:49,798 INFO sasl.SaslDataTransferClient: SASL encryption trust check: localHostTrusted = false, remoteHostTrusted = false
2020-07-04 16:18:50,865 INFO sasl.SaslDataTransferClient: SASL encryption trust check: localHostTrusted = false, remoteHostTrusted = false
2020-07-04 16:18:51,819 INFO sasl.SaslDataTransferClient: SASL encryption trust check: localHostTrusted = false, remoteHostTrusted = false
[root@master current]#
[root@master current]#
[root@master current]# hadoop fs -ls /logs
Found 1 items
-rw-r--r-- 3 root supergroup 359196911 2020-07-04 16:18 /logs/hadoop-3.2.1.tar.gz
在 Hadoop 中运行 MapreDuce 程序
创建一个测试文件 demo.txt,内容如下:
[root@master current]# cat demo.txt
Linux Unix windows
hadoop Linux spark
hive hadoop Unix
MapReduce hadoop Linux hive
windows hadoop spark
guxf
guxf
guxf wangzd
将创建的文件放入HDFS
[root@master current]# hadoop fs -put demo.txt /logs
2020-07-04 16:28:07,846 INFO sasl.SaslDataTransferClient: SASL encryption trust check: localHostTrusted = false, remoteHostTrusted = false
[root@master current]#
[root@master current]# hadoop fs -ls /logs
Found 2 items
-rw-r--r-- 3 root supergroup 127 2020-07-04 16:28 /logs/demo.txt
[root@master current]# hadoop jar /opt/hadoop/current/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.2.1.jar wordcount /logs /output4
[root@master current]# hadoop fs -ls /output4
Found 2 items
-rw-r--r-- 3 root supergroup 0 2020-07-04 16:49 /output4/_SUCCESS
-rw-r--r-- 3 root supergroup 77 2020-07-04 16:49 /output4/part-r-00000
[root@master current]#
[root@master current]# hadoop fs -text /output4/part-r-00000
2020-07-04 16:49:52,124 INFO sasl.SaslDataTransferClient: SASL encryption trust check: localHostTrusted = false, remoteHostTrusted = false
Linux 3
MapReduce 1
Unix 2
guxf 3
hadoop 4
hive 2
spark 2
wangzd 1
windows 2
千万别放无关的东西,别问我怎么写这句话┭┮﹏┭┮
任务执行完毕后,可以查看 /output 目录下有两个文件,其中:
_SUCCESS,任务完成标识,表示执行成功;
part-r-00000,表示输出文件名,常见的名称有 part-m-00000、part-r-00001,其中,带 m 标识的文件是 mapper 输出,带 r 标识的文件是 reduce 输出的,00000 为 job 任务编号,part-r-00000 整个文件为结果输出文件。
通过查看 part-r-00000 文件内容,可以看到 wordcount 的统计结果。左边一列是统计的单词,右边一列是在文件中单词出现的次数。
在web上展示统计信息
在 ResourceManager 的 Web 页面展示运行任务
mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</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>
</configuration>
yarn-site.xml
<configuration>
<!-- Site specific YARN configuration properties -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
配置完之后要重启ResourceManager和NodeManager
并且重新执行上面的存储命令
[root@master current]# tree /etc/hadoop/conf/
/etc/hadoop/conf/
├── mapred-site.xml
└── yarn-site.xml
1 directory, 32 files
[root@master current]# yarn --daemon stop resourcemanager
[root@master current]# jps|grep ResourceManager
[root@master current]# yarn --daemon start resourcemanager
[root@master current]# jps|grep ResourceManager
6562 ResourceManager
[root@master current]# yarn --daemon stop nodemanager
[root@master current]# jps|grep NodeManager
[root@master current]# yarn --daemon start nodemanager
[root@master current]# jps|grep NodeManager
7661 NodeManager
# 重新执行
[root@master current]# hadoop jar /opt/hadoop/current/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.2.1.jar wordcount /logs /output45
# 刷新http://master:8088/cluster/apps 得到以下结果
搞定
其他的配置自己摸索吧