大数据处理从零开始————3.Hadoop伪分布式和分布式搭建

1.伪分布式搭建(不会用,了解就好不需要搭建)

这里接上一节。

1.1 伪分布式集群概述

伪分布式集群就是只有⼀个服务器节点的分布式集群。在这种模式中,我们也是只需要⼀台机器。 但与本地模式不同,伪分布式采⽤了分布式的思想,具有完整的分布式⽂件存储和分布式计算的特 点。在进⾏存储和计算时,将涉及到的相关守护进程都运⾏在同⼀台机器上,它们都是独⽴的 Java进程,因⽽称为"伪分布式集群"。 伪分布式集群模式,⽐本地模式多了代码调试功能,允许检查内存的使⽤、HDFS输⼊输出、以及 其他的守护进程交互情况。

1.2 关闭selinux

把selinux关闭掉,这是Linux系统的⼀个安全机制,可以进⼊⽂件中将SELINUX设置为 disabled。

复制代码
vim /etc/selinux/config

把代码中SELINUX修改或添加为:

复制代码
SELINUX=disabled

1.3 修改配置⽂件

复制代码
cd /opt/module/hadoop/etc/hadoop/
python 复制代码
ll   #查看目录文件

下面这些文件都会有。

1.3.1 core-site.xml⽂件(记住修改下方主机名)

复制代码
<configuration>  
    <!-- 设置namenode节点 -->  
    <!-- 注意: hadoop1.x时代默认端口是9000;hadoop2.x时代默认端口是8020;  
    hadoop3.x时代默认端口是9820 -->  
    <property>  
        <name>fs.defaultFS</name>  
        <value>hdfs://hadoop100:9820</value>  
    </property>  

    <!-- hdfs的基础路径,被其他属性所依赖的一个基础路径 -->  
    <property>  
        <name>hadoop.tmp.dir</name>  
        <value>/opt/module/hadoop/tmp</value>  
    </property>  
</configuration>

1.3.2 hdfs-site.xml⽂件(记住修改下方主机名)

复制代码
<configuration>
  <property>
    <name>dfs.replication</name>
    <value>1</value>
  </property>
  
  <!-- secondarynamenode守护进程的http地址:主机名和端口号。参考守护进程布局 -->
  <property>
    <name>dfs.namenode.secondary.http-address</name>
    <value>hadoop100:9868</value>
  </property>
  
  <!-- namenode守护进程的http地址:主机名和端口号。参考守护进程布局 -->
  <property>
    <name>dfs.namenode.http-address</name>
    <value>hadoop100:9870</value>
  </property>
</configuration>

1.3.3 hadoop-env.sh⽂件(记住修改下方主机名)

python 复制代码
export JAVA_HOME=/opt/module/jdk
 
# Hadoop3中,需要添加如下配置,设置启动集群⻆⾊的⽤户是哪个。
export HDFS_NAMENODE_USER=root
export HDFS_DATANODE_USER=root
export HDFS_SECONDARYNAMENODE_USER=root

1.4 格式化集群

要注意,如果我们在core-site.xml中配置过hadoop.tmp.dir路径,在集群格式化时要保证这个路 径不存在!如果之前存在过数据,要先将其删除,再进⾏格式化!

python 复制代码
hdfs namenode -format

执⾏效果如下图所示:(注意对比下方点)

1.5 启动集群

python 复制代码
 start-dfs.sh

执⾏该命令后,⼀般会有如下提示:(这个一个不能少)!!!

python 复制代码
Starting namenodes on [MyBigData]
Starting datanodes
Starting secondary namenodes [MyBigData]

1.6 查看进程

python 复制代码
jps

执⾏该命令后,⼀般会有如下提示:(这个一个不能少)!!!

python 复制代码
11090 Jps
10595 NameNode
10938 SecondaryNameNode
10763 DataNode

1.7 启动WebUI界⾯

Hadoop伪集群模式给我们提供了⼀个WebUI界⾯,我们可以在浏览器中输⼊虚拟机的IP地址。如 果我们做过主机名映射,也可以直接使⽤主机名,⽐如http://192.168.10.100:9870

