Hadoop大数据解决方案学习笔记整理

±±+ Hadoop ±±+


一、配置方面

解压方面

  1. linux解压zip文件,命令:unzip 如果没有该命令,可先安装,命令为:yum -y install unzip

  2. 解压
    unzip hadoop-2.6.0-cdh5.14.2.zip

  3. 解压jdk到/opt/install目录下

    [hadoop@hadoop101 software]$ tar -zxvf jdk-8u161-linux-x64.tar.gz -C /opt/install/

  4. 创建快捷方式

    ln -s hadoop-2.6.0-cdh5.14.2 hadoop

=设置 hadoop用户=

1.添加用户组 dev

groupadd dev

2.创建hodoop用户 并归属dev组

useradd -g dev hadoop

3.给hadoop设置密码

passwd hadoop

5.切换hadoop用户

su hadoo

2. Hadoop的一些常用命令

#启动hadoop
cd /opt/install/hadoop
sbin/start-all.sh
#关闭hadoop
sbin/stop-all.sh

hadoop fs -mkdir /input    --在hdfs系统上 根目录下 创建 input文件夹
hadoop fs -ls /            --查看某个 目录下的文件
hadoop fs -put /software/hello.txt /input   --将虚拟机本地的文件 上传到 hdfs系统的某个目录下

--执行hadoop自带的jar包 运行MapReduce程序
hadoop jar /opt/install/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0-cdh5.14.2.jar wordcount /input /output/wordcount1

