Live2D

大数据学习

1.大数据介绍

1.什么是大数据?

大数据(Big Data):指无法在一定时间范围内用常规软件工具进行捕捉、管理和 处理的数据集合,是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化 能力的海量、高增长率和多样化信息资产

按顺序给出数据存储单位:bit、Byte、 KB、MB、GB、TB、PB、EB、ZB、YB、 BB、NB、DB。

1Byte = 8bit 1K = 1024Byte 1MB = 1024K 1G = 1024M 1T = 1024G 1P = 1024T

大数据主要解决,海量数据的采集存储分析计算问题

2.大数据的特点(4V)

1.Volumea(大量)

在当前,个人计算机硬盘容量已经为TB级别,而一些大企业的数据已经EB级别量级

2.Velocity(高速)

在海量的数据面前,处理速度的效率是很高速的

3.Variety(多样)

这种类型的多样性也让数据被分为结构化数据非结构化数据。相对于以往便于存储的 以数据库/文本为主的结构化数据,非结构化数据越来越多,包括网络日志、音频、视频、图 片、地理位置信息等,这些多类型的数据对数据的处理能力提出了更高要求

4.Value(低价值密度)

对有价值的数据进行提纯

3.大数据部门组织结构

image

2.Hadoop

1.Hadoop是什么?

1.Hadoop是一个由Apache基金会所开发的分布式系统基础架构

2.主要解决,海量数据的存储和海量数据的分析计算问题。

3.广义上来说,Hadoop通常是指一个更广泛的概念——分Hadoop生态圈

image

2.Hadoop组成

image

在Hadoop1.x时代,Hadoop中的MapReduce同时处理业务逻辑运算和资源的调度,耦合性较大

image

在Hadoop2.x时代,增 加了YarnYarn只负责 资源的调度,

MapReduce只负责运算。

Hadoop3.x在组成上是没有变化的

3.HDFS架构的概述

Hadoop Distributed File System,简称 HDFS,是一个分布式文件系统。

HDFS一共由三大部分组成

  • NameNode(nn): 主要负责存储文件的元数据,如文件名文件目录结构文件属性(生成时间、副本数、文件权限),以及每个文件的块列表块所在的DataNode等。
  • DataNode(dn):在本地文件系统存储文件块数据,以及块数据的校验和
  • Secondary NameNode(2nn):每隔一段时间对NameNode元数据备份
4.YARN架构概述

Yet Another Resource Negotiator 简称 YARN ,另一种资源协调者,是 Hadoop 的资源管理器

YARN一共由四大部分组成:

  • ResourceManager(RM):整个集群资源(内存、CPU等)的老大
  • NodeManager(NM):单个节点服务器资源老大
  • ApplicationMaster(AM):单个任务运行的老大
  • Container:容器,相当一台独立的服务器,里面封装了

image

5.MapReduce架构

MapReduce 将计算过程分为两个阶段:Map 和 Reduce

  • Map 阶段并行处理输入数据
  • Reduce 阶段对 Map 结果进行汇总
image6.HDFSYARNMapReduce 三者关系

image

7.大数据生态体系

image

以上涉及到的技术名词

  • Sqoop:Sqoop 是一款开源的工具,主要用于在 Hadoop、Hive 与传统的数据库(MySQL) 间进行数据的传递,可以将一个关系型数据库(例如 :MySQL,Oracle 等)中的数据导进 到 Hadoop 的 HDFS 中,也可以将 HDFS 的数据导进到关系型数据库中
  • Flume:Flume 是一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统, Flume 支持在日志系统中定制各类数据发送方,用于收集数据
  • KafkaKafka 是一种高吞吐量的分布式发布订阅消息系统
  • Spark:Spark 是当前最流行的开源大数据内存计算框架。可以基于 Hadoop 上存储的大数 据进行计算
  • Flink:Flink 是当前最流行的开源大数据内存计算框架。用于实时计算的场景较多
  • Oozie:Oozie 是一个管理 Hadoop 作业(job)的工作流程调度管理系统
  • Hbase:HBase 是一个分布式的、面向列的开源数据库。HBase 不同于一般的关系数据库, 它是一个适合于非结构化数据存储的数据库
  • Hive :Hive是基于 Hadoop 的一个数据仓库工具,可以将结构化的数据文件映射为一张 数据库表,并提供简单的 SQL 查询功能,可以将 SQL 语句转换为 MapReduce 任务进行运 行。其优点是学习成本低,可以通过类 SQL 语句快速实现简单的 MapReduce 统计,不必开 发专门的 MapReduce 应用,十分适合数据仓库的统计分析
  • ZooKeeper:它是一个针对大型分布式系统的可靠协调系统,提供的功能包括:配置维护、 名字服务、分布式同步、组服务等
