Hadoop运行模式

Hadoop运行模式

[TOC]

Hadoop运行模式

Hadoop运行模式包括:本地模式伪分布式模式以及完全分布式模式

Hadoop官方网站

全文内容在atguigu用户登录模式进行,命令执行根目录为/opt/module/hadoop-2.7.2

本地运行模式

官方Grep案例

Standalone Operation

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.

默认情况下,Hadoop被配置为以非分布式模式运行,作为单个Java进程。这对于调试非常有用。
下面的示例复制解压缩的conf目录以用作输入,然后查找并显示给定正则表达式的每个匹配项。输出被写到给定的输出目录。

1
2
3
4
$ 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/*

实操

1
$ cd /opt/module/hadoop-2.7.2/
  • 创建在hadoop-2.7.2文件下面创建一个input文件夹
1
$ mkdir input
  • 将Hadoop的xml配置文件复制到input
1
$ cp etc/hadoop/*.xml input
  • 执行share目录下的MapReduce程序
1
2
3
4
5
6
7
8
$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar grep input output 'dfs[a-z.]+'

$ cd output
$ ll

总用量 4
-rw-r--r--. 1 atguigu atguigu 11 7月 24 22:41 part-r-00000
-rw-r--r--. 1 atguigu atguigu 0 7月 24 22:41 _SUCCESS
  • 查看输出结果
1
cat output/*

官方WordCount案例

1
$ cd /opt/module/hadoop-2.7.2/
  • 创建在hadoop-2.7.2文件下面创建一个wcinput文件夹

大数据全部需要输出输路径

1
$ mkdir wcinput
  • 在wcinput文件下创建一个wc.input文件
1
2
$ cd wcinput
$ touch wc.input
  • 编辑wc.input文件
1
$ vim wc.input

在文件中输入如下内容

1
2
3
4
5
6
hadoop yarn
hadoop mapreduce
atguigu
atguigu
`Esc`
:wq
  • 回到Hadoop目录/opt/module/hadoop-2.7.2
1
$ cd /opt/module/hadoop-2.7.2/
  • 执行程序
1
$ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount wcinput wcoutput
  • 查看结果
1
2
3
4
5
6
7
8
9
10
11
12
$ ll

总用量 4
-rw-r--r--. 1 atguigu atguigu 38 7月 24 22:50 part-r-00000
-rw-r--r--. 1 atguigu atguigu 0 7月 24 22:50 _SUCCESS

$ cat wcoutput/part-r-00000

atguigu 2
hadoop 2
mapreduce 1
yarn 1

伪分布式模式

所有配置是按照集群搭建的,只有1台服务器。用于学习和简单测试。

Pseudo-Distributed Operation-官网指南

Hadoop can also be run on a single-node in a pseudo-distributed mode where each Hadoop daemon runs in a separate Java process.

Hadoop还可以以伪分布式模式在单节点上运行,其中每个Hadoop守护进程在单独的Java进程中运行。

  • Configuration

Use the following:

etc/hadoop/core-site.xml:

1
2
3
4
5
6
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property>
</configuration>

etc/hadoop/hdfs-site.xml:

1
2
3
4
5
6
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
  • Setup passphraseless ssh

Now check that you can ssh to the localhost without a passphrase:
现在检查是否可以在不使用口令的情况下ssh到本地主机:

1
$ ssh localhost

If you cannot ssh to localhost without a passphrase, execute the following commands:
如果没有口令就不能ssh到本地主机,请执行以下命令:

1
2
3
$ ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
$ chmod 0600 ~/.ssh/authorized_keys
  • Execution

The following instructions are to run a MapReduce job locally. If you want to execute a job on YARN, see YARN on Single Node.
下面的说明用于在本地运行MapReduce作业。如果要在纱线上执行作业,请参阅单节点上的YARN。

  1. Format the filesystem:
    格式文件系统:
1
$ bin/hdfs namenode -format
  1. Start NameNode daemon and DataNode daemon:
    启动NameNode守护进程和DataNode守护进程:
1
$ sbin/start-dfs.sh

The hadoop daemon log output is written to the $HADOOP_LOG_DIR directory (defaults to $HADOOP_HOME/logs).

  1. Browse the web interface for the NameNode; by default it is available at:
    浏览web界面找到NameNode;默认情况下可在:

NameNode - http://localhost:9870/

  1. Make the HDFS directories required to execute MapReduce jobs:
    创建执行MapReduce作业所需的HDFS目录:
1
2
$ bin/hdfs dfs -mkdir /user
$ bin/hdfs dfs -mkdir p/user/<username>
  1. Copy the input files into the distributed filesystem:
    将输入文件复制到分布式文件系统:
1
2
$ bin/hdfs dfs -mkdir input
$ bin/hdfs dfs -put etc/hadoop/*.xml input
  1. Run some of the examples provided:
    运行提供的一些示例:
1
$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.2.1.jar grep input output 'dfs[a-z.]+'
  1. Examine the output files: Copy the output files from the distributed filesystem to the local filesystem and examine them:
    检查输出文件:将分布式文件系统的输出文件复制到本地文件系统,检查:
1
2
$ bin/hdfs dfs -get output output
$ cat output/*

or

View the output files on the distributed filesystem:
查看分布式文件系统的输出文件:

1
$ bin/hdfs dfs -cat output/*
  1. When you’re done, stop the daemons with:
    当你完成时,停止守护进程:
1
$ sbin/stop-dfs.sh
  • YARN on a Single Node

You can run a MapReduce job on YARN in a pseudo-distributed mode by setting a few parameters and running ResourceManager daemon and NodeManager daemon in addition.
通过设置一些参数并另外运行ResourceManager守护进程和NodeManager守护进程,您可以在YARN上以伪分布式模式运行MapReduce作业。

The following instructions assume that 1. ~ 4. steps of the above instructions are already executed.

  1. Configure parameters as follows:

etc/hadoop/mapred-site.xml:

1
2
3
4
5
6
7
8
9
10
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.application.classpath</name>
<value>$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/*:$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/lib/*</value>
</property>
</configuration>

etc/hadoop/yarn-site.xml:

1
2
3
4
5
6
7
8
9
10
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</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>
  1. Start ResourceManager daemon and NodeManager daemon:
    启动ResourceManager守护进程和NodeManager守护进程:
1
$ sbin/start-yarn.sh
  1. Browse the web interface for the ResourceManager; by default it is available at:
    浏览ResourceManager的网页界面;默认情况下可在:

ResourceManager - http://localhost:8088/

  1. Run a MapReduce job.运行一个MapReduce作业。

  2. When you’re done, stop the daemons with:
    当你完成时,停止守护进程:

1
$ sbin/stop-yarn.sh

配置代码直接复制粘贴即可。

启动HDFS并运行MapReduce程序

分析

  1. 配置集群
  2. 启动、测试集群增、删、查
  3. 执行WordCount案例

1. 配置集群

  • (1)配置:hadoop-env.sh

Linux系统中获取JDK的安装路径:

1
2
$ echo $JAVA_HOME
/opt/module/jdk1.8.0_144

修改JAVA_HOME 路径:

1
2
3
$ vim etc/hadoop/hadoop-env.sh 

export JAVA_HOME=/opt/module/jdk1.8.0_144
  • (2)配置:core-site.xml
1
$ vim etc/hadoop/core-site.xml
1
2
3
4
5
6
7
8
9
10
11
<!-- 指定HDFS中NameNode的地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop100:9000</value>
</property>

<!-- 指定Hadoop运行时产生文件的存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop-2.7.2/data/tmp</value>
</property>

hdfs可以设置主机名和端口号
默认hadoop.tmp.dir /tmp/hadoop-${user.name},要改变目录

  • (3)配置:hdfs-site.xml
1
$ vim etc/hadoop/hdfs-site.xml
1
2
3
4
5
<!-- 指定HDFS副本的数量 -->
<property>
<name>dfs.replication</name>
<value>1</value>
</property>

可以不配置,默认副本数是3。
本机只有一份,当增加节点的时候,自动向其他节点备份。

2.启动集群

  • (1)格式化NameNode(第一次启动时格式化,以后就不要总格式化)
1
$ bin/hdfs namenode -format

如果提示重新格式化,一定是数据没有清除掉,需要删除data和log文件夹。

  • (2)启动NameNode

所有启动命令都在sbin

1
2
3
$ sbin/hadoop-daemon.sh start namenode

starting namenode, logging to /opt/module/hadoop-2.7.2/logs/hadoop-atguigu-namenode-hadoop100.out
  • (3)启动DataNode
1
2
3
$ sbin/hadoop-daemon.sh start datanode

starting datanode, logging to /opt/module/hadoop-2.7.2/logs/hadoop-atguigu-datanode-hadoop100.out

3.查看集群

  • (1)查看是否启动成功
1
2
3
4
5
$jps

3875 NameNode
3972 DataNode
4045 Jps

jps是JDK中的命令,不是Linux命令。不安装JDK不能使用jps

  • (2)web端查看HDFS文件系统

浏览器输入本机ip:50070,如192.168.228.100:50070

http://192.168.228.100:50070/dfshealth.html#tab-overview

1
$ bin/hdfs dfs -mkdir -p /user/atguigu/input
  • (3)查看产生的Log日志

在遇到Bug时,经常根据日志提示信息去分析问题、解决Bug。

当前目录:/opt/module/hadoop-2.7.2/logs

1
2
3
4
5
6
7
8
9
10
11
12
$ cd /opt/module/hadoop-2.7.2/logs/
$ ll

总用量 96
-rw-rw-r--. 1 atguigu atguigu 26004 7月 25 00:20 hadoop-atguigu-datanode-hadoop100.log
-rw-rw-r--. 1 atguigu atguigu 718 7月 24 23:43 hadoop-atguigu-datanode-hadoop100.out
-rw-rw-r--. 1 atguigu atguigu 49270 7月 25 00:20 hadoop-atguigu-namenode-hadoop100.log
-rw-rw-r--. 1 atguigu atguigu 5007 7月 24 23:56 hadoop-atguigu-namenode-hadoop100.out
-rw-rw-r--. 1 atguigu atguigu 785 7月 24 23:39 hadoop-atguigu-namenode-hadoop100.out.1
-rw-rw-r--. 1 atguigu atguigu 0 7月 24 23:39 SecurityAuth-atguigu.audit

$ cat hadoop-atguigu-datanode-hadoop101.log

web端也可以查看。

  • (4)思考:为什么不能一直格式化NameNode,格式化NameNode,要注意什么?
1
2
3
4
5
6
7
8
9
$ cd data/tmp/dfs/name/current/
$ cat VERSION

clusterID=CID-7a74910c-94d8-4b2a-889e-177f9d474dd5

$ cd data/tmp/dfs/data/current/
$ cat VERSION

clusterID=CID-7a74910c-94d8-4b2a-889e-177f9d474dd5

格式化NameNode,会产生新的集群id,导致NameNode和DataNode的集群id不一致,集群找不到已往数据。
格式NameNode时,一定要先删除DataNode里面的信息(默认在/tmo,如果配置了该目录,删除指定文件夹)数据和log日志,然后再格式化NameNode。

4.操作集群

  • (1)在HDFS文件系统上创建一个input文件夹
1
$ bin/hdfs dfs -mkdir -p /user/atguigu/input
  • (2)将测试文件内容上传到文件系统上
1
$ bin/hdfs dfs -put wcinput/wc.input /user/atguigu/input/
  • (3)查看上传的文件是否正确
1
2
$ bin/hdfs dfs -ls /user/atguigu/input/
$ bin/hdfs dfs -cat /user/atguigu/ input/wc.input
  • (4)运行MapReduce程序
1
$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount /user/atguigu/input/ /user/atguigu/output

路径为hdfs上的路径

  • (5)查看输出结果

命令行查看:

1
2
3
4
5
6
$ bin/hdfs dfs -cat /user/atguigu/output/*

atguigu 2
hadoop 2
mapreduce 1
yarn 1

浏览器查看:

  • (6)将测试文件内容下载到本地
1
$ hdfs dfs -get /user/atguigu/output/part-r-00000 ./wcoutput/
  • (7)删除输出结果
1
$ hdfs dfs -rm -r /user/atguigu/output

启动YARN并运行MapReduce程序

分析

  1. 配置集群在YARN上运行MR
  2. 启动、测试集群增、删、查
  3. 在YARN上执行WordCount案例

1. 配置集群

  • (1)配置:yarn-env.sh

Linux系统中获取JDK的安装路径:

1
2
$ echo $JAVA_HOME
/opt/module/jdk1.8.0_144

修改JAVA_HOME 路径:

1
2
3
$ vim etc/hadoop/yarn-env.sh 

export JAVA_HOME=/opt/module/jdk1.8.0_144
  • (2)配置:yarn-site.xml
1
$ vim etc/hadoop/yarn-site.xml
1
2
3
4
5
6
7
8
9
10
11
<!-- Reducer获取数据的方式 -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>

<!-- 指定YARN的ResourceManager的地址 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop100</value>
</property>
  • (3)配置:mapred-env.sh
1
2
3
$ vim etc/hadoop/mapred-env.sh 

export JAVA_HOME=/opt/module/jdk1.8.0_144

配置一下JAVA_HOME

  • (4)配置:mapred-site.xml(mapred-site.xml.template重新命名)
1
2
$ mv mapred-site.xml.template mapred-site.xml
$ vim mapred-site.xml
1
2
3
4
5
<!-- 指定MR运行在YARN上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>

mapreduce.framework.name默认在local运行。

2. 启动集群

  • (1)启动前必须保证NameNode和DataNode已经启动
  • (2)启动ResourceManager
1
2
3
$ sbin/yarn-daemon.sh start resourcemanager

starting resourcemanager, logging to /opt/module/hadoop-2.7.2/logs/yarn-atguigu-resourcemanager-hadoop100.out
  • (3)启动NodeManager
1
2
3
$ sbin/yarn-daemon.sh start nodemanager

starting nodemanager, logging to /opt/module/hadoop-2.7.2/logs/yarn-atguigu-nodemanager-hadoop100.out

3. 集群操作

  • (1)YARN的浏览器页面查看

浏览器输入本机ip:8088,如192.168.228.100:8088

http://192.168.228.100:8088/cluster

  • (2)删除文件系统上的output文件
1
$ bin/hdfs dfs -rm -r /user/atguigu/output
  • (3)执行MapReduce程序
1
$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount /user/atguigu/input  /user/atguigu/output
  • (4)查看运行结果
1
bin/hdfs dfs -cat /user/atguigu/output/*

配置历史服务器

为了查看程序的历史运行情况,需要配置一下历史服务器。具体配置步骤如下:

1.配置mapred-site.xml

1
$ vim etc/hadoop/mapred-site.xml

在该文件里面增加如下配置。

1
2
3
4
5
6
7
8
9
10
<!-- 历史服务器端地址 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop100:10020</value>
</property>
<!-- 历史服务器web端地址 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop100:19888</value>
</property>

2.启动历史服务器

1
2
3
$ sbin/mr-jobhistory-daemon.sh start historyserver

starting historyserver, logging to /opt/module/hadoop-2.7.2/logs/mapred-atguigu-historyserver-hadoop100.out

3.查看历史服务器是否启动

1
2
3
4
5
6
7
8
$ jps

5505 JobHistoryServer
3875 NameNode
3972 DataNode
5624 Jps
4670 ResourceManager
4911 NodeManager

4.查看JobHistory

此时回到yarn页面时候点击history可以进入查看到历史界面。

http://192.168.228.100:19888/jobhistory

配置日志的聚集

日志聚集概念:应用运行完成以后,将程序运行日志信息上传到HDFS系统上。
日志聚集功能好处:可以方便的查看到程序运行详情,方便开发调试。

开启日志聚集功能,需要重新启动NodeManager 、ResourceManager和HistoryManager。

开启日志聚集功能具体步骤如下:

1.关闭NodeManager 、ResourceManager和HistoryManager

1
2
3
4
5
6
7
8
$ sbin/yarn-daemon.sh stop resourcemanager
$ sbin/yarn-daemon.sh stop nodemanager
$ sbin/mr-jobhistory-daemon.sh stop historyserver
$ jps

5793 Jps
3875 NameNode
3972 DataNode

2.配置yarn-site.xml

1
$ vim etc/hadoop/yarn-site.xml

在该文件里面增加如下配置。

1
2
3
4
5
6
7
8
9
10
<!-- 日志聚集功能使能 -->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!-- 日志保留时间设置7天 -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>

yarn.log-aggregation-enable默认是flase关闭。
日志保留时间是按秒数计算的。

3.启动NodeManager 、ResourceManager和HistoryManager

1
2
3
$ sbin/yarn-daemon.sh start resourcemanager
$ sbin/yarn-daemon.sh start nodemanager
$ sbin/mr-jobhistory-daemon.sh start historyserver

4.删除HDFS上已经存在的输出文件

1
$ bin/hdfs dfs -rm -r /user/atguigu/output

5.执行WordCount程序

1
$ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount /user/atguigu/input /user/atguigu/output

6.查看日志

http://hadoop100:19888/jobhistory

7.杀死job

查看当前正在执行的进程:

1
$ sh hadoop job -list

执行杀死进程的命令:

1
$ hadoop job -kill job_1595621119100_0002

如果正确执行,则系统提示:

Killed job job_201212111628_11166

8.删除application

1
2
3
bin/yarn application -kill <applicationId>

bin/yarn application -kill application_1595621119100_0001

配置文件的说明

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

官网可以获得默认配置信息https://hadoop.apache.org/docs/r2.7.2/

自定义配置文件

core-site.xmlhdfs-site.xmlyarn-site.xmlmapred-site.xml四个配置文件存放在$HADOOP_HOME/etc/hadoop这个路径上,用户可以根据项目需求重新进行修改配置。

完全分布式运行模式※

分析

  1. 准备3台客户机(关闭防火墙、静态ip、主机名称)
  2. 安装JDK
  3. 环境变量
  4. 安装Hadoop
  5. 配置环境变量
  6. 配置集群
  7. 单点启动
  8. 配置ssh
  9. 群起
  10. 测试集群

jps不能用可能是因为java_home或者没有source。echo $PATH查看路径

虚拟机准备

克隆虚拟机,见Hadoop环境搭建

复制虚拟机需要改ip和主机名

1
2
3
4
5
6
7
8
$ vim /etc/udev/rules.d/70-persistent-net.rules
$ vim /etc/sysconfig/network-scripts/ifcfg-eth0
$ vim /etc/sysconfig/network
$ vim /etc/hosts

hadoop102 192.168.228.102
hadoop103 192.168.228.103
hadoop104 192.168.228.104

编写集群分发脚本xsync

scp(secure copy)安全拷贝

scp定义

scp可以实现服务器与服务器之间的数据拷贝。(from server1 to server2)

基本语法

1
2
$ scp -r $pdir/$fname $user@hadoop$host:$pdir/$fname
命令 递归 要拷贝的文件路径/名称 目的用户@主机:目的路径/名称

案例实操

  • 在hadoop100上,将hadoop100中/opt/module目录下的软件拷贝到hadoop102上。
1
[atguigu@hadoop100 /]$ scp -r /opt/module root@hadoop102:/opt/module

opt是root用户所有目录,别的用户没有权限写入,所以目标用户需要写入,修改拷贝目标位置权限。

  • 在hadoop103上,将hadoop100服务器上的/opt/module目录下的软件拷贝到hadoop103上。
1
[atguigu@hadoop103 opt]$ sudo scp -r atguigu@hadoop100:/opt/module root@hadoop103:/opt/module
  • 在hadoop103上操作将hadoop100中/opt/module目录下的软件拷贝到hadoop104上。
1
[atguigu@hadoop103 opt]$ scp -r atguigu@hadoop100:/opt/module root@hadoop104:/opt/module

拷贝过来的/opt/module目录,别忘了在hadoop102、hadoop103、hadoop104上修改所有文件的,所有者和所有者组。

1
$ sudo chown atguigu:atguigu -R /opt/module
  • 将hadoop100中/etc/profile文件拷贝到hadoop102的/etc/profile上。
1
[atguigu@hadoop100 ~]$ sudo scp /etc/profile root@hadoop102:/etc/profile
  • 将hadoop100中/etc/profile文件拷贝到hadoop103的/etc/profile上。
1
[atguigu@hadoop100 ~]$ sudo scp /etc/profile root@hadoop103:/etc/profile
  • 将hadoop100中/etc/profile文件拷贝到hadoop104的/etc/profile上。
1
[atguigu@hadoop100 ~]$ sudo scp /etc/profile root@hadoop104:/etc/profile

同样拷贝software文件夹,并更改atguigu权限。

拷贝过来的配置文件别忘了source一下/etc/profile

1
$ source /etc/profile

rsync 远程同步工具

rsync主要用于备份和镜像。
具有速度快、避免复制相同内容和支持符号链接的优点。

rsync和scp区别:用rsync做文件的复制要比scp的速度快,rsync只对差异文件做更新。scp是把所有文件都复制过去。

基本语法

1
2
$ rsync -rvl $pdir/$fname $user@hadoop$host:$pdir/$fname
命令 选项参数 要拷贝的文件路径/名称 目的用户@主机:目的路径/名称 选项参数说明
选项 功能
-r 递归
-v 显示复制过程
-l 拷贝符号连接

案例实操

  • 把hadoop100机器上的/opt/software目录同步到hadoop102服务器的root用户下的/opt/目录
1
$ sudo rsync -rvl /opt/software/ root@hadoop102:/opt/software

xsync集群分发脚本

需求

循环复制文件到所有节点的相同目录下。

例如hadoop102目录中etc/hadoop下一个配置文件发生改变,让所有节点都同步更新。

需求分析

  • rsync命令原始拷贝
1
$ rsync -rvl /opt/module root@hadoop103:/opt/
  • 期望脚本

xsync要同步的文件名称

在/home/atguigu/bin这个目录下存放的脚本,atguigu用户可以在系统任何地方直接执行。

脚本实现

  • 在/home/atguigu目录下创建bin目录,并在bin目录下xsync创建文件,文件内容如下:
1
2
3
4
[atguigu@hadoop102 ~]$ mkdir bin
[atguigu@hadoop102 ~]$ cd bin/
[atguigu@hadoop102 bin]$ touch xsync
[atguigu@hadoop102 bin]$ vim xsync

在该文件中编写如下代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#!/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
  • 修改脚本 xsync 具有执行权限
1
[atguigu@hadoop102 bin]$ sudo chmod 777 xsync
  • 调用脚本形式:xsync 文件名称
1
[atguigu@hadoop102 ~]$ xsync bin/ 

如果将xsync放到/home/atguigu/bin目录下仍然不能实现全局使用,可以将xsync移动到/usr/local/bin目录下。

集群配置

集群部署规划

hadoop102 hadoop103 hadoop104
HDFS NameNode
DataNode
DataNode SecondaryNameNode
DataNode
YARN NodeManager ResourceManager
NodeManager
NodeManager

NameNode和SecondaryNameNode占用内存1:1,避免放在一台服务器。
ResourceManager是整个集群的保障,需要避开上述两个资源。

配置集群

核心配置文件

  • 配置core-site.xml
1
[atguigu@hadoop102 hadoop]$ vim core-site.xml

在该文件中编写如下配置

1
2
3
4
5
6
7
8
9
10
11
<!-- 指定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
1
2
[atguigu@hadoop102 hadoop]$ vim hadoop-env.sh
export JAVA_HOME=/opt/module/jdk1.8.0_144
  • 配置hdfs-site.xml
1
[atguigu@hadoop102 hadoop]$ vim hdfs-site.xml

在该文件中编写如下配置

1
2
3
4
5
6
7
8
9
10
<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
1
2
[atguigu@hadoop102 hadoop]$ vim yarn-env.sh
export JAVA_HOME=/opt/module/jdk1.8.0_144
  • 配置yarn-site.xml
1
[atguigu@hadoop102 hadoop]$ vim yarn-site.xml

在该文件中增加如下配置

1
2
3
4
5
6
7
8
9
10
11
<!-- 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
1
2
[atguigu@hadoop102 hadoop]$ vim mapred-env.sh
export JAVA_HOME=/opt/module/jdk1.8.0_144
  • 配置mapred-site.xml
1
2
[atguigu@hadoop102 hadoop]$ cp mapred-site.xml.template mapred-site.xml
[atguigu@hadoop102 hadoop]$ vim mapred-site.xml

在该文件中增加如下配置

1
2
3
4
5
<!-- 指定MR运行在Yarn上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>

在集群上分发配置好的Hadoop配置文件

1
[atguigu@hadoop102 hadoop]$ xsync /opt/module/hadoop-2.7.2/

查看文件分发情况

1
2
3
[atguigu@hadoop103 hadoop]$ cat /opt/module/hadoop-2.7.2/etc/hadoop/core-site.xml

[atguigu@hadoop104 ~]$ cat /opt/module/hadoop-2.7.2/etc/hadoop/core-site.xml

集群单点启动

格式化前需要先停止服务然后把data和logs全部清除,对应每个机器都需要执行。

  • (1)如果集群是第一次启动,需要格式化NameNode
1
2
3
[atguigu@hadoop102 hadoop-2.7.2]$ rm -rf data/ logs/

[atguigu@hadoop102 hadoop-2.7.2]$ bin/hdfs namenode -format
  • (2)在hadoop102上启动NameNode
1
2
3
4
[atguigu@hadoop102 hadoop-2.7.2]$ sbin/hadoop-daemon.sh start namenode
[atguigu@hadoop102 hadoop-2.7.2]$ jps
4246 Jps
4175 NameNode
  • (3)在hadoop102、hadoop103以及hadoop104上分别启动DataNode
1
2
3
4
5
6
7
8
9
10
11
12
13
[atguigu@hadoop102 hadoop-2.7.2]$ sbin/hadoop-daemon.sh start datanode
[atguigu@hadoop102 hadoop-2.7.2]$ jps
4334 Jps
4271 DataNode
4175 NameNode
[atguigu@hadoop103 hadoop-2.7.2]$ sbin/hadoop-daemon.sh start datanode
[atguigu@hadoop103 hadoop-2.7.2]$ jps
4080 DataNode
4114 Jps
[atguigu@hadoop104 hadoop-2.7.2]$ sbin/hadoop-daemon.sh start datanode
[atguigu@hadoop104 hadoop-2.7.2]$ jps
4071 DataNode
4107 Jps
  • (4)思考:每次都一个一个节点启动,如果节点数增加到1000个怎么办?

SSH无密登录配置

配置SSH

基本语法

1
ssh 另一台电脑的ip地址

ssh连接时出现Host key verification failed的解决方法

1
2
3
4
5
[atguigu@hadoop102 opt] $ ssh 192.168.1.103
The authenticity of host '192.168.1.103 (192.168.1.103)' can't be established.
RSA key fingerprint is cf:1e:de:d7:d0:4c:2d:98:60:b4:fd:ae:b1:2d:ad:06.
Are you sure you want to continue connecting (yes/no)?
Host key verification failed.

解决方案如下:直接输入yes

无密钥配置

免密登录原理

生成公钥和私钥:

1
2
[atguigu@hadoop102 .ssh]$ ssh-keygen -t rsa
然后敲(三个回车),就会生成两个文件id_rsa(私钥)、id_rsa.pub(公钥)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
[atguigu@hadoop102 hadoop-2.7.2]$ cd
[atguigu@hadoop102 ~]$ ls -all
总用量 60
drwx------. 8 atguigu atguigu 4096 7月 26 03:14 .
drwxr-xr-x. 4 root root 4096 7月 23 06:26 ..
-rw-------. 1 atguigu atguigu 703 7月 23 07:22 .bash_history
-rw-r--r--. 1 atguigu atguigu 18 5月 11 2016 .bash_logout
-rw-r--r--. 1 atguigu atguigu 176 5月 11 2016 .bash_profile
-rw-r--r--. 1 atguigu atguigu 124 5月 11 2016 .bashrc
drwxrwxr-x. 2 atguigu atguigu 4096 7月 26 00:37 bin
drwxr-xr-x. 2 atguigu atguigu 4096 11月 12 2010 .gnome2
drwxr-xr-x. 4 atguigu atguigu 4096 5月 8 04:58 .mozilla
drwxrwxr-x. 2 atguigu atguigu 4096 7月 26 03:14 .oracle_jre_usage
drwx------. 2 atguigu atguigu 4096 7月 26 00:46 .ssh
drwxr-xr-x. 2 atguigu atguigu 4096 7月 26 01:14 .vim
-rw-------. 1 atguigu atguigu 5052 7月 26 03:07 .viminfo
-rw-------. 1 atguigu atguigu 55 7月 25 23:32 .Xauthority
[atguigu@hadoop102 ~]$ cd .ssh
[atguigu@hadoop102 .ssh]$ ll
总用量 4
-rw-r--r--. 1 atguigu atguigu 814 7月 26 00:46 known_hosts
[atguigu@hadoop102 .ssh]$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/atguigu/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/atguigu/.ssh/id_rsa.
Your public key has been saved in /home/atguigu/.ssh/id_rsa.pub.
The key fingerprint is:
b8:d7:d0:14:8a:c4:e0:4b:46:8c:d0:0a:2e:63:4a:84 atguigu@hadoop102
The key's randomart image is:
+--[ RSA 2048]----+
|oo ooo. . |
|E.oo.... . . |
|+. + . . . |
|++ o . . o |
|=. . . S . |
|. . o |
| . . . |
| . |
| |
+-----------------+

将公钥拷贝到要免密登录的目标机器上

1
2
3
[atguigu@hadoop102 .ssh]$ ssh-copy-id hadoop102
[atguigu@hadoop102 .ssh]$ ssh-copy-id hadoop103
[atguigu@hadoop102 .ssh]$ ssh-copy-id hadoop104

还需要在hadoop102上采用root账号,配置一下无密登录到hadoop102、hadoop103、hadoop104;
还需要在hadoop103上采用atguigu账号配置一下无密登录到hadoop102、hadoop103、hadoop104服务器上。
复制之后会多出来一个authorized_keys授权公钥,对自己也需要配置。
NameNode(hadoop102)需要配置ssh分配任务,还需要root配置ssh;ResourceManager(hadoop103)也需要配置ssh。

.ssh文件夹下(~/.ssh)的文件功能解释

文件名 作用
known_hosts 记录ssh访问过计算机的公钥(public key)
id_rsa 生成的私钥
id_rsa.pub 生成的公钥
authorized_keys 存放授权过得无密登录服务器公钥

群起集群

配置slaves

代表datanode的地址,如果写一个主机名和一个ip将会在一台机器启动两个datanode。

1
2
3
4
5
6
7
8
9
# /opt/module/hadoop-2.7.2/etc/hadoop/slaves

[atguigu@hadoop102 hadoop]$ vim slaves

# 在该文件中增加如下内容:

hadoop102
hadoop103
hadoop104

该文件中添加的内容结尾不允许有空格,文件中不允许有空行。

同步所有节点配置文件

1
[atguigu@hadoop102 hadoop]$ xsync slaves

启动集群

如果出现启动datanode或者namenode立马停止,检查root或者其他用户是否有相同进程正在运行。(查看日志文件)

如果集群是第一次启动,需要格式化NameNode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[atguigu@hadoop102 hadoop-2.7.2]$ sbin/hadoop-daemon.sh stop datanode
stopping datanode
[atguigu@hadoop102 hadoop-2.7.2]$ sbin/hadoop-daemon.sh stop namenode
stopping namenode
[atguigu@hadoop102 hadoop-2.7.2]$ jps
4688 Jps

[atguigu@hadoop103 hadoop-2.7.2]$ sbin/hadoop-daemon.sh stop datanode
stopping datanode
[atguigu@hadoop103 hadoop-2.7.2]$ jps
4680 Jps

[atguigu@hadoop104 hadoop-2.7.2]$ sbin/hadoop-daemon.sh stop datanode
stopping datanode
[atguigu@hadoop104 hadoop-2.7.2]$ jps
4363 Jps

(注意格式化之前,一定要先停止上次启动的所有namenode和datanode进程,然后再删除data和log数据)

1
2
3
4
5
[atguigu@hadoop102 hadoop-2.7.2]$ bin/hdfs namenode -format

# 或者

[atguigu@hadoop102 hadoop-2.7.2]$ hadoop namenode -format

启动HDFS

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[atguigu@hadoop102 hadoop-2.7.2]$ sbin/start-dfs.sh
[atguigu@hadoop102 hadoop-2.7.2]$ jps
4166 NameNode
4482 Jps
4263 DataNode

[atguigu@hadoop103 hadoop-2.7.2]$ jps
3218 DataNode
3288 Jps

[atguigu@hadoop104 hadoop-2.7.2]$ jps
3221 DataNode
3283 SecondaryNameNode
3364 Jps

启动YARN

1
[atguigu@hadoop103 hadoop-2.7.2]$ sbin/start-yarn.sh

NameNode和ResourceManger如果不是同一台机器,不能在NameNode上启动 YARN,应该在ResouceManager所在的机器上启动YARN。

Web端查看SecondaryNameNode

集群基本测试

上传文件到集群

  • 上传小文件
1
2
[atguigu@hadoop102 hadoop-2.7.2]$ hdfs dfs -mkdir -p /user/atguigu/input
[atguigu@hadoop102 hadoop-2.7.2]$ hdfs dfs -put wcinput/wc.input /user/atguigu/input
  • 上传大文件
1
[atguigu@hadoop102 hadoop-2.7.2]$ bin/hadoop fs -put /opt/software/hadoop-2.7.2.tar.gz /user/atguigu/input

大文件点击下载会下载整个文件。

上传文件后查看文件存放在什么位置

  • 查看HDFS文件存储路径
1
2
[atguigu@hadoop102 subdir0]$ pwd
/opt/module/hadoop-2.7.2/data/tmp/dfs/data/current/BP-1347968132-192.168.228.102-1595708538420/current/finalized/subdir0/subdir0
  • 查看HDFS在磁盘存储文件内容
1
2
3
4
5
[atguigu@hadoop102 subdir0]$ cat blk_1073741825
hadoop yarn
hadoop mapreduce
atguigu
atguigu

拼接

找到存储路径之后,把分块的文件追加到新的文件。

1
2
3
4
5
6
7
8
9
10
-rw-rw-r--. 1 atguigu atguigu      1366 7月  26 05:30 blk_1073741825
-rw-rw-r--. 1 atguigu atguigu 19 7月 26 05:30 blk_1073741825_1001.meta
-rw-rw-r--. 1 atguigu atguigu 134217728 7月 26 05:32 blk_1073741826
-rw-rw-r--. 1 atguigu atguigu 1048583 7月 26 05:32 blk_1073741826_1002.meta
-rw-rw-r--. 1 atguigu atguigu 63439959 7月 26 05:33 blk_1073741827
-rw-rw-r--. 1 atguigu atguigu 495635 7月 26 05:33 blk_1073741827_1003.meta

[atguigu@hadoop102 subdir0]$ cat blk_1073741836>>tmp.file
[atguigu@hadoop102 subdir0]$ cat blk_1073741837>>tmp.file
[atguigu@hadoop102 subdir0]$ tar -zxvf tmp.file

解压后发现是hadoop-2.7.2,数据完整。

下载

1
[atguigu@hadoop102 hadoop-2.7.2]$ bin/hadoop fs -get /user/atguigu/input/hadoop-2.7.2.tar.gz ./

集群启动/停止方式总结

各个服务组件逐一启动/停止

分别启动/停止HDFS组件

1
$ sbin/hadoop-daemon.sh start/stop namenode/datanode/secondarynamenode

启动/停止YARN

1
$ sbin/yarn-daemon.sh start/stop resourcemanager/odemanager

各个模块分开启动/停止(配置ssh是前提)常用

整体启动/停止HDFS

1
2
$ sbin/start-dfs.sh
$ sbin/stop-dfs.sh

整体启动/停止YARN

1
2
$ sbin/start-yarn.sh
$ sbin/stop-yarn.sh

傻瓜式启动停止

1
2
$ sbin/start-all.sh
$ sbin/stop-all.sh

不建议使用这种方式,先启动hdfs后启动yarn。

集群时间同步

时间同步的方式:找一个机器,作为时间服务器,所有的机器与这台集群时间进行定时的同步,比如,每隔十分钟,同步一次时间。

NTP是网络时间协议(Network Time Protocol),它是用来同步网络中各个计算机的时间的协议。

时间服务器配置(必须root用户)

  • (1)检查ntp是否安装
1
2
3
4
5
6
7
[root@hadoop102 ~]# rpm -qa|grep ntp

ntp-4.2.6p5-10.el6.centos.x86_64
fontpackages-filesystem-1.41-1.1.el6.noarch
ntpdate-4.2.6p5-10.el6.centos.x86_64

[root@hadoop102 ~]# yum install -y ntp
  • (2)修改ntp配置文件
1
[root@hadoop102 ~]# vim /etc/ntp.conf

修改内容如下

a)修改1(授权192.168.1.0-192.168.1.255网段上的所有机器可以从这台机器上查询和同步时间)

1
2
3
4
5
#restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap 

改为(去掉备注)

restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap

b)修改2(集群在局域网中,不使用其他互联网上的时间)

1
2
3
4
5
6
7
8
9
10
11
server 0.centos.pool.ntp.org iburst
server 1.centos.pool.ntp.org iburst
server 2.centos.pool.ntp.org iburst
server 3.centos.pool.ntp.org iburst

改为(注释掉)

#server 0.centos.pool.ntp.org iburst
#server 1.centos.pool.ntp.org iburst
#server 2.centos.pool.ntp.org iburst
#server 3.centos.pool.ntp.org iburst

c)添加3(当该节点丢失网络连接,依然可以采用本地时间作为时间服务器为集群中的其他节点提供时间同步)

1
2
server 127.127.1.0
fudge 127.127.1.0 stratum 10
  • (3)修改/etc/sysconfig/ntpd 文件
1
2
3
4
5
[root@hadoop102 ~]# vim /etc/sysconfig/ntpd

增加内容如下(让硬件时间与系统时间一起同步)

SYNC_HWCLOCK=yes
  • (4)重新启动ntpd服务
1
2
3
[root@hadoop102 ~]# service ntpd status
ntpd 已停
[root@hadoop102 桌面]# service ntpd start
  • (5)设置ntpd服务开机启动
1
[root@hadoop102 桌面]# chkconfig ntpd on

北京

其他机器配置(必须root用户)

  • (1)在其他机器配置10分钟与时间服务器同步一次
1
2
3
4
5
[root@hadoop103 ~]# crontab -e

编写定时任务如下:

*/10 * * * * /usr/sbin/ntpdate hadoop102
  • (2)修改任意机器时间
1
[root@hadoop103 ~]# date -s "2020-7-26 00:15:57"
  • (3)十分钟后查看机器是否与时间服务器同步
1
[root@hadoop103 ~]# date
文章作者: HibisciDai
文章链接: http://hibiscidai.com/2020/07/22/Hadoop运行模式/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 HibisciDai
好用、实惠、稳定的梯子,点击这里