1.8 演示案例-统计单词个数

1.8.1 准备数据

接下来我们准备⼀些数据,在hadoop⽂件夹下创建⼀个myinput⽬录并进⼊。

python 复制代码
mkdir myinput && cd myinput

然后在该⽬录下创建两个file⽂件,并在其中输⼊⼀些内容:

python 复制代码
echo "hello world hadoop linux hadoop" >> file1
echo "hadoop linux hadoop linux hello" >> file1
echo "hadoop linux mysql linux hadop" >> file1
echo "hadoop linux hadoop linux hello" >> file1
echo "linux hadoop good programmer" >> file2
echo "good programmer yyg good" >> file2

1.8.2 上传集群

接下来我们需要将数据⽂件file1和file2上传到集群,以后我们再进⾏任务处理的数据就是HDFS数 据,不是Linux本地存储的了。

python 复制代码
hdfs dfs -put ./myinput/ /
# 检查是否已经上传成功
hdfs dfs -ls -R /

执⾏结果⼀般如下所示:

1.8.3 执⾏任务

我们切换到⾃⼰的hadoop⽬录下,在该⽬录中执⾏如下命令:

python 复制代码
hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.3.jar wordcount ./myinput ./myoutput

在运⾏该命令时,也可能会出现以下问题:

以上问题则表明我们的Hadoop服务器虽然启动成功,但缺少了⼀个/user/root/input⽂件夹,我 们可以⼿动创建出来。

解决过程如下:

复制代码
# 确认该路径是否存在
 hdfs dfs -ls /user/root/input

如果该路径确实不存在,则创建之:

复制代码
# 创建input⽂件夹
hdfs dfs -mkdir -p /user/root/input

# 将file1和file2中的⽂件put到input中
[root@hd01 hadoop]# hdfs dfs -put ./input/file* /user/root/input

接着我们重新执⾏如下命令即可:

复制代码
# hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.3.jar wordcount ./input ./output

2.完全分布式搭建(需要做!!!)

2.1 完全分布式概述

在真实的企业环境中,服务器集群会使⽤到多台机器共同配合,来构建⼀个完整的分布式⽂件系 统。⽽在这样的分布式⽂件系统中,HDFS相关的守护进程也会分布在不同的机器上,例如:

● NameNode守护进程,尽可能单独部署在⼀台硬件性能较好的机器中;

● 其他每台机器上都会部署⼀个DataNode守护进程,⼀般的硬件环境即可;

● SecondaryNameNode的守护进程最好不要和NameNode在同⼀台机器上。

2.2 集群规划部署

2.3 配置集群核⼼⽂件

2.3.1 core-site.xml⽂件

复制代码
[root@hd01 ~]#  cd $HADOOP_HOME/etc/hadoop
[root@hd01 hadoop]# vim core-site.xml

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
  <!-- 指定NameNode的地址 -->
  <property>
    <name>fs.defaultFS</name>
    <value>hdfs://hd01:8020</value>
  </property>
  <!-- 指定hadoop数据的存储目录 -->
  <property>
    <name>hadoop.tmp.dir</name>
    <value>/opt/module/hadoop/tmp</value>
  </property>
  <!-- 配置HDFS网页登录使用的静态用户为root -->
  <property>
    <name>hadoop.http.staticuser.user</name>
    <value>root</value>
  </property>
</configuration>

2.3.2 hdfs-site.xml⽂件

打开该⽂件:

复制代码
[root@hd01 hadoop]# vim hdfs-site.xml

<?xml version="1.0" encoding="UTF-8"?>  
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>  
<configuration>  
    <!-- nn web端访问地址 -->  
    <property>  
        <name>dfs.namenode.http-address</name>  
        <value>hd01:9870</value>  
    </property>  
    
    <!-- 2nn web端访问地址,注意这的机器名称是hd03!!!-->  
    <property>  
        <name>dfs.namenode.secondary.http-address</name>  
        <value>hd03:9868</value>  
    </property>  
</configuration>  

2.3.3 yarn-site.xml⽂件

打开yarn-site.xml:

复制代码
[root@hd01 hadoop]# vim yarn-site.xml

<?xml version="1.0" encoding="UTF-8"?>  
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>  
<configuration>  
    <!-- 指定MR⾛shuffle -->  
    <property>  
        <name>yarn.nodemanager.aux-services</name>  
        <value>mapreduce_shuffle</value>  
    </property>  
    
    <!-- 指定ResourceManager的地址, 注意这⾥的机器名称是hd02!!!-->  
    <property>  
        <name>yarn.resourcemanager.hostname</name>  
        <value>hd02</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>  
    
    <!-- 不验证虚拟内存⼤⼩ -->  
    <property>  
        <name>yarn.nodemanager.vmem-check-enabled</name>  
        <value>false</value>  
        <description>Whether virtual memory limits will be enforced for containers</description>  
    </property>  
    
    <property>  
        <name>yarn.nodemanager.vmem-pmem-ratio</name>  
        <value>4</value>  
        <description>Ratio between virtual memory to physical memory when setting memory limits for containers</description>  
    </property>  
</configuration>

2.3.4 mapred-site.xml⽂件

复制代码
[root@hd01 hadoop]# vim mapred-site.xml

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
  <!-- 指定MapReduce程序运行在Yarn上 -->
  <property>
    <name>mapreduce.framework.name</name>
    <value>yarn</value>
  </property>
</configuration>

2.3.5 hadoop-env.sh⽂件

复制代码
[root@hd01 hadoop]# vim hadoop-env.sh

增加如下内容:!!!!这里是增加

复制代码
export JAVA_HOME=/opt/module/jdk
 
# Hadoop3中,需要添加如下配置,设置启动集群⻆⾊的⽤户是谁
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

2.3.6 works⽂件

打开works⽂件:

复制代码
root@hd01 hadoop]# vim /opt/module/hadoop/etc/hadoop/workers

hd01
hd02
hd03

注意: 该⽂件中添加的内容,其结尾不允许有空格,⽂件中不允许有空⾏!

2.3.7 分发配置⽂件

在配置好了以上核⼼⽂件之后,我们要在集群上分发配置好的这些Hadoop配置⽂件。

复制代码
[root@hd01 hadoop]# xsync /opt/module/hadoop/etc/hadoop/

2.4 格式化集群

如果集群是第⼀次启动,需要在hd01节点上格式化NameNode。

复制代码
[root@hd01 hadoop]# hdfs namenode -format

2.5 集群启动⽅式

在这⾥启动的⽅式有两种,⼀种是⼀个节点⼀个节点的启动,⼀种是 编写⼀个启动脚本

2.5.1 单节点启动/关闭⽅式

1 启动HDFS

复制代码
[root@hd01 hadoop]# /opt/module/hadoop/sbin/start-dfs.sh
  1. 启动YARN

我们可以在在配置了ResourceManager的节点(hd02)上启动yarn:

复制代码
[root@hd02 hadoop]# /opt/module/hadoop/sbin/start-yarn.sh

启动节点后,我们就可以在Web端查看HDFS的NameNode了。我们在浏览器中输⼊: http://192.168.10.104:9870。然后我们查看Datanodes选项下,看看启动的个数是否为3,不为 3则说明环境配置有问题。

我 们 也 可 以 在 Web 端 查 看 YARN 的 ResourceManager , 在 浏 览 器 中 输 ⼊ : http://192.168.10.105:8088。查看⾸⻚Active Nodes是否为3,不为3则说明环境配置有问题。

  1. 关闭单节点

我们可以将各个模块分开启动,也可以分开停⽌,前提是⼤家已经配置了ssh。

复制代码
# 停⽌HDFS
[root@hd01 ~]# stop-dfs.sh
#停⽌YARN
start-yarn.sh/stop-yarn.sh

或者我们将各个服务组件逐⼀启动/停⽌。

复制代码
# 分别启动/停⽌HDFS组件
[root@hd01 ~]# hdfs --daemon start/stop namenode/datanode/secondarynamenode
# 启动/停⽌YARN
[root@hd01 ~]# yarn --daemon start/stop resourcemanager/nodemanager