8.Linux 上Hadoop的下载安装
1.找到hadoop官网下载地址,可以根据自己需求下载对应的版本

image

2.然后在Linux上输入以下指令进行下载
wget https://dlcdn.apache.org/hadoop/common/hadoop-3.3.1/hadoop-3.3.1.tar.gz

如果出现以下问题

image

请使用以下命令

wget --no-check-certificate https://dlcdn.apache.org/hadoop/common/hadoop-3.3.1/hadoop-3.3.1.tar.gz
3.下载完成后解压
tar -zxvf  hadoop-3.3.1.tar.gz
4.配置环境变量

配置环境变量,添加以下部分内容

vim /etc/profile
#hadoop
export HADOOP_HOME=/home/wl/hadoop-3.3.1
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin

![image-20211217105154630](/Users/wangliang/Library/Application Support/typora-user-images/image-20211217105154630.png)

在Hadoop后期的版本上需要将各进程用户设为root,需要在环境变量中添加以下内容

#赋权
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

image

这里需要注意一个点,还在配置一下jdk,不然下面启动hdfs会报错

image

需要在 /etc/profile 配置hadoop文件中添加以下内容

export JAVA_HOME=/usr/java/jdk1.8.0_191-amd64

image

然后在找到以下路径的文件,并进行修改

vim /home/wl/hadoop-3.3.1/etc/hadoop/hadoop-env.sh

指定jdk的位置

JAVA_HOME=/usr/java/jdk1.8.0_191-amd64

image

让配置文件生效

source /etc/profile
5.完成后,输入以下指令查看是否安装成功
hadoop version
6.查看目录结构

image

目录的解释说明

  • bin目录:存放对Hadoop相关服务,(hdfs,yarn,mapred)进行操作的脚本
  • etc目录:hadoop的配置文件目录,存放Hadoop的配置文件
  • lib目录:存放Hadoop的本地库,(对数据进行压缩解压缩功能)
  • sbin目录:存放启动或者停止Hadoop相关服务的脚本
  • share目录:存放hadoop的依赖jar包、文档、和官方案例
9.Hadoop运行模式

Hadoop一共包含三种运行模式:

  • 本地模式:单机运行
  • 伪分布模式:也是单机运行,但是具备Hadoop集群的所有功能,一台服务器模 拟一个分布式的环境
  • 完全分布模式:多台服务器组成分布式环境。生产环境使用
10.scp拷贝命令和rsync命令(可以实现服务器之间的数据互传)
1.scp基本语法
scp   -r      $pdir/$fname          $user@$host:$pdir/$fname
命令   递归    要拷贝的文件路径/名称    目的地用户@主机:目的地路径/名称

案例

将自己服务器上的数据拷贝到别的服务器上

scp -r /home/wl/hadoop-3.3.1.tar.gz root@wyp:/home/wyp

将别人服务器上的数据拷贝到自己服务器上

scp -r root@wyp:/home/wyp/go1.16.7.linux-amd64.tar.gz  /home/wl

将别人服务器上的数据拷贝到别人的服务器上

scp -r root@wyp:/home/wyp/go1.16.7.linux-amd64.tar.gz  root@wl:/home/wl
2.rsync语法

rsync 主要用于备份和镜像。具有速度快、避免复制相同内容和支持符号链接的优点。 rsyncscp 区别:用 rsync 做文件的复制要比 scp 的速度快,rsync 只对差异文件做更

新。scp 是把所有文件都复制过去。

rsync  -av       $pdir/$fname       $user@$host:$pdir/$fname
命令   选项参数   要拷贝的文件路径/名称   目的地用户@主机:目的地路径/名称

选项参数说明

选项 功能
-a 归档拷贝
-v 显示复制过程

案例

自己服务器同步数据到别人服务器

rsync -av  /home/wl/hadoop-3.3.1.tar.gz  root@wyp:/home/wyp

从别人服务器同步数据到自己服务器

rsync -av root@wl:/home/wl/hadoop-3.3.1 /home/wl/
11.SSH无密登录配置
1.免密登录原理

image

2.生成公钥和私钥

输入以下指令生成公钥和私钥

ssh-keygen -t rsa

