Hadoop的搭建及节点管理

大数据与Hadoop

  • hadoop是一种分析和处理海量数据的软件平台
  • hadoop是一款开源软件,使用JAVA开发
  • hadoop可以提供一个分布式基础架构

Hadoop特点

  • 高可靠性,高扩展性,高效性,高容错性,低成本

Hadoop的核心组件

  • HDFS: hadoop分布式文件系统
  • Mapreduce: 分布式计算框架
  • Yarn: 集群资源管理系统
    在这里插入图片描述
    在这里插入图片描述

Hadoop模式

  • 单机
  • 伪分布式
  • 完全分布式

部署Hadoop单机版

[root@ecs-hadoop1 ~]# yum -y install java-1.8.0-openjdk java-1.8.0-openjdk-devel
[root@ecs-hadoop1 ~]# tar -zxvf hadoop-2.7.7.tar.gz 
[root@ecs-hadoop1 ~]# mv hadoop-2.7.7 /usr/local/hadoop
修改hadoop的运行脚本文件指定java_home安装目录
[root@ecs-hadoop1 ~]# rpm -ql  java-1.8.0-openjdk  #列出软件包安装路径
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.252.b09-2.el7_8.x86_64/jre/bin/policytool
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.252.b09-2.el7_8.x86_64/jre/lib/amd64/libawt_xawt.so
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.252.b09-2.el7_8.x86_64/jre/lib/amd64/libjawt.so
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.252.b09-2.el7_8.x86_64/jre/lib/amd64/libjsoundalsa.so
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.252.b09-2.el7_8.x86_64/jre/lib/amd64/libsplashscreen.so
/usr/share/applications/java-1.8.0-openjdk-1.8.0.252.b09-2.el7_8.x86_64-policytool.desktop
/usr/share/icons/hicolor/16x16/apps/java-1.8.0-openjdk.png
/usr/share/icons/hicolor/24x24/apps/java-1.8.0-openjdk.png
/usr/share/icons/hicolor/32x32/apps/java-1.8.0-openjdk.png
/usr/share/icons/hicolor/48x48/apps/java-1.8.0-openjdk.png

[root@ecs-hadoop1 ~]# cd /usr/local/hadoop/
[root@ecs-hadoop1 hadoop]# vim etc/hadoop/hadoop-env.sh  #修改环境脚本文件
修改25export JAVA_HOME="/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.252.b09-2.el7_8.x86_64/jre" #指定java安装路径
修改33export HADOOP_CONF_DIR=${HADOOP_CONF_DIR:-"/usr/local/hadoop/etc/hadoop"}  #指定hadoop配置文件路径

[root@ecs-hadoop1 hadoop]# cd /usr/local/hadoop
[root@ecs-hadoop1 hadoop]# mkdir oo #创建统计目录
[root@ecs-hadoop1 hadoop]# cp *.txt oo  #收集数据材料
[root@ecs-hadoop1 hadoop]# ls oo
LICENSE.txt  NOTICE.txt  README.txt

[root@ecs-hadoop1 hadoop]# ./bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.7.jar  wordcount oo xx
命令含义解释:
./bin/hadoop 表示运行hadoop
jar 表示调用一个jar文件(程序员开发出来的jar文件)
share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.7.jar  jar文件路径
wordcount 统计哪个单词出现的次数最多
oo  表示要统计的目录
xx  表示分析完的结果放哪里

[root@ecs-hadoop1 hadoop]# ls  #统计完成后就会出现一个xx的目录,这里存放这统计结果	
bin  include  libexec      NOTICE.txt  README.txt  share
etc  lib      LICENSE.txt  oo          sbin        xx

[root@ecs-hadoop1 xx]# ls
part-r-00000 #表示处理完的结果文件		 _SUCCESS #表示分析成功

伪分布式介绍

伪分布式和完全分布式类似,伪分布式主要用于学习和测试,几乎是将所有角色都安装在一台主机上,使用本地磁盘

分布式文件系统HDFS介绍

HDFS角色及概念

  • Client: 切分文件,访问HDFS,与namenode交互获取文件位置信息,与Datanode交互读取和写入数据
  • Namenode : Master节点,配置副本策略(存几份),处理所有客户端请求
  • Secondarynode: 定期合并fsimages(文件映像)和fsedits(补丁),推送给namedone
  • Datanode : 数据存储节点,汇报存储信息给namenode
    在这里插入图片描述

搭建完全分布式

首先搭建分布式文件系统HDFS
在这里插入图片描述
基础准备

  • 禁用selinux
  • 卸载firewalld
  • 安装java-1.8.0-openjdk-devel 和 java-1.8.0-openjdk
  • 修改主机名映射文件
  • 修改3个配置文件
