Hadoop环境准备

虚拟机环境准备

克隆多台虚拟机

链接克隆

完整克隆

hadoop第二部分_mapreduce

 

 

依次修改克隆出来的ip地址和主机名

ip地址修改
    	vim /etc/sysconfig/network-scripts/ifcfg-eth0
        systemctl restart network
host主机名
    	hostnamectl set-hostname hadoop01
        bash

  hadoop第二部分_jar_02

 

 hadoop第二部分_vim_03

 

修改hosts文件添加映射关系

vim /etc/hosts
10.0.0.1  hadoop101

  hadoop第二部分_hdfs_04

 

 

关闭防火墙

systemctl disable firewalld
systemctl status firewalld
reboot

  

所需软件准备

hadoop的运行需要依赖于java的jdk软件

jdk压缩包

hadoop压缩包(2.X 最新3.X)

 

第三方软件一般都是存储在/opt目录下

该目录下可以创建不同的目录存储不同类型的文件

software

压缩包

module

解压文件

hadoop第二部分_jar_05

 

 

linux系统与windows系统数据交互

借助于linux的lrzsz工具

不单单可以使用命令下载完成后还可以直接在xshell拖拽

借助于python的模块

paramiko模块

hadoop第二部分_jar_06

 

paramiko模块

能够远程链接服务器并执行命令和上传下载文件

支持两种链接服务器的方式

用户名密码

公钥私钥

 

解压文件

tar -zxvf hadoop...tar.gz -C /opt/module/

  hadoop第二部分_vim_07

 

 

环境变量配置

vim /etc/profile
'''添加内容'''
##HADOOP_HOME
export HADOOP_HOME=/opt/module/hadoop-2.7.2 
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
# 使环境变量生效
source /etc/profile

# 查看是否有效
hadoop

  

  hadoop第二部分_mapreduce_08

 

hadoop目录结构

bin

主要服务

hadoop   管理整个hadoop集群

hdfs      管理数据存储

yarn     管理资源调度

etc

hadoop配置文件

sbin

hadoop启动停止、整个集群启动停止

share

说明文档/手册,大量使用案例

 

 

官方案例之Grep过滤
# 1.创建input文件夹
[jason@hadoop101 hadoop-2.7.2]$ mkdir input