然后敲(三个回车),就会生成两个文件 id_rsa(私钥)、id_rsa.pub(公钥)

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

ssh-copy-id 目标机器ip地址

这里需要将116.62的主机的公钥拷贝到 101和39的主机上,其他两台也是这样

12.单机配置
.卸载虚拟机自带的JDK
rpm -qa | grep -i java | xargs -n1 rpm -e --nodeps

参数解析:

  • rpm -qa:查询所安装的所有rpm软件包

  • grep -i:忽略大小写

  • xargs -n1:表示每次只传递一个参数

  • rpm -e --nodeps:强制卸载软件

下载一个JDK并配置环境变量

这里我是从我的阿里云上面使用scp命令拷贝了一个jdk

 scp  root@wl:/home/wl/jdk-8u191-linux-x64.rpm  /home/wl

解压缩

rpm -ivh jdk-8u191-linux-x64.rpm

image

完成后步骤见8

来到 hadoop的安装目录,找到以下文件进行修改

vim etc/hadoop/core-site.xml
 <!-- 指定 NameNode 的地址 -->

    <property>

        <name>fs.defaultFS</name>

        <value>hdfs://localhost:8020</value>

    </property>

    <!-- 指定 hadoop 数据的存储目录 -->

    <property>

        <name>hadoop.tmp.dir</name>

        <value>/home/wl/hadoop-3.3.1/data</value>

    </property>

    <!-- 配置 HDFS 网页登录使用的静态用户为 atguigu -->

    <property>

        <name>hadoop.http.staticuser.user</name>

        <value>root</value>

    </property>

修改hdfs-site.xml

<configuration>



    <!-- 指定HDFS保存数据副本数量 -->

     <property>

        <name>dfs.replication</name>

        <value>1</value>

     </property>



<!-- 允许在web页面查看,下载文件-->

    <property>

        <name>dfs.webhdfs.enabled</name>

        <value>true</value>

    </property>



</configuration>

修改mapred-site.xml

<configuration>

<!-- 指定 MapReduce 程序运行在 Yarn 上 -->

<property>

  <name>mapreduce.framework.name</name>

  <value>yarn</value>

</property>

</configuration>

修改yarn-site.xml

<configuration>

    <!-- 指定 MR 走 shuffle -->

    <property>

        <name>yarn.nodemanager.aux-services</name>

        <value>mapreduce_shuffle</value>

    </property>

    <!-- 指定 ResourceManager 的地址-->

    <property>

        <name>yarn.resourcemanager.hostname</name>

        <value>localhost</value>

    </property>

</configuration>

第一次启动,需要格式化namenode

hdfs namenode -format

启动hdfs

sbin/start-dfs.sh

启动yarn

sbin/start-yarn.sh

出现这种错误,就是没有设置免密登录,具体操作见11

image

启动完成后,输入

jps查看,是否启动成功

image

2.启动MR的任务出现的错误

在执行wordcount时候 出现了以下错误

image

解决方法:

在Hadoop的 mapred-site.xml中添加以下内容

/home/wl/hadoop-3.3.1 指的是hadoop的安装目录

<property>

 <name>yarn.app.mapreduce.am.env</name>

 <value>HADOOP_MAPRED_HOME=/home/wl/hadoop-3.3.1</value>

 </property>

 

<property>

 <name>mapreduce.map.env</name>

 <value>HADOOP_MAPRED_HOME=/home/wl/hadoop-3.3.1</value>

</property>



<property>

 <name>mapreduce.reduce.env</name>

 <value>HADOOP_MAPRED_HOME=/home/wl/hadoop-3.3.1</value>

</property>
13.集群配置
1.集群职责分布
wl zbc wyp
HDFS Namenode DataNode DataNode SecondaryNameNode DataNode
YARN Nodemanager ResourceManager NodeManager NodeManager
2.四个配置文件的修改

我们来到要修改的是wl主机以下路径下的这四个配置文件

image

添加hosts映射,另外两台机器也要添加

vim
172.25.37.7     wl     #自己机器设置为内网ip,其他的都是外网

wyp   wyp
zbc zbc

修改core-site.xml文件

vim core-site.xml

添加以下内容

<configuration>

    <!-- 指定 NameNode 的地址 -->
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://wl:8020</value>
    </property>
    <!-- 指定 hadoop 数据的存储目录 -->
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/home/wl/hadoop-3.3.1/data</value>
    </property>
    <!-- 配置 HDFS 网页登录使用的静态用户为 atguigu -->
    <property>
        <name>hadoop.http.staticuser.user</name>
        <value>root</value>
    </property>