配置主机名映射文件
[root@hadoop1 ~]# vim /etc/hosts
192.168.1.60 hadoop1
192.168.1.61 node-0001
192.168.1.62 node-0002
192.168.1.63 node-0003

部署密钥(包括本机)要求不需要密码就可以登录其他节点
for i in  hadoop1 node-0001 node-0002 node-0003
> do  
> ssh-copy-id root@$i; done
> done

修改ssh配置文件(远程连接时不需要输入yes)
[root@hadoop1 ~]# vim /etc/ssh/ssh_config
在第60行添加     StrictHostKeyChecking no
:wq
[root@hadoop1 ~]# systemctl restart sshd

官方文档地址 http://hadoop.apache.org/docs/r2.7.7/

修改hadoop的核心配置文件core-site
[root@hadoop1 ~]# cd /usr/local/hadoop/etc/hadoop/
[root@hadoop1 hadoop]# vim core-site.xml
<configuration>  #所有的参数必须放在这里面
    <property>
        <name>fs.defaultFS</name>  #集群使用什么存储介质
        <value>hdfs://hadoop1:9000</value>  #指定hdfs的namenode
    </property>
    <property>
        <name>hadoop.tmp.dir</name> #指定数据存储的根目录
        <value>/var/hadoop</value>
    </property>
</configuration>


配置hdfs-site文件
[root@nn01 hadoop]# vim hdfs-site.xml
<configuration>
    <property>
        <name>dfs.namenode.http-address</name> #namenode的地址
        <value>hadoop1:50070</value>  #hadoop1必须能ping通
    </property>
    <property>
        <name>dfs.namenode.secondary.http-address</name> #secondary namenode地址
        <value>hadoop1:50090</value>
    </property>
    <property>
        <name>dfs.replication</name>  #副本数量(存几份)
        <value>2</value> #存两份
    </property>
</configuration>


修改slaves文件,指定node节点是谁
[root@nn01 hadoop]# vim slaves  
node-0001 #必须能ping通
node-0002
node-0003

编写palybook批量部署其他节点

[root@hadoop1 ~]# vim /root/hadoop.yml
---
- name: install hadoop
  hosts: hadoop
  tasks:
    - name: 删除防火墙
      yum: name=firewalld-* state=removed
    - name: 安装java环境
      yum: name=java-1.8.0-openjdk,java-1.8.0-openjdk-devel state=installed
    - name: 安装hadoop
      synchronize: 
        src: /usr/local/hadoop #直接同步hadoop的目录,hadoop后面不带/就代表把hadoop目录也同步过去
        dest: /usr/local/
    - name: 同步主机名映射文件
      copy: src=/etc/hosts dest=/etc/hosts
    - name: 同步配置文件  #后期修改配置文件时可以直接调用标签
      tags: sync_conf
      template:
        src: "{{ item }}"
        dest: /usr/local/hadoop/etc/hadoop/
        owner: root
        group: root
        mode: 0644
      with_items:
        - /usr/local/hadoop/etc/hadoop/hadoop-env.sh
        - /usr/local/hadoop/etc/hadoop/core-site.xml
        - /usr/local/hadoop/etc/hadoop/hdfs-site.xml
        - /usr/local/hadoop/etc/hadoop/slaves

[root@hadoop1 ~]# ansible-playbook hadoop.yml  --syntax-check
[root@hadoop1 ~]# ansible-playbook hadoop.yml

格式化

[root@hadoop1 hadoop]# mkdir /var/hadoop      #创建hadoop的数据根目录
[root@hadoop1 hadoop]# ./bin/hdfs namenode -format  #格式化namenode
[root@hadoop1 hadoop]# ./sbin/start-dfs.sh  #启动hadoop
[root@hadoop1 hadoop]# jps  #验证角色
4388 NameNode
4682 Jps
4573 SecondaryNameNode

[root@hadoop1 hadoop]# ansible hadoop -m shell -a'jps' #查看节点角色
node-0001 | SUCCESS | rc=0 >>
21320 Jps
21166 DataNode

node-0003 | SUCCESS | rc=0 >>
21346 Jps
21192 DataNode

node-0002 | SUCCESS | rc=0 >>
21366 Jps
21212 DataNode

集群验证
[root@hadoop1 hadoop]# ./bin/hdfs dfadmin -report #查看各个节点信息
在这里插入图片描述

部署 Mapreduce和Yarn组件

在准备好的环境下给master (nn01)主机添加ResourceManager的角色,在node1,node2,node3上面添加NodeManager的角色
在这里插入图片描述

