微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

大数据核心组件之HADOOP

1.大数据概述

大数据主要解决:海量数据的存储(TB、PB、EB)和海量数据的分析计算问题

特性:大数据量、多样化、低价值密度

如何快速对有价值数据“提纯”成为目前大数据背景下待解决的难题。

2.大数据技术生态体系

2.1 hadoop

2.1.1 hadoop完全分布式集群搭建

  1. 准备3台虚拟机

  2. 防火墙,静态ip及主机名设置

  3. 添加admin用户账号(也可不添加,直接给root用户添加免密)

    在所有的主机下均建立一个账号admin用来运行hadoop ,并将其添加至sudoers中
    [root@node21 ~]# useradd admin    添加用户通过手动输入修改密码
    [root@node21 ~]# passwd  admin  更改用户 admin 的密码
    123456  passwd: 所有的身份验证令牌已经成功更新。
    设置admin用户具有root权限  修改 /etc/sudoers 文件,找到下面一行,在root下面添加一行,如下所示:
    [root@node21 ~]# visudo
    ## Allow root to run any commands anywhere
    root    ALL=(ALL)     ALL
    admin   ALL=(ALL)     ALL
    修改完毕  :wq! 保存退出,现在可以用admin帐号登录,然后用命令 su - ,切换用户即可获得root权限进行操作
    
  4. 集群部署规划

在这里插入图片描述

  1. 设置ssh免密

    [admin@node21 ~]# ssh-keygen -t rsa
    [admin@node21 ~]# ssh-copy-id node21
    [admin@node21 ~]# ssh-copy-id node22
    [admin@node21 ~]# ssh-copy-id node23
    

[admin@node22 ~]# ssh-keygen -t rsa
[admin@node22 ~]# ssh-copy-id node22
[admin@node22 ~]# ssh-copy-id node21
[admin@node22 ~]# ssh-copy-id node23

[admin@node23 ~]# ssh-keygen -t rsa
[admin@node23 ~]# ssh-copy-id node23
[admin@node23 ~]# ssh-copy-id node21
[admin@node23 ~]# ssh-copy-id node22

6.配置hadoop集群

配置文件修改

core-site.xml
<configuration>
<!-- 指定HDFS中NameNode的地址 -->
  <property>
  <name>fs.defaultFS</name>
  <value>hdfs://cts01:9000</value>
  </property>

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


hadoop-env.sh\mapred-env.sh\yarn-env.sh
export JAVA_HOME=/usr/local/jdk1.8

修改hdfs-site.xml
<configuration>
<!-- 设置dfs副本数,不设置认是3个   -->
    <property>
        <name>dfs.replication</name>
        <value>2</value>
    </property>
<!-- 设置secondname的端口   -->
    <property>
        <name>dfs.namenode.secondary.http-address</name>
        <value>cts02:50090</value>
    </property>
<property>
  <name>dfs.permissions.enabled</name>
  <value>false</value>
  <description>
    If "true", enable permission checking in HDFS.
    If "false", permission checking is turned off,
    but all other behavior is unchanged.
    Switching from one parameter value to the other does not change the mode,
    owner or group of files or directories.
  </description>
</property>
</configuration>

修改slaves
cts01
cts02
cts03
mapred-site.xml
<configuration>
<!-- 指定mr运行在yarn上 -->
    <property>
     <name>mapreduce.framework.name</name>
     <value>yarn</value>
    </property>
<!-- 历史服务器端 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>cts01:10020</value>
</property>
<!-- 历史服务器web地址 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>cts01:19888</value>
</property>
</configuration>

yarn-site.xml
<!-- reducer获取数据的方式 -->
     <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
     </property>
<!-- 指定YARN的ResourceManager的地址 -->
     <property>
        <name>yarn.resourcemanager.hostname</name>
        <value>cts02</value>
     </property>
<!-- Site specific YARN configuration properties -->
<property>
    <name>yarn.nodemanager.pmem-check-enabled</name>
    <value>false</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>
<!-- 日志聚集功能设置 -->
<property>
        <name>yarn.log-aggregation-enable</name>
        <value>true</value>
     </property>

     <property>