</configuration>

修改hdfs-site.xml

<configuration>
    <!-- nn web端访问地址-->
    <property>
        <name>dfs.namenode.http-address</name>
        <value>wl:9870</value>
    </property>
    <!-- 2nn web 端访问地址-->
    <property>
        <name>dfs.namenode.secondary.http-address</name>
        <value>wyp:9868</value>
    </property>

    <property>
        <name>dfs.webhdfs.enabled</name>
        <value>true</value>
    </property>
</configuration>

修改mapred-site.xml

<configuration>
<!-- 指定 MapReduce 程序运行在 Yarn 上 -->
<property>
  <name>mapreduce.framework.name</name>
  <value>yarn</value>
</property>
</configuration>

修改yarn-site.xml

<configuration>
    <!-- 指定 MR 走 shuffle -->
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
    <!-- 指定 ResourceManager 的地址-->
    <property>
        <name>yarn.resourcemanager.hostname</name>
        <value>zbc</value>
    </property>
</configuration>

然后将修改的配置文件复制给 101.34.63.113 wyp两台机器上

使用以下命令进行同步配置

rsync -av  /home/wl/hadoop-3.3.1  root@wyp:/home/wyp
rsync -av  /home/wl/hadoop-3.3.1  root@101.34.63.113:/home/wl

修改workers文件(其他两台服务器也需要修改workers文件) 如下

172.26.37.8  #由于是阿里云服务器,这里要写成内网ip,本机写成自己的内网ip,其他的都是外网
wyp
101.34.63.113

常见问题总结:常见问题总结

14.HDFS的Shell操作
上传操作

首先在hdfs上创建一个文件夹为 sanguo,输入以下指令

hadoop fs -mkdir /sanguo

1.-moveFromLocal:从本地文件系统中剪切到HDFS中

首先来到hadoop的操作目录下

cd /home/wl/hadoop-3.3.1

写本地文件

vim shuguo.txt 

然后使用以下命令执行剪切

hadoop fs -moveFromLocal shuguo.txt /sanguo

2.-put:从本地文件系统中拷贝文件到 HDFS 路径去

写本地文件

vim wuguo.txt

拷贝

hadoop fs -put wuguo.txt /sanguo

3.-appendToFile:追加一个文件到一个已经存在的文件的末尾

写本地文件

vim liubei.txt 

追加

hadoop fs -appendToFile liubei.txt   /sanguo/shuguo.txt
下载操作

1.-get:从HDFS拷贝到本地

hadoop fs -get /sanguo/shuguo.txt shuguo2.txt
直接操作

1.-ls:显示目录信息

hadoop fs -ls /

image

2.-cat:显示文件内容

hadoop fs -cat /sanguo/weiguo.txt

image

3.-chgrp、-chmod、-chown:修改文件所属权限

hadoop fs -chmod 666  /input

image

4.-mkdir:在HDFS上创建路径

hadoop fs -mkdir /test

image

5.-cp:从HDFS的一个路径拷贝到HDFS上的另外一个路径

hadoop fs -cp /test /input

image

6.-mv:在HDFS目录中移动文件

hadoop fs -mv /sanguo/weiguo.txt /test

image

7.-tail:显示一个文件的末尾数据

hadoop fs -tail /test/weiguo.txt

image

8.-rm:删除文件或文件夹

hadoop fs -rm  /test

9.rm -r:递归删除目录及目录里面的内容

hadoop fs -rm -r /test

image

10.-du:统计文件夹的大小信息

hadoop fs -du /jinguo

image

7表示一个文件的大小,21表示是三个副本的总和 3*7

11.-setrep:设置HDFS中文件的副本数量

15.java连接HDFS
1.新建maven工程,依赖如下
  <dependencies>

    <!--连接hadoop-->

    <dependency>

      <groupId>org.apache.hadoop</groupId>

      <artifactId>hadoop-client</artifactId>

      <version>3.1.3</version>

    </dependency>

    <dependency>

      <groupId>junit</groupId>

      <artifactId>junit</artifactId>

      <version>4.12</version>

    </dependency>

    <dependency>

      <groupId>org.slf4j</groupId>

      <artifactId>slf4j-log4j12</artifactId>

      <version>1.7.30</version>

    </dependency>

    <!--糊涂工具包-->

    <dependency>

      <groupId>cn.hutool</groupId>

      <artifactId>hutool-all</artifactId>

      <version>5.7.17</version>

    </dependency>



  </dependencies>