配置mapred-site
[root@hadoop01 ] # cd /usr/local/hadoop/etc/hadoop/
[root@hadoop01 hadoop]# mv mapred-site.xml.template mapred-site.xml
[root@hadoop01 hadoop]# vim mapred-site.xml
<configuration>
   <property>
        <name>mapreduce.framework.name</name>  #指定管理类
        <value>yarn</value>
    </property>
</configuration>

配置yarn-site
[root@hadoop1 hadoop]# vim yarn-site.xml 
<configuration>
   <property>
        <name>yarn.resourcemanager.hostname</name>  #指定resourcemanager位置
        <value>hadoop1</value>
    </property>
    <property>
        <name>yarn.nodemanager.aux-services</name>  #计算框架
        <value>mapreduce_shuffle</value>  #名称
    </property>
</configuration>

同步配置
[root@hadoop1 hadoop]# for i in node-0001 node-0002 node-0003
> do
> scp /usr/local/hadoop/etc/hadoop/mapred-site.xml root@$i:/usr/local/hadoop/etc/hadoop/mapred-site.xml
> done

[root@hadoop1 hadoop]# for i in node-0001 node-0002 node-0003
> do
> scp /usr/local/hadoop/etc/hadoop/yarn-site.xml  root@$i:/usr/local/hadoop/etc/hadoop/yarn-site.xml
> done

[root@hadoop1 hadoop]# ./sbin/start-yarn.sh #启动yarn

验证
[root@hadoop1 hadoop]# jps
2499 Jps
2390 SecondaryNameNode
2198 NameNode
1750 ResourceManager
1086 WrapperSimpleApp

[root@hadoop1 hadoop]# ansible hadoop -m shell -a'jps'  #再次查看各个节点身份
node-0003 | SUCCESS | rc=0 >>
1671 NodeManager
2023 Jps
1864 DataNode
1102 WrapperSimpleApp

node-0001 | SUCCESS | rc=0 >>
1104 WrapperSimpleApp
1896 DataNode
1674 NodeManager
2026 Jps

node-0002 | SUCCESS | rc=0 >>
1896 DataNode
1096 WrapperSimpleApp
1674 NodeManager
2026 Jps

[root@hadoop1 hadoop]# ./bin/yarn node -list  #查看yarn节点
20/07/05 19:30:33 INFO client.RMProxy: Connecting to ResourceManager at hadoop1/192.168.1.60:8032
Total Nodes:3
         Node-Id	     Node-State	Node-Http-Address	Number-of-Running-Containers
 node-0002:41311	        RUNNING	   node-0002:8042	                           0
 node-0003:32822	        RUNNING	   node-0003:8042	                           0
 node-0001:36311	        RUNNING	   node-0001:8042	                           0

web访问hadoop
http://hadoop1:50070/       #namenode 
http://hadoop1:50090/       #secondory namenode 
http://node(xx):50075/       #datanode (node1,node2,node3)
http://hadoop1:8088/        #resourcemanager
http://node(xx):8042/        #nodemanager (node1,node2,node3)

Hadoop的使用

案例1 Hadoop词频统计

  • 在集群文件系统里创建文件夹
  • 上传要分析的文件到目录中
  • 分析上传文件
  • 展示结果
[root@hadoop1 ~]# cd /usr/local/hadoop/
[root@hadoop1 hadoop]# ./bin/hadoop  fs  -mkdir /input  #创建目录
[root@hadoop1 hadoop]# ./bin/hadoop  fs  -ls /    #./bin/hadoop  fs  - 为固定格式 后面跟命令
drwxr-xr-x   - root supergroup          0 2020-07-05 19:49 /input
[root@hadoop1 hadoop]# ./bin/hadoop  fs  -touchz /file1  #创建文件
[root@hadoop1 hadoop]# ./bin/hadoop  fs  -ls /
-rw-r--r--   2 root supergroup          0 2020-07-05 19:50 /file1
drwxr-xr-x   - root supergroup          0 2020-07-05 19:49 /input
[root@hadoop1 hadoop]# ./bin/hadoop fs -get /file1 /root/  #从hdfs上下载文件
[root@hadoop1 hadoop]# ./bin/hadoop fs -put *.txt  /input   #从本地上传文件到hdfs
[root@hadoop1 hadoop]# ./bin/hadoop fs -ls /input 
Found 3 items
-rw-r--r--   2 root supergroup      86424 2020-07-05 19:52 /input/LICENSE.txt
-rw-r--r--   2 root supergroup      14978 2020-07-05 19:52 /input/NOTICE.txt
-rw-r--r--   2 root supergroup       1366 2020-07-05 19:52 /input/README.txt