7.将包含更改后配置文件的hadoop包分发至cts02\cts03两个节点

scp -r hadoop-2.10.0/ admin@cts02:/opt/
scp -r hadoop-2.10.0/ admin@cts03:/opt/

8.配置环境变量

[admin@cts01 ~]$ sudo vi /etc/profile
末尾追加
export  HADOOP_HOME=/opt/module/hadoop-2.7.6
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
编译生效  source  /etc/profile

9.启动验证

在cts01节点(namenode节点)切换用户,执行以下指令:

su - admin
hdfs namenode -format
start-dfs.sh

在cts02节点(secondarynamenode节点)切换用户,执行:

start-yarn.sh

2.1.2 hadoop常见问题

1.添加用户后,切换用户用su而不是su -,导致后面执行权限不够

修改hadoop文件夹的所有者为新用户:

指令为:chown admin:admin software

修改hadoop-env.sh 添加内容

export JAVA_HOME=/opt/module/jdk1.8

如果namenode启动不了,就重新格式化namenode,在启动hadoop

2.遇到问题要查日志,后台认不打印日志,去/hadoop/logs查

core-site.xml中临时文件目录最好设置为:不然,容易在后面重启hadoop时出现,路径无法访问等问题。不用慌,修改完配置后,执行namnode 格式化(hdfs namenode -format),重启hadoop即可



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

更换集群内hadoop版本,从master分发hadoop包至slaves节点的时候,一定将data和logs文件夹下的东西全删了,否则会报错

3.遗留问题,删除不了nodemanager

日志为:nodemanager did not stop gracefully after 5 seconds: killing with kill -9
https://www.cnblogs.com/ldy233/p/13054246.html

如果使用不同的停止集群方式,比如用kill删除datanode进程,再次启动就会出现报错:Incompatible clusterIDs in /opt/hadoop-2.10.0/data/dfs/data: namenode clusterID = CID-b84762c3-4885-45fb-b4ae-584f2ea2c907; datanode clusterID = CID-4056c365-720f-4594-9432-84f2b2d82e85

解决方法

bin/stop-all.sh 

rm -Rf /opt/hadoop-2.10.0/data/dfs/data/*  (所有datanode节点都要执行)

bin/hadoop namenode -format

4.格式化流程:(1)关掉jps进程;(2)删掉data和logs内所有内容;(3)执行hadoop namenode -format

为什么不能一直格式化

namenode每次格式化后会生成一个新的clusterid,这样就和datanode上旧的clusterid产生冲突。

解决方法:在每次格式化前,先停下进程再删除data目录

5.所有集群搭建完毕,一定要进行功能测试和性能测试

6.启动流程:1.初始化namenode 2.在namenode节点上启动start-dfs.sh脚本 3.在cts02节点启动start-yarn.sh脚本(注意:需要以admin用户执行所有命令行)

2.1.3 xsync集群脚本分发

  1. scp安全传送和rsync传送区别rsync

scp传送文件夹内的所有文件,rsync传送差异化内容,后跟指令-l:软连接;-r:递归;-v:显示传递过程

  1. 集群分发脚本

    mkdir -p /root/bin

    touch xsync

    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=1;host<4;host++)); do
   	   echo -------------------hadoop$host---------------------------
          rsync -rvl $pdir/$fname $user@cts0$host:$pdir
   done

执行

xsync /root/bin

结果:

在这里插入图片描述

在这里插入图片描述

2.1.4 定时任务

crontab -e/l/r 编辑/列出/删除

使用说明:

* * * * *  
第一个*   第几分钟
第二个*   第几小时
第三个*   第几天
第四个*   第几月
第五个*   周几

案例:

touch  /root/banzhang.txt
crontab -e
*/1 * * * * /bin/echo "yanjing" >> /root/banzhang.txt

执行:tail banzhang.txt

在这里插入图片描述

2.2 HDFS

特点:

  • 一次写入,多次读取

  • 分布式文件管理系统中的一种