2.项目代码如下
package com.oasis;



import cn.hutool.core.date.DateUtil;

import org.apache.hadoop.conf.Configuration;

import org.apache.hadoop.fs.*;

import org.junit.After;

import org.junit.Before;

import org.junit.Test;



import java.io.IOException;

import java.net.URI;

import java.net.URISyntaxException;

import java.util.Arrays;

import java.util.Date;





public class HDFSClient {

    private FileSystem fs;



    @Before // 在@Test方法执行前执行

    public void connectInit() throws URISyntaxException, IOException, InterruptedException {

        Configuration config = new Configuration();

        // 配置文件的优先级   hdfs-default.xml < hdfs-site.xml < resources资源目录下的配置文件 < 代码配置里面的文件

        // 配置副本数

        config.set("dfs.replication","2");

        // 获取文件系统

        fs = FileSystem.get(new URI("hdfs://wl:8020"),config , "root");

    }

    @After

    public void close() throws IOException {

        // 关闭资源

        fs.close();

    }



    // 创建文件夹

    @Test

    public void mkidr() throws IOException {

        // 创建目录

        fs.mkdirs(new Path("/wl"));



    }



    // 上传文件

    @Test

    public void  upload() throws IOException {

        // 上传文件

        /**

         * boolean delSrc         是否将原文件删除

         * boolean overwrite      是否允许覆盖

         * Path src               原文件路径

         * Path dst               目标路径

         */

        fs.copyFromLocalFile(false,true,new Path("src/main/resources/test.txt"),new Path("/"));

    }



    // 下载文件

    @Test

    public void download() throws IOException {

        /**

         * boolean delSrc                    是否将原文件删除

         * Path src                          下载文件的路径

         * Path dst                          指定文件下载到哪个路径

         * boolean useRawLocalFileSystem     是否开启文件校验

         */

        fs.copyToLocalFile(false,new Path("/jinguo"),new Path("src/main/resources/"),true);

    }

    // 文件的改名和移动

    @Test

    public void rename() throws IOException {

        /**

         * Path src     要修改或者移动的路径

         * Path dst     修改后或者移动后的

         */

        // 修改文件名

        // fs.rename(new Path("/wl/upload.txt"),new Path("/wl/uploads.txt"));

        // 移动文件位置并改名

        fs.rename(new Path("/wl/uploads.txt"),new Path("/sanguo/upload.txt"));

    }

    // 文件的删除

    @Test

    public void remove() throws IOException {

        /**

         * Path f               需要删除的文件路径

         * boolean recursive    是否递归删除

         */



        // 不递归删除

//        fs.delete(new Path("/wl"),false);

        // 递归删除

        fs.delete(new Path("/sanguo"),true);

    }



    // 文件详情的查看

    @Test

    public  void detail() throws IOException {

        /**

         * final Path f             文件路径

         * final boolean recursive  是否递归查看

         */

        RemoteIterator<LocatedFileStatus> listFiles = fs.listFiles(new Path("/"), true);

        while (listFiles.hasNext()){

            LocatedFileStatus file = listFiles.next();

            System.out.println("文件的权限:"+file.getPermission());

            System.out.println("文件的创建者:"+file.getOwner());

            System.out.println("所属组:"+file.getGroup());

            System.out.println("文件大小:"+file.getLen());

            System.out.println("文件的修改时间"+ DateUtil.format(new Date(file.getModificationTime()),"yyyy-MM-dd HH:ss:mm"));

            System.out.println("副本数:"+file.getReplication());

            System.out.println("文件块大小:"+file.getBlockSize());

            System.out.println("文件名称:"+file.getPath().getName());

            // 获取块信息

            BlockLocation[] blockLocations = file.getBlockLocations();

            System.out.println("块"+Arrays.toString(blockLocations));



            System.out.println("========分隔==========");

        }





    }

    // 文件和文件夹的判断

    @Test

    public void isDirectory() throws IOException {

        FileStatus[] fileStatuses = fs.listStatus(new Path("/"));

        for (FileStatus status : fileStatuses) {

          if (status.isFile()){

              System.out.println("文件:"+status.getPath().getName());

          } else {

              System.out.println("文件夹:"+status.getPath().getName());

          }

        }

    }





}
posted @ 2021-12-16 16:52  没有梦想的java菜鸟  阅读(124)  评论(0编辑  收藏  举报