[root@hadoop1 hadoop]# ./bin/hadoop jar  \
share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.7.jar  wordcount  /input  /output #hadoop集群分析大数据,hadoop集群/input里的数据存到hadoop集群/output下

[root@hadoop1 hadoop]# ./bin/hadoop fs -ls /output #查看分析完的目录
Found 2 items
-rw-r--r--   2 root supergroup          0 2020-07-05 20:02 /output/_SUCCESS
-rw-r--r--   2 root supergroup      30290 2020-07-05 20:02 /output/part-r-00000
[root@hadoop1 hadoop]#  ./bin/hadoop fs -get /output/part-r-00000  .   #将统计完的文件下载到本地
[root@hadoop1 hadoop]#  ./bin/hadoop fs -cat /output/part-r-00000  #或者直接使用cat查看结果文件


也可以利用web网站查看分析的目录文件(但是统计完的文件需要下载才能看)
在这里插入图片描述
在这里插入图片描述

HDFS增加节点

  • 修改/etc/hosts
  • 同步配置文件/usr/local/hadoop
  • 卸载防火墙,禁用selinux
  • 拷贝公钥给新的节点
  • 启动节点 Datenode
  • 设置带宽(为新节点分配数据)
  • 在master主节点查看
[root@hadoop1 ~]# vim /etc/hosts
192.168.1.60	hadoop1
192.168.1.61	node-0001
192.168.1.62	node-0002
192.168.1.63	node-0003
192.168.1.64    newnode

[root@hadoop1 ~]# ssh-copy-id  root@newnode 
[root@hadoop1 ~]# vim /usr/local/hadoop/etc/hadoop/slaves  #添加指定新节点
node-0001
node-0002
node-0003
newnode
[root@hadoop1 ~]# ansible-playbook hadoop.yml  #使用ansible部署新节点

去新的节点启动datanode

[root@newnode hadoop]# ./sbin/hadoop-daemon.sh start datanode #启动datenode
[root@newnode hadoop]# jps  #验证
1393 WrapperSimpleApp
9813 DataNode
9885 Jps

设置同步带宽(为新节点分配数据单位字节)
[root@newnode hadoop]# ./bin/hdfs dfsadmin -setBalancerBandwidth 60000000

返回hadoop1查看集群成员

[root@hadoop1 hadoop]# ./bin/hdfs dfsadmin -report

在这里插入图片描述
当我们的数据量没有预估的那么大时就需要下线节点,节省资源
HDFS下线节点

  • HDFS 删除节点状态
  • 查看状态 ./bin/hdfs dfsadmin -report
  • Normal: 正常状态
  • Decommissioned in program: 数据正在迁移
  • Decommissioned: 数据迁移完成
  • 注意:仅当状态变成Decommissioned才能down机下线
[root@hadoop1 hadoop]# vim /usr/local/hadoop/etc/hadoop/slaves        
//去掉之前添加的newdode
node1
node2
node3

[root@hadoop1 hadoop]# vim /usr/local/hadoop/etc/hadoop/hdfs-site.xml        
//在此配置文件里面加入下面四行
<property>                                      
    <name>dfs.hosts.exclude</name>  #表示下线节点
    <value>/usr/local/hadoop/etc/hadoop/exclude</value> #下线节点的存放路径
</property>

[root@hadoop1 hadoop]# vim /usr/local/hadoop/etc/hadoop/exclude  #将需要下线的节点写入定义的配置文件
node4

导出数据
[root@hadoop1 hadoop]# ./bin/hdfs dfsadmin -refreshNodes  #将下线主机的数据导入到其他主机上
[root@nn01 hadoop]# ./bin/hdfs dfsadmin -report  #查看newnode显示Decommissioned时才可下线主机

下线机器
[root@newnode ~]# cd /usr/local/hadoop/
[root@newnode hadoop]#./sbin/hadoop-daemon.sh stop datanode    //停止datanode

[root@node4 hadoop]# ./sbin/yarn-daemon.sh start nodemanager             
//yarn 增加 nodemanager
[root@node4 hadoop]# ./sbin/yarn-daemon.sh stop  nodemanager  //停止nodemanager
stopping nodemanager
[root@node4 hadoop]# ./bin/yarn node -list        
//yarn 查看节点状态,还是有node4节点,要过一段时间才会消失
Total Nodes:4
         Node-Id         Node-State    Node-Http-Address    Number-of-Running-Containers
     node3:34628            RUNNING           node3:8042                               0
     node2:36300            RUNNING           node2:8042                               0
     node4:42459            RUNNING           node4:8042                               0
     node1:39196            RUNNING           node1:8042                               0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值