优点:高容错性,适合处理大数据(数据量和文件数量

缺点:

  • 不适合低延时数据访问;

  • 无法高效的对大量小文件进行存储。(管理消耗namenode内存和寻址增加读取延迟)

组件部分结构:

  • NameNode
  • DateNode(block块大小为128M,主要与磁盘传输速率有关,性能好可以是256M)
  • Client
  • secondaryNameNode(非热备份)

常用指令:

hadoop dfs -moveFromLocal ./zoo.cfg /user/root/input/ 从本地上传文件到hdfs文件系统

hadoop fs -appendToFile ./liubei.txt /user/root/input/zoo.cfg 从本地追加内容到hdfs文件

hadoop fs -chgrp panjinlian /user/root/input/zoo.cfg 修改文件所属组

hadoop fs -copyToLocal /user/root/input/zoo.cfg ./ 从hdfs拷贝文件到本地,等同于get指令

-getmerge 合并下载文件到本地

hadoop fs -du -h / 显示根目录下文件大小

hadoop fs -du -h -s / 显示根目录整个大小

2.3 HDFS客户端

  1. 获取对象

    Configuration conf =new Configuration();
            FileSystem fs= FileSystem.get(new URI("hdfs://cts01:9000"), conf, "root");
    
  2. 具体操作

    fs.mkdirs(new Path("/0530/dashen"));
    
  3. 关闭资源

fs.close();

2.4 NameNode工作机制

  1. 元数据是存储在哪里呢?

    主要存放在内存中,磁盘中元数据(数据索引等)的备份存储在fsimage

    Edits文件内只存储追加操作的内容,例如文件增加等,最终元数据由fsimage+edits合并得到。现实情况中,edits存在大小限制,一旦过大就会出现报错。需要通过Secondary NameNode将fsimage与edits合并更新为fsimage,原edits被清空。

  2. oiv(镜像文件)、oev(编辑日志)查看Fsimage命令
    hdfs oiv -p 文件类型 -i 镜像文件 -o 转换后文件输出路径

  3. checkout触发条件:

    • 达到固定时间
    • 操作次数达到上限,也就是edits满了
  4. NameNode故障处理

使用secondarynamenode的数据,恢复namenode的数据(需要开启HA模式)

2.4 Hadoop格式化重启脚本

#! /bin/bash
# author:chentianshi
# hadoop 格式化重启脚本

function secret_free(){
  #配置免密
  /usr/bin/expect <<-EOF
     set timeout 20
     spawn ssh-copy-id -oStrictHostKeyChecking=no -i /root/.ssh/id_rsa.pub root@${harbor_ip}
     expect {
        "*password:" { send "${password}\r" }
     }
     expect eof
EOF
}

function delete_file(){
rm -rf /opt/hadoop-2.10.0/data/*
rm -rf /opt/hadoop-2.10.0/logs/*
}
#关闭hadoop服务
ssh admin@cts01 "/opt/hadoop-2.10.0/sbin/stop-dfs.sh"
ssh admin@cts02 "/opt/hadoop-2.10.0/sbin/stop-yarn.sh"
echo "hadoop has been stopped"
#删除data/* logs/*
delete_file
ssh root@cts02 "rm -rf /opt/hadoop-2.10.0/data/*;rm -rf /opt/hadoop-2.10.0/logs/*;"
ssh root@cts03 "rm -rf /opt/hadoop-2.10.0/data/*;rm -rf /opt/hadoop-2.10.0/logs/*;"

脚本一般认存放在

/usr/local/sbin

elete_file(){
rm -rf /opt/hadoop-2.10.0/data/*
rm -rf /opt/hadoop-2.10.0/logs/*
}
#关闭hadoop服务
ssh admin@cts01 “/opt/hadoop-2.10.0/sbin/stop-dfs.sh”
ssh admin@cts02 “/opt/hadoop-2.10.0/sbin/stop-yarn.sh”
echo “hadoop has been stopped”
#删除data/* logs/*
delete_file
ssh root@cts02 “rm -rf /opt/hadoop-2.10.0/data/;rm -rf /opt/hadoop-2.10.0/logs/;”
ssh root@cts03 “rm -rf /opt/hadoop-2.10.0/data/;rm -rf /opt/hadoop-2.10.0/logs/;”


脚本一般认存放在

/usr/local/sbin




版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