# 2.将Hadoop 的xml配置文件复制到input文件夹内
[jason@hadoop101 hadoop-2.7.2]$ cp etc/hadoop/*.xml input/

# 3.从多个文件内过滤出符合条件的文件内容
[jason@hadoop101 hadoop-2.7.2]$ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar grep input/ output 'dfs[a-z.]+'

# 4.查看输出结果
[jason@hadoop101 hadoop-2.7.2]$ cat output/*

hadoop第二部分_hadoop_09

 hadoop第二部分_mapreduce_10

 

官方案例之WordCount
# 1.创建wcinput文件夹
[jason@hadoop101 hadoop-2.7.2]$ mkdir wcinput

# 2.在wcinput 文件下创建一个wc.input 文件
[jason@hadoop101 hadoop-2.7.2]$ cd wcinput
[jason@hadoop101 wcinput]$ touch wc.input

# 3.编辑wc.input文件
[jason@hadoop101 wcinput]$ vim wc.input
'''文件内容'''
hadoop yarn
hadoop mapreduce
jason
jason

# 4.回到 Hadoop 目录/opt/module/hadoop-2.7.2执行程序
[jason@hadoop101 hadoop-2.7.2]$ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar
wordcount wcinput/ wcoutput

# 5.查看结果
cat wcoutput/part-r-00000

  hadoop第二部分_hdfs_11

 

伪分布式模式
# 1./etc/hadoop路径下
vim 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>
"""

# 2./etc/hadoop路径下
vim	hadoop-env.sh
"""
2.1 新建连接查看并拷贝
echo $JAVA_HOME
2.2 修改hadoop-env.sh文件中的JAVA_HOME
export JAVA_HOME = ...
"""

# 3./etc/hadoop路径下
vim	hdfs-site.xml
"""
<!-- 指定 HDFS 副本的数量 --> <property>
<name>dfs.replication</name>
   <value>1</value>
</property>
"""

# 4.退出到hadoop根目录下(hadoop-2.7.2)
# 4.1格式化 NameNode(第一次启动时格式化,以后就不要总格式化)
hdfs namenode - format
# 4.2启动 NameNode
sbin/hadoop-daemon.sh start namenode
# 4.3启动 DataNode
sbin/hadoop-daemon.sh start datanode

# 5.查看是否启动成功
# 5.1命令的形式
jps
'''注意:jps 是 JDK 中的命令,不是 Linux 命令。不安装 JDK 不能使用 jps'''
# 5.2浏览器可视化界面
虚拟机ip地址,端口号50070


# 6.浏览器界面Browse Directory
bin/hdfs dfs -mkdir -p /user/jason/input  
# 与linux操作基本一致
bin/hdfs dfs -ls /


# 7.将hadoop-2.7.2路径下的wcinput文件上传到hdfs路径下
bin/hdfs dfs -put wcinput/wc.input /user/jason/input

# 8.在hdfs上实现字符统计
bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-example-2.7.2.jar wordcount /user/jason/input	/user/jason/output
# 浏览器可视化查看或者命令查看
bin/hdfs dfs -cat /user/jason/ouput/p*

"""
补充
针对已经格式化NameNode想再次格式化,
第一步先用jps查看进程是否已经关闭
第二步将hadoop-2.7.2目录下的data和logs删除
"""

  hadoop第二部分_vim_12

 

hadoop第二部分_vim_13

 

配置历史服务器
# 编辑文件内容
vim etc/hadoop/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>
"""

# 在hadoop-2.7.2路径下启动历史服务器
sbin/mr-jobhistory- daemon.sh start historyserver

# 刷新页面再点击图形化界面history标签

  

分布式

分布式:将一个完整的功能、软件等拆分到不同的机器上运行

伪分布式:在一台机器(服务器,虚拟机)上模拟多台机器的效果

完全分布式:真正在多台机器(服务器 虚拟机)上操作

linux一切皆文件,所有的操作说白了都仅仅是在操作文件从而产生功能效果

50070 # Hadoop HDFS
3306 # MySQL
27017 # MongoDB
6379 # Redis
8088 # Hadoop MapReduce

HDFS是专门用于存储数据的地方

初始化HDFS里面上面数据都没有

  完全分布式

拷贝

本地拷贝

远程拷贝

全量拷贝(scp):每一次都是完完整整的将数据重新加载一份

增量拷贝(rsync):检查是否有重复的项 只加载改动的数据

准备

准备3台客户机

安装 JDK

配置环境变量

安装Hadoop

配置环境变量

配置集群

单点启动

配置 ssh

群起并测试集群

详细步骤

详细:
1)准备 3台客户机(关闭防火墙、静态 ip、主机名称) 
	克隆机器修改主机名和主机IP地址
2)安装 JDK
	利用scp命令拷贝数据文件至三个客户机
  	scp -r /opt/module root@hadoop102:/opt/module
    scp -r /opt/module root@hadoop103:/opt/module
    scp -r /opt/module root@hadoop104:/opt/module
    """
    也可以在A机器将B机器文件拷贝给C机器
    scp -r root@hadoop101:/opt/module root@hadoop103:/opt/module
    """
  # 扩展:拷贝文件的命令有scp(全量拷贝)、rsync(增量拷贝)
  """
  scp(全量拷贝)
  scp    -r       $pdir/$fname       $user@hadoop$host:$pdir/$fname
  命令		递归		要拷贝的文件路径/名称			目的用户@主机:目的路径/名称
  
  rsync(增量拷贝)
  rsync  -rvl     $pdir/$fname	     $user@hadoop$host:$pdir/$fname
  命令	 选项参数	 要拷贝的文件路径/名称		目的用户@主机:目的路径/名称
  参数详解
  	r	递归
  	v	显示复制过程
  	l	拷贝符号连接
  """   
3)配置环境变量
	1.利用scp命令拷贝环境变量文件至三个客户机
  	scp	/etc/profile root@hadoop102:/etc/profile
    scp	/etc/profile root@hadoop103:/etc/profile
    scp	/etc/profile root@hadoop104:/etc/profile
  
  2.source文件配置
  	source /etc/profile
  
  3.验证是否成功
  	java 
4)扩展:集群分发脚本
  复制文件到所有节点的相同目录下
  1.在/usr/local/bin下创建sync文件并填写以下内容
     [jason@hadoop102 ~]$ cd /usr/local/bin
     [jason@hadoop102 bin]$ touch xsync 
     [jason@hadoop102 bin]$ vi xsync
      """
      文件内容
      #!/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
      """
  2.修改权限
  	chmod 777 xsync
  3.测试
  		在当前机器随便找一个其他机器没有的目录
      	xsync test/

  

hadoop第二部分_hdfs_14

 

 hadoop第二部分_hadoop_15

 

 hadoop第二部分_hdfs_16

 

 hadoop第二部分_mapreduce_17

 

 hadoop第二部分_vim_18

 

 hadoop第二部分_hdfs_19

 

 

 单点启动
1.如果集群是第一次启动,需要格式化 NameNode(我们不是 因为前面弄了伪分布式)
	[jason@hadoop102 hadoop-2.7.2]$ hadoop namenode -format
	"""
  如果集群不是第一次启动,需要删除data和logs目录
	[jason@hadoop102 hadoop-2.7.2]$ rm -rf data/ logs/
  [jason@hadoop103 hadoop-2.7.2]$ rm -rf data/ logs/
  [jason@hadoop104 hadoop-2.7.2]$ rm -rf data/ logs/
	""" 
  
2.在 hadoop102 上启动 NameNode和DataNode
	[jason@hadoop102 hadoop-2.7.2]$ sbin/hadoop-daemon.sh start namenode
  [jason@hadoop102 hadoop-2.7.2]$ sbin/hadoop-daemon.sh start datanode

3.去103和104启动datanode(namenode就一个)
	[jason@hadoop103 hadoop-2.7.2]$ sbin/hadoop-daemon.sh start datanode
  [jason@hadoop104 hadoop-2.7.2]$ sbin/hadoop-daemon.sh start datanode
  
4.浏览器验证
	hadoop102:50070

  hadoop第二部分_jar_20

 

 hadoop第二部分_hadoop_21

 

 

集群ssh配置
"""
上述单点启动的方式每次都一个一个节点启动
如果节点数量很多该如何解决
"""
# 公钥私钥工作原理
# 知识补充:查看know_hosts文件(访问过的主机地址)
[jason@hadoop102 ~]$ ll      # 无法查看
[jason@hadoop102 ~]$ ls -al  # 可以查看
[jason@hadoop102 ~]$ cd .ssh
[jason@hadoop102 .ssh]$ ll
[jason@hadoop102 .shh]$ cat known_hosts

# 生成公钥私钥
[jason@hadoop102 .ssh]$ ssh-keygen -t rsa  # 连续回车即可

# 将102公钥拷贝到103和104
[jason@hadoop102 .shh]$ ssh-copy-id hadoop103
[jason@hadoop102 .shh]$ ssh-copy-id hadoop104
"""
hadoop103中的.ssh在拷贝前后文件是有变化的
hadoop104中的.ssh在拷贝前后文件是有变化的
"""

# 免密直接访问103和104
ssh hadoop103/hadoop104

# 自己用ssh访问自己也需要输入密码,可以采用相同措施解决
[jason@hadoop102 .shh]$ ssh-copy-id hadoop102

# 由于hadoop103上有一个resurcemanage所以也需要配置ssh
[jason@hadoop103 .ssh]$ ssh-keygen -t rsa  
[jason@hadoop103 .shh]$ ssh-copy-id hadoop102
[jason@hadoop103 .shh]$ ssh-copy-id hadoop103
[jason@hadoop103 .shh]$ ssh-copy-id hadoop104

  hadoop第二部分_vim_22

 

 

集群群起
1.配置 
 文件位置:/opt/module/hadoop-2.7.2/etc/hadoop/slaves
    
[jason@hadoop102 hadoop]$ vi slaves
"""内容(内容清空再添加)
hadoop102
hadoop103
hadoop104
"""
# 注意:该文件中添加的内容结尾不允许有空格,文件中不允许有空行。

2.同步所有节点配置文件
[jason@hadoop102 hadoop]$ xsync slaves

3.将之前单节点启动的datanode、namenode全部退出
[jason@hadoop102 hadoop-2.7.2]$ sbin/hadoop-daemon.sh stop datanode
[jason@hadoop102 hadoop-2.7.2]$ sbin/hadoop-daemon.sh stop namenode

[jason@hadoop103 hadoop-2.7.2]$ sbin/hadoop-daemon.sh stop datanode

[jason@hadoop104 hadoop-2.7.2]$ sbin/hadoop-daemon.sh stop datanode

4.启动HDFS
[jason@hadoop102 hadoop-2.7.2]$ sbin/start-dfs.sh

5.验证每个节点对于启动的服务
jps查看照着之前的表格比较不能出错

6.启动yarn(一定要在hadoop103上启动 因为rm在这里)
"""
这里需要将hadoop03的公钥分别发送给hadoop102、hadoop103、hadoop104
"""
[jason@hadoop103 hadoop-2.7.2]$ sbin/start-yarn.sh

7.验证每个节点对于启动的服务
jps查看照着之前的表格比较不能出错

  hadoop第二部分_vim_23

 

 hadoop第二部分_hadoop_24

 

 hadoop第二部分_mapreduce_25

hadoop第二部分_hdfs_26

 

 

集群测试
1.上传文件到集群
	1.小文件
  	[jason@hadoop102 hadoop-2.7.2]$ bin/hdfs dfs -put wcinput/wc.input /
2.大文件
  	[jason@hadoop102 hadoop-2.7.2]$ bin/hdfs dfs -put /opt/software/hadoop-2.7.2.tar.gz /
3.浏览器界面测试 

  hadoop第二部分_hdfs_27

 

集群启动停止总结
1. 各个服务组件逐一启动/停止
(1)分别启动/停止 HDFS 组件
hadoop-daemon.sh start/stop namenode/datanode/ secondarynamenode
(2)启动/停止 YARN
yarn-daemon.sh start /stop resourcemanager/nodemanager


2. 各个模块分开启动/停止(配置 ssh 是前提)常用 
(1)整体启动/停止 HDFS
start-dfs.sh/stop-dfs.sh 
(2)整体启动/停止 YARN
start-yarn.sh/stop-yarn.sh

 

集群时间同步
时间同步的方式:找一个机器,作为时间服务器,所有的机器与这台集群时间进行定时 的同步,比如,每隔十分钟,同步一次时间
  
1. 时间服务器配置(必须 root 用户)
(1)检查 ntp 是否安装
	[root@hadoop102 hadoop-2.7.2]# rpm -qa | grep ntp

(2)修改 ntp 配置文件
	[root@hadoop102 hadoop-2.7.2]# vi /etc/ntp.conf

	a)修改1(授权 192.168.1.0-192.168.1.255 网段上的所有机器可以从这台机器上查 询和同步时间)
    # 解开注释
    restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap

	b)修改2(集群在局域网中,不使用其他互联网上的时间)
    # 加上注释
    #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(当该节点丢失网络连接,依然可以采用本地时间作为时间服务器为集群 中的其他节点提供时间同步)
    server 127.127.1.0
    fudge 127.127.1.0 stratum 10

(3)修改/etc/sysconfig/ntpd 文件
  [root@hadoop102 hadoop-2.7.2]$ vim /etc/sysconfig/ntpd
  增加内容如下(让硬件时间与系统时间一起同步)
  SYNC_HWCLOCK=yes

(4)重新启动 ntpd 服务
	[root@hadoop102 桌面]$ service ntpd start
  [root@hadoop102 桌面]$ service ntpd status
  

(5)设置 ntpd 服务开机启动
	[root@hadoop102 桌面]$ chkconfig ntpd on

  
2. 其他机器配置(必须 root 用户)
	分 时 日 月 周
(1)在其他机器配置 1 分钟与时间服务器同步一次
  root@hadoop103 hadoop2-7.2]$ crontab -e
  编写定时任务如下:
    */1 * * * * /usr/sbin/ntpdate hadoop102
  
(2)修改任意机器时间
	[root@hadoop103 ~]$ date -s "2020-11-11 11:11:11"

(3)一分钟后查看机器是否与时间服务器同步
	[root@hadoop103 ~]$ date
  # 测试的时候可以将 10 分钟调整为 1 分钟,节省时间。
  
(4)主动同步时间
	[root@hadoop103 root]$ /usr/sbin/ntpdate hadoop102

  hadoop第二部分_mapreduce_28