2.5.2 脚本启动⽅式(重点)

如果我们⼀个节点⼀个节点的启动,会很麻烦,后续进⾏关闭时更麻烦,所以⽐较好的启动与关闭 ⽅式是编写⼀个启动和关闭脚本。

1.编写脚本

我们先编写⼀个Hadoop集群的启停脚本,包含HDFS、Yarn、Historyserver,脚本⽂件名为 myhadoop.sh

复制代码
[root@hd01 ~]# cd /root
[root@hd01 ~]# vim myhadoop.sh

#!/bin/bash  

if [ $# -lt 1 ]; then  
    echo "No Args Input..."  
    exit  
fi  

case $1 in  
    "start")  
        echo " =================== 启动 hadoop集群 ==================="  
        echo " --------------- 启动 hdfs ---------------"  
        ssh hd01 "/opt/module/hadoop/sbin/start-dfs.sh"  
        echo " --------------- 启动 yarn ---------------"  
        ssh hd02 "/opt/module/hadoop/sbin/start-yarn.sh"  
        ;;  
    
    "stop")  
        echo " =================== 关闭 hadoop集群 ==================="  
        echo " --------------- 关闭 yarn ---------------"  
        ssh hd02 "/opt/module/hadoop/sbin/stop-yarn.sh"  
        echo " --------------- 关闭 hdfs ---------------"  
        ssh hd01 "/opt/module/hadoop/sbin/stop-dfs.sh"  
        ;;  
    
    *)  
        echo "Input Args Error..."  
        ;;  
esac
  1. 添加执⾏权限

    chmod +x myhadoop.sh

3 关闭/开启所有hadoop进程

复制代码
# 停⽌集群
[root@hd01 ~]# ./myhadoop.sh stop
# 开启集群
[root@hd01 ~]# ./myhadoop.sh start

2.6 编写查看集群进程的脚本

我们通常是通过jps命令来查看hadoop的进程。

复制代码
# 查看单个进程
[root@hd01 ~]#  jps
  1. 编写脚本

这种⽅式只能查看单个节点上的进程,并不是很⽅便,我们可以编写⼀个⽤来查看集群进程的脚 本。我们先创建⼀个jpsall⽂件:

复制代码
[root@hd01 ~]# vim jpsall

#!/bin/bash  

for host in hd01 hd02 hd03; do  
    echo "=============== $host ==============="  
    ssh "$host" jps  
done
  1. 添加执⾏权限

保存后退出,然后赋予该脚本执⾏权限。

复制代码
[root@hd01 bin]# chmod +x jpsall
  1. 查看进程

    [root@hd01 bin]# ./jpsall

2.7 分发脚本

最后,我们把上⾯编写的脚本进⾏分发,以保证⾃定义的脚本可以在三台机器上都能使⽤。

复制代码
[root@hd01 ~]# xsync /root/myhadoop.sh
[root@hd01 ~]# xsync /root/jpsall

2.8 集群测试

2.8.1 上传⽂件到集群

1.上传⼩⽂件

复制代码
[root@hd01 ~]# hadoop fs -mkdir /input
[root@hd01 ~]# hadoop fs -put $HADOOP_HOME/wcinput/word.txt /input
  1. 上传⼤文件

    [root@hd01 ~]# hadoop fs -put /opt/software/jdk-8u421-linux-x64.tar.gz /

2.8.2 查看结果

上传⽂件后,我们可以来查看⽂件存放在什么位置。查看HDFS⽂件的存储路径,标红部分每台电 脑可能不同,需要根据实际情况修改。

复制代码
[root@hd01 ~]# cd /opt/module/hadoop/tmp/dfs/data/current/BP-35375740-192.168.10.104-1726820702869

这个文件:BP-35375740-192.168.10.104-1726820702869 每个机器不一样需要自己转到相应这个位置,进入后接着下一步。进入下放完整路径。

复制代码
[root@hd01 subdir0]# pwd
/opt/module/hadoop/tmp/dfs/data/current/BP-35375740-192.168.10.104-1726820702869/current/finalized/subdir0/subdir0