--进行查看结果
hadoop fs -cat /output/wordcount1/*

--nameNode退出安全模式
hadoop dfsadmin -safemode leave

--运行某个jar文件
 hadoop jar /opt/test/dd-1.0-SNAPSHOT.jar com.mapred.WordCount
 
 --启动hbase
cd /opt/install/hbase
bin/start-hbase.sh

--切换hbase的shell语句
hbase shell

--关闭hbase
stop-hbase.sh
hbase shell语句
#查看
list
#创建表
create '表名','列族1','列族2'......
#查看指定表的列族详细信息(描述表)
describe '表名'
#添加数据
put '表名称','行键','列键','值'

#扫描表:scan 能看列族 列的数据
#缺点:不能看一行的数据
scan '表名称',{COLUMNS=>['列族名1','列族名2',……],参数名=>参数值…}
‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
scan 'scores'
scan 'scores',{COLUMN=>'course'}
‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
scan '表名称',{COLUMN=>['列键1','列键2',……],参数名=>参数值…}
scan 'scores',{COLUMN=>'course:math',LIMIT=>1} # LIMIT 显示的条数
#获取数据:get 获取行的所有单元或者某个指定的单元
#表名和行键必须指定
get '表名称','行键',{COLUMNS=>['列族名1','列族名2'],参数名=>参数值…}
get '表名称','行键',{COLUMN=>['列键1','列键2'],参数名=>参数值…}
get 'scores','tom'
‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
get 'scores','tom',{COLUMNS=>'course'}
‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
get 'scores','tom',{COLUMN=>'course:math'}
‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐#查列+列族 2个列
get 'scores','tom',{COLUMN=>['course:math', 'grade:']}
等同于====get 'scores','jason','course: math', 'grade:'
‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐#按版本号查
get 'scores','jason',{COLUMN=>'course:math',TIMESTAMP=>1584427964068}
#删除数据
#delete:删除一个列
delete '表名称','行键','列键'
delete 'scores','jason','course:math'
#deleteall:删除一行
deleteall '表名称','行键'
deleteall 'scores','tom'
#修改表:alter 增加或修改表的列族,列族名存在则修改否则增加
alter '表名称',参数名=>参数值,...
alter '表名称',{参数名=>参数值,...}, {参数名=>参数值,...}…
alter 'scores',NAME=>'course',VERSIONS=>'5'
alter 'scores',{NAME=>'grade',VERSIONS=>'5'},{NAME=>'course',
VERSIONS=>'5'}
#删除表:drop
disable '表名' #设置表不可用
drop '表名' #删除
disable 'scores'
drop 'scores'
‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
enable '表名' #将表变成可用状态

二、Hadoop入门

1. 什么是大数据?

①大数据的定义

​ 是指无法在一定时间内常规软件工具对齐内容进行抓取,管理和处理的数据集合

大数据特点

  1. ​ 体量巨大

  2. ​ 数据类型多样,以非结构化数据为主

  3. ​ 价值密度低

  4. ​ 产生和要求处理速度快

大数据处理系统

​ Hadoop、Spark、Stom等

2. 大数据就业方向

  1. 大数据系统研发工程
  2. 大数据应用开发工程师
  3. 大数据可视化工程师
  4. 大数据分析师

3. Hadoop体系结构

① Hadoop的优势

​ 低成本 高扩展性 高效性 高容错性

② Hadoop可以做什么

分布式存储(HDFS)

分布式计算(MapReduce)

更方便的存储数据(HBase)

③ 安装Hadoop环境

  • 在Linux中配置Hadoop运行环境

    1.创建用户

    2.安装JDK(/usr/java/jdk1.7.0.67)

    3.配置SSH免密码登录

    ​ 客户端主机(拥有自己的私钥、请求方)
    ​ 服务端主机(拥有别人的公钥、应答方)


  • 解压hadoop-2.6.0.tar.gz到用户HOME目录

    cd  ~
    tar -zxvf hadoop-2.6.0.tar.gz
    
  • 重命名(创建快捷方式)

    mv hadoop-2.6.0 hadoop
    
  • 配置环境变量:/etc/profile

    export HADOOP_HOME=/home/hduser/hadoop    
    export PATH=$HADOOP_HOME/bin:$PATH
    
  • Hadoop完全分布式安装

    bin:执行文件目录
    etc:Hadoop配置文件都在此目录
    include:包含C语言接口开发所需头文件
    lib:包含C语言接口开发所需链接库文件
    libexec:运行sbin目录中的脚本会调用该目录下的脚本
    logs:日志目录,在运行过Hadoop后会生成该目录
    sbin:仅超级用户能够执行的脚本,包括启动和停止dfs、yarn等
    share:包括doc和hadoop两个目录
    	doc目录包含大量的Hadoop帮助文档
    	hadoop目录包含了运行Hadoop所需的所有jar文件,在开发中用到的jar文件也可在该目录找到
    

④ 运行Hadoop的WorDcount程序

启动hadoop
cd /opt/install/hadoop
sbin/start-all.sh    --
[类似百度云]
hadoop fs -mkdir /input    --在hdfs系统上 根目录下 创建 input文件夹
hadoop fs -ls /            --查看某个 目录下的文件
hadoop fs -put /software/hello.txt /input   --将虚拟机本地的文件 上传到 hdfs系统的某个目录下

--执行hadoop自带的jar包 运行MapReduce程序
hadoop jar /opt/install/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0-cdh5.14.2.jar wordcount /input /output/wordcount1

--进行查看结果
hadoop fs -cat /output/wordcount1/*

三.HDFS体系分布式储存

HDFS简介

​ HDFS(Hadoop Distributed File System)是Hadoop项目的核心子项目,是分布式计算中数据存储管理的基础,是基于流数据模式访问和处理超大文件的需求而开发的,可以运行于廉价的商用服务器上。它所具有的高容错、高可靠性、高可扩展性、高获得性、高吞吐率等特征为海量数据提供了不怕故障的存储,为超大数据集(Large Data Set)的应用处理带来了很多便利

HDFS基本概念

  • 文件块Block

    ​ 第一代1.x 默认大小64MB

    ​ 第一代2.x 默认大小128MB

    ​ 特点:2kb也会占用一个128M,500会占用3个128M,加一个没有满的128M

    ​ Hadoop-2.X默认的虎门

  • NameNode

    ​ 主要存放元数据文件、版本信息、文件系统的标识符等

    ​ 元数据:将文件切成了文件块,分布式的存储系统,block1存在什么位置由namenode来分 配并将详细的datanode和路径 与 block1形成映射文件,存放在namenode

    ​ 负责接收 读写数据的请求,根据请求完成文件块block的分配与映射文件的读取

  • DataNode

    存放文件块block的 数据节点(一台电脑)以及数据的属性信息

      block在多个节点上都有备份,好处是 容错性很高
    
  • Secondary NameNode节点 备胎

    解决了1.x的经典问题—单点故障

    备份NameNode,(二级NameNode)处于standby状态,当NameNode出现问题时,会变为 active状态接替NameNode的工作继续运行

HDFS的优点

1.处理超大文件
能用来存储管理PB级的数据 1PB = 1024TB

2.处理非结构化数据、半结构化数据、结构化数据
流式的访问数据
一次写入、多次读取

3.运行于廉价的商用机器集群上
可运行在低廉的商用硬件集群上
故障时能继续运行且不让用户察觉到明显的中断

局限性/缺点

  1. 不适合处理低延迟数据访问
    HDFS是为了处理大型数据集分析任务的,主要是为了达到高的数据吞吐量而设计的
    对于低延时的访问需求,HBase是更好的选择
    2. 无法高效存储大量的小文件,小文件会给Hadoop的扩展性和性能带来严重问题,利用SequenceFile、MapFile等方式归档小文件
    3. 不支持多用户对一个文件同时写入及任意修改文件,只有一个写入者,只能执行追加操作,不支持多个用户对同一文件的写操作,以及在文件任意位置进行修改 。

四、MAVEN操作HadoopHDFS

①、从pom文件导入hadoop jar包


    <dependency>
      <groupId>org.apache.hadoopgroupId>
      <artifactId>hadoop-commonartifactId>
      <version>2.6.0version>
    dependency>

    <dependency>
      <groupId>org.apache.hadoopgroupId>
      <artifactId>hadoop-hdfsartifactId>
      <version>2.6.0version>
    dependency>

②、HDFS文件操作

1、查看文件

  • 方法一:url
package com.dd;
import org.apache.hadoop.fs.FsUrlStreamHandlerFactory;
import org.apache.hadoop.io.IOUtils;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;

public class App 
{
    static{
        URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory());
    }
    public static void main(String[] args) {
        InputStream in=null;
        try {
            in=new URL(args[0]).openStream();
            org.apache.hadoop.io.IOUtils.copyBytes(in, System.out,4096,false);
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
            IOUtils.closeStream(in);
        }
    }
}
  • 方法二:APP
public static void readFile(String filePath){
        FSDataInputStream fis = null;
        try {
            fis = fs.open(new Path(filePath));
            IOUtils.copyBytes(fis,System.out,4096,false);
        }catch (IOException e){
            e.printStackTrace();
        } finally {
            IOUtils.closeStream(fis);
        }
    }

2、创建文件

public static void createFile(String filePath){
        FSDataOutputStream fos=null;
        InputStream is =null;
        try{
            Path path = new Path(filePath);
            //通过create方法 获取了输出流
            fos= fs.create(path); //hdfs系统是已经有了此文件
            //向创建的文件中写入内容
            is = new ByteArrayInputStream("Hello Hadoop".getBytes("UTF-8"));
            IOUtils.copyBytes(is,fos,4096,true);
            System.out.println("---文件创建成功---");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //关闭流
            IOUtils.closeStream(fos);
            IOUtils.closeStream(is);
        }
    }

3、上传文件

public static void uploadFile(String srcPath,String dstPath){
        try{
            //把字符串转换为Path路径对象
            Path src = new Path(srcPath);
            Path dst = new Path(dstPath);
            //利用copyFromLocalFile
            fs.copyFromLocalFile(src,dst);
            System.out.println("上传成功!");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

4、下载文件

public static void downloadFile(String srcPath,String dstPath){
        try{
            //把字符串转换为Path路径对象
            Path src = new Path(srcPath);
            Path dst = new Path(dstPath);
            //利用copyFromLocalFile
            //false:不删除源文件
            //true:使用本地的文件系统
            fs.copyToLocalFile(false,src,dst,true);
            System.out.println("下载成功!");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

5、删除文件

public static void deleteFile(String filePath){
        try{
            //指定hdfs

            Path path = new Path(filePath);
            //true:是否开启递归删除
            if(fs.exists(path)){   //判断文件是否存在
                fs.delete(path,true);
                //fs.deleteOnExit();删除方法二
                System.out.println("删除成功!");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

6、重命名文件

public static void rename(String fromPath,String toPath){
        try{
            Path from = new Path(fromPath);
            Path to = new Path(toPath);
            fs.rename(from,to);
            System.out.println("重命名成功!");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

7、查询文件

  • 单文件查询
 public static void findFile(String path){
        try {
            Path filePath = new Path(path);
            //获取文件信息
            FileStatus fileInfo = fs.getFileStatus(filePath);
            //获取文件大小
            long size = fileInfo.getLen();
            //获取文件路径
            String filePath2 = fileInfo.getPath().toString();
            //获取文件权限
            String permission = fileInfo.getPermission().toString();
            //拥有者
            String owner = fileInfo.getOwner();
            System.out.println("拥有者:"+owner+"\n文件大小:"+size+"\n路					径:"+filePath2+"\n权限:"+permission);
            System.out.println("文件查询成功!");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
  • 多文件查询
public static void findFiles(String path){
        try {
            Path filePath = new Path(path);
            FileStatus[] files = fs.listStatus(filePath);
            for (FileStatus fileStatus : files) {
                //文件大小
                long size = fileStatus.getLen();
                //文件路径
                String filePath2 = fileStatus.getPath().toString();
                //文件权限
                String permission = fileStatus.getPermission().toString();
                //拥有者
                String owner = fileStatus.getOwner();
                System.out.println("文件大小:" + size);
                System.out.println("文件路径:" + filePath2);
                System.out.println("文件权限:" + permission);
                System.out.println("拥有者:" + owner);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

8、公共部分

import org.apache.hadoop.fs.*;
import org.apache.zookeeper.common.IOUtils;

import java.io.*;
import java.net.URI;
import java.net.URISyntaxException;

public class HDFSAPP {
    //1.获取配置文件对象
    private static Configuration conf =new Configuration();
    private static FileSystem fs;
    private static String hdfsUrl="hdfs://192.168.119.100:9000";
	//静态公共部分
    static {
        try {
            //2.获取FileSystem对象
            fs=FileSystem.get(new URI(hdfsUrl),conf,"root");
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (URISyntaxException e) {
            e.printStackTrace();
        }
    }
    //代码块1
    //代码块2
    //代码块3 ...
    
    //程序入口
    public static void  main(String[] args) {
        //readFile("/input/lianxi.txt");
        //createFile("/input/create.txt");
        //uploadFile("D:\\111\\lianxi.txt","/input");
        //downloadFile("/input/create.txt","D:\\111");
        //deleteFile("/input/lianxi.txt");
        //rename("/input/create.txt","/input/create11.txt");
        //findFile("/input/create11.txt");
        findFiles("/input");
    }
}

③、maven工程打jar包在hadoop里面运行

第一种(不带参数): hadoop jar /opt/test/dd-1.0-SNAPSHOT.jar com.dd.App
第二种(带参数):hadoop jar /opt/test/dd-1.0-SNAPSHOT.jar com.dd.App hdfs://192.168.119.100:9000/input/hello.txt

使用FileSystem API编程步骤

  1. 获取Configuration对象,得到hadoop参数配置信息
  2. 获取得到文件系统的fileSystem对象
  3. 使用FileSystem对象操作文件

五、MapReduce实现分布式运算

①、基本数据类型:

  • BooleanWritable 标准布尔型数值
  • ByteWritable 单字节数值
  • DoubleWritable 双字节数值
  • FloatWritable 浮点型
  • IntWritable 整型数
  • LongWritable 长整型
  • Text
  • NullWritable

②、编写MapReduce程序

实现步骤

  1. 实现Mapper
    继承org.apache.hadoop.mapreduce.Mapper
  2. 实现Reducer
    继承org.apache.hadoop.mapreduce.Reducer
  3. 创建并配置Job
    实例化org.apache.hadoop.mapreduce.Job

你可能感兴趣的:(技术)