技术标签: java linux hadoop 大数据 docker
这篇文章是基于Linux
系统CentOS7
搭建Hadoop-3.3.0
分布式集群的详细手记。
Hadoop
中的HDFS
和YARN
都是主从架构,主从架构会有一主多从和多主多从两种架构,这里为了简化搭建集群的流程,这里使用一主多从的架构。Hadoop
集群中各个角色的名称如下:
服务 | 主节点 | 从节点 |
---|---|---|
HDFS |
NameNode |
DataNode |
YARN |
ResourceManager |
NodeManager |
❝还有SecondaryNameNode,其实是NameNode的备用节点,定时合并和处理日志并且反馈到NameNode上。一般NameNode和SecondaryNameNode尽量不要放在同一个节点。
❞
HDFS
服务和YARN
其实是分离的,一者是数据存储,另一者是资源调度,Hadoop
集群可以只启用YARN
集群做资源调度。
测试的Hadoop
集群使用了3
台基于VirtualBox
搭建的CentOS7
虚拟机:
内网IP | 主机名 | 用户 | 虚拟磁盘空间 | HDFS角色 | YARN角色 |
---|---|---|---|---|---|
192.168.56.200 |
hadoop01 |
hadoop |
30GB |
NameNode 、DataNode |
NodeManager |
192.168.56.201 |
hadoop02 |
hadoop |
30GB |
DataNode |
NodeManager |
192.168.56.202 |
hadoop03 |
hadoop |
30GB |
SecondaryNameNode 、DataNode |
ResourceManager 、NodeManager |
主要包括必要的软件安装、用户创建和网络配置等等。
为了避免出现部分端口无法访问,内网环境下每台虚拟机都可以直接关闭防火墙:
# 停止防火墙进程
systemctl stop firewalld.service
# 禁用防火墙开机启动
systemctl disable firewalld.service
JDK
的安装比较简单,这里过程略过。笔者使用的JDK
是OpenJDK
,版本是1.8.0_252-b09
,JDK
路径配置如下:
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.252.b09-2.el7_8.x86_64
export PATH=$JAVA_HOME/bin:$PATH
「确保集群所有机器的JDK
安装位置相同,并且JDK
版本尽可能大版本选择8
」,经过大量测试发现Hadoop
暂时不兼容JDK9+
。
[root@localhost]# java -version
openjdk version "1.8.0_252"
OpenJDK Runtime Environment (build 1.8.0_252-b09)
OpenJDK 64-Bit Server VM (build 25.252-b09, mixed mode)
❝这个JDK安装位置和安装包名称是不是看起来比较奇怪?没错,是笔者偷懒用yum直接安装的OpenJDK。
❞
三个节点分别通过hostnamectl set-hostname $hostname
修改主机名:
# 节点192.168.56.200
hostnamectl set-hostname hadoop01
reboot
# 节点192.168.56.201
hostnamectl set-hostname hadoop02
reboot
# 节点192.168.56.202
hostnamectl set-hostname hadoop03
reboot
最终效果如下:
Connecting to 192.168.56.200:22...
Connection established.
To escape to local shell, press 'Ctrl+Alt+]'.
WARNING! The remote SSH server rejected X11 forwarding request.
Last login: Sun Dec 13 06:42:42 2020 from 192.168.56.1
[root@hadoop01 ~]#
Connecting to 192.168.56.201:22...
Connection established.
To escape to local shell, press 'Ctrl+Alt+]'.
WARNING! The remote SSH server rejected X11 forwarding request.
Last login: Sun Dec 13 07:51:28 2020 from 192.168.56.1
[root@hadoop02 ~]#
Connecting to 192.168.56.202:22...
Connection established.
To escape to local shell, press 'Ctrl+Alt+]'.
WARNING! The remote SSH server rejected X11 forwarding request.
Last login: Sun Dec 13 07:52:01 2020
[root@hadoop03 ~]#
在每个节点的hosts
文件具体是/etc/hosts
尾部添加:
192.168.56.200 hadoop01
192.168.56.201 hadoop02
192.168.56.202 hadoop03
方便后面可以直接通过主机名访问对应的机器。可以在任意一台机器用通过主机名ping
任意的主机名:
ping hadoop01
ping hadoop02
ping hadoop03
添加用户的操作需要在root
用户下进行。添加一个用户分组、命名和密码都为hadoop
的用户:
useradd hadoop
# 设置密码需要手动输入两次密码,笔者这里也暂时设定密码为hadoop
passwd hadoop
通过mkdir -p /data/hadoop
创建一个新目录,后面的hadoop
相关的数据等文件都放在/data/hadoop
目录下。设置目录/data/hadoop
的拥有者为hadoop
用户:
chown hadoop:hadoop /data/hadoop
最后设置hadoop
用户可以不输入密码直接通过sudo su
提升为root
用户:
chmod u+w /etc/sudoers
vim /etc/sudoers
# 在sudoers文件的root用户一行后面添加下面内容并且保存
hadoop ALL=(ALL) NOPASSWD:ALL
chmod u-w /etc/sudoers
效果如下:
验证一下是否成功:
# 在root用户下切换hadoop用户
su hadoop
# 在hadoop用户下无密码切换root用户
sudo su
# 效果
[root@localhost]# su hadoop
[hadoop@localhost]$ sudo su
[root@localhost]#
❝创建hadoop用户需要在集群中每台机器操作一次。
❞
设置集群机器SSH
免登这一步十分重要,无论是scp
命令去拷贝文件到各个机器,还是集群启动和通讯过程都依赖这一步。集群中每个机器都进行下面步骤操作:
使用su hadoop
切换到hadoop
用户
使用ssh-keygen -t rsa
命令,接着连按几次回车,生成公钥,执行完毕后/home/hadoop/.ssh/
目录下会多了一个id_rsa.pub
收集集群中所有节点的/home/hadoop/.ssh/id_rsa.pub
内容,汇总合并成一个authorized_keys
文件,再拷贝该文件到所有集群节点的/home/hadoop/.ssh/ssh
目录下
授权chmod 700 /home/hadoop/.ssh/ && chmod 700 /home/hadoop/ && chmod 600 /home/hadoop/.ssh/authorized_keys
最终笔者的/home/hadoop/.ssh/authorized_keys
文件内容如下:
可以使用下面的脚本替代手工操作:
# 拷贝三个节点的RSA公钥到authorized_keys中,可以在第一个节点中执行即可
for a in {1..3}; do sudo ssh hadoop@hadoop0$a cat /home/hadoop/.ssh/id_rsa.pub >> /home/hadoop/.ssh/authorized_keys; done
# 拷贝authorized_keys到三个节点中,可以在第一个节点中执行即可
for a in {1..3}; do sudo scp /home/hadoop/.ssh/authorized_keys hadoop@hadoop0$a:/home/hadoop/.ssh/authorized_keys ; done
最终的效果如下:
主要在hadoop01
节点中安装即可,安装完毕可以通过scp
命令直接拷贝文件分发到不同的节点中。赋予用户/data/hadoop
目录的读写权限:
su hadoop
sudo chmod -R a+w /data/hadoop
「这一步极其重要,否则容易导致运行集群的时候创建文件夹权限不足」。这里记住不要主动创建Hadoop
文件系统中的目录,否则容易导致DataNode
启动失败。
切换目录和用户:
su hadoop
cd /data/hadoop
下载和解压hadoop-3.3.0
:
wget https://mirror.bit.edu.cn/apache/hadoop/common/hadoop-3.3.0/hadoop-3.3.0.tar.gz
tar -zxvf hadoop-3.3.0.tar.gz
解压完毕后,/data/hadoop
目录下会多了一个hadoop-3.3.0
文件夹。
重命名一下文件夹mv hadoop-3.3.0 app
,也就是最终的HADOOP_HOME
为/data/hadoop/app
,可以先提前修改一下用户配置vim ~/.bashrc
(「所有节点都要添加」),添加:
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.252.b09-2.el7_8.x86_64
export PATH=$JAVA_HOME/bin:$PATH
export HADOOP_HOME=/data/hadoop/app
export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
刷新一下用户配置source ~/.bashrc
。
调用hadoop version
:
[hadoop@hadoop01 hadoop]$ hadoop version
Hadoop 3.3.0
Source code repository https://gitbox.apache.org/repos/asf/hadoop.git -r aa96f1871bfd858f9bac59cf2a81ec470da649af
Compiled by brahma on 2020-07-06T18:44Z
Compiled with protoc 3.7.1
From source with checksum 5dc29b802d6ccd77b262ef9d04d19c4
This command was run using /data/hadoop/app/share/hadoop/common/hadoop-common-3.3.0.jar
这样就能确定JDK
和Hadoop
的位置配置没有问题,接着开始配置Hadoop
中的应用配置。
配置core-site.xml
(具体是/data/hadoop/app/etc/hadoop/core-site.xml
):
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop01:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/data/hadoop/temp</value>
</property>
</configuration>
fs.defaultFS
:nameNode
的HDFS
协议的文件系统通信地址
hadoop.tmp.dir
:Hadoop
集群在工作的时候存储的一些临时文件的目录
配置hdfs-site.xml
(具体是/data/hadoop/app/etc/hadoop/hdfs-site.xml
):
<configuration>
<property>
<name>dfs.namenode.name.dir</name>
<value>/data/hadoop/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/data/hadoop/dfs/data</value>
</property>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<name>dfs.secondary.http.address</name>
<value>hadoop03:50090</value>
</property>
<property>
<name>dfs.http.address</name>
<value>192.168.56.200:50070</value>
</property>
</configuration>
dfs.namenode.name.dir
:NameNode
的数据存放目录
dfs.datanode.data.dir
:DataNode
的数据存放目录
dfs.replication
:HDFS
的副本数
dfs.secondary.http.address
:SecondaryNameNode
节点的HTTP
入口地址
dfs.http.address
:通过HTTP
访问HDFS
的Web
管理界面的地址
配置mapred-site.xml
(具体是/data/hadoop/app/etc/hadoop/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>
mapreduce.framework.name
:选用yarn
,也就是MR
框架使用YARN
进行资源调度。
配置yarn-site.xml
(具体是/data/hadoop/app/etc/hadoop/yarn-site.xml
):
<configuration>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop03</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
yarn.resourcemanager.hostname
:指定ResourceManager
所在的主机名
yarn.nodemanager.aux-services
:指定YARN
集群为MapReduce
程序提供Shuffle
服务
配置workers
文件(这个文件在旧版本叫slaves
,因为技术政治化运动被改为workers
,具体是/data/hadoop/app/etc/hadoop/workers
:
hadoop01
hadoop02
hadoop03
至此,核心配置基本完成。
重点提示三次:
所有节点的Hadoop
安装包位置和配置信息必须一致
所有节点的Hadoop
安装包位置和配置信息必须一致
所有节点的Hadoop
安装包位置和配置信息必须一致
在节点hadoop01
使用scp
命令进行分发:
## 分发节点2
scp -r /data/hadoop/app hadoop@hadoop02:/data/hadoop
## 分发节点3
scp -r /data/hadoop/app hadoop@hadoop03:/data/hadoop
规划中是hadoop01
作为NameNode
,在该机器下进行格式化:
hadoop namenode -format
格式化NameNode
成功的控制台日志如下:
可以在任意一个节点中启动和停止HDFS
,为了简单起见还是在hadoop01
节点中操作:
启动:start-dfs.sh
停止:stop-dfs.sh
调用启动命令后,控制台输出如下:
[hadoop@hadoop01 hadoop]$ start-dfs.sh
Starting namenodes on [hadoop01]
Starting datanodes
Starting secondary namenodes [hadoop03]
YARN
集群的启动命令必须在ResourceManager
节点中调用,规划中的对应角色的节点为hadoop03
,在该机器执行YARN
相关命令:
启动:start-yarn.sh
停止:stop-yarn.sh
执行启动命令后,控制台输出如下:
[hadoop@hadoop03 data]$ start-yarn.sh
Starting resourcemanager
Starting nodemanagers
分别查看集群中所有节点的进程状态,可以直接使用jps
工具,具体结果如下:
[hadoop@hadoop01 hadoop]$ jps
8673 NameNode
8823 DataNode
9383 NodeManager
9498 Jps
[hadoop@hadoop02 hadoop]$ jps
4305 DataNode
4849 Jps
4734 NodeManager
[hadoop@hadoop03 data]$ jps
9888 Jps
9554 NodeManager
5011 DataNode
9427 ResourceManager
5125 SecondaryNameNode
可见进程是正常运行的。
访问入口如下:
HDFS
入口:http://192.168.56.200:50070
(来自于hdfs-site.xml
的dfs.http.address
配置项)
YARN
入口:http://192.168.56.202:8088/cluster
(ResourceManager
所在节点的8088
端口)
数据节点状态如下:
YARN
集群状态如下:
通过几个简单的例子尝试使用Hadoop
集群。
测试一下创建目录和展示目录:
[hadoop@hadoop01 hadoop]$ hadoop fs -mkdir -p /test
[hadoop@hadoop01 hadoop]$ hadoop fs -ls /
Found 1 items
drwxr-xr-x - hadoop supergroup 0 2020-12-13 10:55 /test
创建一个words.txt
,写入内容并且上传到上一小节创建的test
文件夹中:
cd /data/hadoop
touch words.txt
echo 'hello world' >> words.txt
hadoop fs -put words.txt /test
然后在HDFS
的WEB
界面中查看:
下载该文件到/data/hadoop/download.txt
:
[hadoop@hadoop01 hadoop]$ hadoop fs -get /test/words.txt /data/hadoop/download.txt && \
cat /data/hadoop/download.txt
hello world
上传一个文件到HDFS
的/test/input
目录:
cd /data/hadoop && \
hadoop fs -mkdir -p /test/input && \
touch words-input.txt && \
echo 'hello world' >> words-input.txt && \
echo 'hello java' >> words-input.txt && \
echo 'hello hadoop' >> words-input.txt && \
hadoop fs -put words-input.txt /test/input
自带的例子在目录/data/hadoop/app/share/hadoop/mapreduce
的hadoop-mapreduce-examples-3.3.0.jar
中,通过命令运行WordCount
程序:
hadoop jar /data/hadoop/app/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.0.jar wordcount /test/input /test/output
MR
的执行过程如下:
查看YARN
管理界面对应的Job
状态:
可知任务最终的执行状态为成功。最后可以通过hadoop fs -cat
命令查看结果:
[hadoop@hadoop01 hadoop]$ hadoop fs -ls /test/output
Found 2 items
-rw-r--r-- 3 hadoop supergroup 0 2020-12-13 11:19 /test/output/_SUCCESS
-rw-r--r-- 3 hadoop supergroup 32 2020-12-13 11:19 /test/output/part-r-00000
[hadoop@hadoop01 hadoop]$ hadoop fs -cat /test/output/part-r-00000
hadoop 1
hello 3
java 1
world 1
本文花了大量时间详细记录了如何从零开始搭建一个Hadoop
集群,基于此才能进一步学习和使用Hadoop
生态中的组件如Hive
、Sqoop
和Hbase
等等,后续会逐个击破。
(本文完 c-2-d e-a-20201213)
文章浏览阅读2w次,点赞7次,收藏51次。四个步骤1.创建C++ Win32项目动态库dll 2.在Win32项目动态库中添加 外部依赖项 lib头文件和lib库3.导出C接口4.c#调用c++动态库开始你的表演...①创建一个空白的解决方案,在解决方案中添加 Visual C++ , Win32 项目空白解决方案的创建:添加Visual C++ , Win32 项目这......_c#调用lib
文章浏览阅读4.6k次。苹方字体是苹果系统上的黑体,挺好看的。注重颜值的网站都会使用,例如知乎:font-family: -apple-system, BlinkMacSystemFont, Helvetica Neue, PingFang SC, Microsoft YaHei, Source Han Sans SC, Noto Sans CJK SC, W..._ubuntu pingfang
文章浏览阅读159次。表单表单概述表单标签表单域按钮控件demo表单标签表单标签基本语法结构<form action="处理数据程序的url地址“ method=”get|post“ name="表单名称”></form><!--action,当提交表单时,向何处发送表单中的数据,地址可以是相对地址也可以是绝对地址--><!--method将表单中的数据传送给服务器处理,get方式直接显示在url地址中,数据可以被缓存,且长度有限制;而post方式数据隐藏传输,_html表单的处理程序有那些
文章浏览阅读1.2k次。使用说明:开启Google的登陆二步验证(即Google Authenticator服务)后用户登陆时需要输入额外由手机客户端生成的一次性密码。实现Google Authenticator功能需要服务器端和客户端的支持。服务器端负责密钥的生成、验证一次性密码是否正确。客户端记录密钥后生成一次性密码。下载谷歌验证类库文件放到项目合适位置(我这边放在项目Vender下面)https://github.com/PHPGangsta/GoogleAuthenticatorPHP代码示例://引入谷_php otp 验证器
文章浏览阅读4.3k次,点赞5次,收藏11次。matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距
文章浏览阅读2.2k次。①Storage driver 处理各镜像层及容器层的处理细节,实现了多层数据的堆叠,为用户 提供了多层数据合并后的统一视图②所有 Storage driver 都使用可堆叠图像层和写时复制(CoW)策略③docker info 命令可查看当系统上的 storage driver主要用于测试目的,不建议用于生成环境。_docker 保存容器
文章浏览阅读834次,点赞27次,收藏13次。网络拓扑结构是指计算机网络中各组件(如计算机、服务器、打印机、路由器、交换机等设备)及其连接线路在物理布局或逻辑构型上的排列形式。这种布局不仅描述了设备间的实际物理连接方式,也决定了数据在网络中流动的路径和方式。不同的网络拓扑结构影响着网络的性能、可靠性、可扩展性及管理维护的难易程度。_网络拓扑csdn
文章浏览阅读1.8k次,点赞5次,收藏8次。IOS系统Date的坑要创建一个指定时间的new Date对象时,通常的做法是:new Date("2020-09-21 11:11:00")这行代码在 PC 端和安卓端都是正常的,而在 iOS 端则会提示 Invalid Date 无效日期。在IOS年月日中间的横岗许换成斜杠,也就是new Date("2020/09/21 11:11:00")通常为了兼容IOS的这个坑,需要做一些额外的特殊处理,笔者在开发的时候经常会忘了兼容IOS系统。所以就想试着重写Date函数,一劳永逸,避免每次ne_date.prototype 将所有 ios
文章浏览阅读5.3k次。方法一:用PLSQL Developer工具。 1 在PLSQL Developer的sql window里输入select * from test for update; 2 按F8执行 3 打开锁, 再按一下加号. 鼠标点到第一列的列头,使全列成选中状态,然后粘贴,最后commit提交即可。(前提..._excel导入pl/sql
文章浏览阅读83次。Git常用命令速查手册1、初始化仓库git init2、将文件添加到仓库git add 文件名 # 将工作区的某个文件添加到暂存区 git add -u # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,不处理untracked的文件git add -A # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,包括untracked的文件...
文章浏览阅读202次。分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120
文章浏览阅读1.8k次。版权声明:转载请注明出处 http://blog.csdn.net/irean_lau。目录(?)[+]1、缺省构造函数。2、缺省拷贝构造函数。3、 缺省析构函数。4、缺省赋值运算符。5、缺省取址运算符。6、 缺省取址运算符 const。[cpp] view plain copy_空类默认产生哪些类成员函数