2.8.3 拼接⽂件

我们可以利⽤hadoop中的命令,将多个⽂件拼接在⼀起,⽐如:

复制代码
# ⽐如现在有如下多个⽂件:
总用量 144424
-rw-r--r--. 1 root root        49 9月  20 17:13 blk_1073741825
-rw-r--r--. 1 root root        11 9月  20 17:13 blk_1073741825_1001.meta
-rw-r--r--. 1 root root 134217728 9月  20 17:15 blk_1073741826
-rw-r--r--. 1 root root   1048583 9月  20 17:15 blk_1073741826_1002.meta
-rw-r--r--. 1 root root  12512099 9月  20 17:15 blk_1073741827
-rw-r--r--. 1 root root     97759 9月  20 17:15 blk_1073741827_1003.meta
# 我们可以将其拼接在⼀起
[root@hd01 subdir0]# cat blk_1073741826>>tmp.tar.gz
[root@hd01 subdir0]# cat blk_1073741827>>tmp.tar.gz
[root@hd01 subdir0]# tar -zxvf tmp.tar.gz

2.8.4 下载⽂件

复制代码
[root@hd01 ~]# hadoop fs -get /jdk-8u212-linux-x64.tar.gz ./

2.8.5 执⾏wordcount程序

复制代码
[root@hd01 ~]# cd /opt/module/hadoop
[root@hd01 hadoop]# hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.3.jar wordcount /input /output
[root@hd01 hadoop]# cat wcoutput/part-r-00000

2.9 统计单词格式

2.9.1 准备数据

复制代码
[root@hd01 hadoop]# cd /root
[root@hd01 ~]# mkdir input && cd input
[root@hd01 input]#  echo "hello world hadoop linux hadoop" >> file1
[root@hd01 input]# echo "hadoop linux hadoop linux hello" >> file1
[root@hd01 input]#  echo "hadoop linux mysql linux hadop" >> file1
[root@hd01 input]#  echo "hadoop linux hadoop linux hello" >> file1
[root@hd01 input]# echo "linux hadoop programmer" >> file2
[root@hd01 input]#  echo "programmer jiayadong good" >> file2

2.9.2 上传到集群

复制代码
# 将数据上传到HDFS
[root@hd01 input]# hdfs dfs -put ~/input/ /
# 检查是否已经上传成功
[root@hd01 input]# hdfs dfs -ls -R /
drwxr-xr-x - root supergroup 0 2022-01-28 13:11 /input
-rw-r--r-- 1 root supergroup 127 2022-01-28 13:11 /input/file1
-rw-r--r-- 1 root supergroup 59 2022-01-28 13:11 /input/file2

2.9.3 执⾏任务

复制代码
 hdfs dfs -rm -r /output


hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.3.jar wordcount /input /output
相关推荐
数据智能老司机17 小时前
CockroachDB权威指南——CockroachDB SQL
数据库·分布式·架构
数据智能老司机18 小时前
CockroachDB权威指南——开始使用
数据库·分布式·架构
数据智能老司机19 小时前
CockroachDB权威指南——CockroachDB 架构
数据库·分布式·架构
IT成长日记19 小时前
【Kafka基础】Kafka工作原理解析
分布式·kafka
州周20 小时前
kafka副本同步时HW和LEO
分布式·kafka
啊迷诺斯20 小时前
hadoop的常用命令
hadoop
爱的叹息1 天前
主流数据库的存储引擎/存储机制的详细对比分析,涵盖关系型数据库、NoSQL数据库和分布式数据库
数据库·分布式·nosql
Loving_enjoy1 天前
基于Hadoop的明星社交媒体影响力数据挖掘平台:设计与实现
大数据·hadoop·数据挖掘
千层冷面1 天前
RabbitMQ 发送者确认机制详解
分布式·rabbitmq·ruby
ChinaRainbowSea1 天前
3. RabbitMQ 的(Hello World) 和 RabbitMQ 的(Work Queues)工作队列
java·分布式·后端·rabbitmq·ruby·java-rabbitmq