Hadoop和hbase

2023/10/26

# Hadoop和hbase

HadoopHBase 都是开源的、可扩展的、分布式存储和计算框架,但它们的用途和设计目标有所不同。以下是它们的概述:

# 1. Hadoop

Hadoop 主要由以下两个主要组件构成:

  1. Hadoop Distributed File System (HDFS): 这是Hadoop的分布式文件系统,设计用来存储非常大的数据集。它按照块的方式将数据分散在集群中的多个机器上,并提供数据冗余以保证可靠性。

  2. MapReduce: 这是一种计算范式,允许用户编写在大数据集上运行的任务。基本上,它有两个步骤:Map步骤用于处理和转换数据,而Reduce步骤用于汇总结果。

# 2. HBase

HBase 是一个分布式、版本化的、非关系型的数据库,它运行在Hadoop的HDFS上,并为大数据应用提供实时读/写访问。以下是其主要特点:

  1. 基于列的存储: 与传统的关系型数据库不同,HBase是基于列的,这使其在某些应用中具有更好的性能。

  2. 可扩展性: HBase设计为能够处理PB级的数据,并在横向扩展上表现出色。

  3. 集成: 由于HBase使用HDFS作为其存储后端,因此它可以与Hadoop及其生态系统中的其他工具很好地集成,例如Pig、Hive和MapReduce。

# 用途

Hadoop: 主要用于处理和分析大数据。企业和研究机构使用Hadoop对大规模数据进行MapReduce计算、数据清洗、日志分析、数据转换等。

HBase: 主要用于需要大规模、随机、实时读/写访问大数据的应用。例如,Facebook使用HBase作为其消息和实时分析的存储后端。

总之,Hadoop是一个框架,用于存储和处理大规模数据,而HBase是一个在Hadoop之上的数据库,用于实时的大数据访问和存储。两者经常一起使用,但也可以独立使用。

# PB级数据是什么

PB级数据指的是数据大小达到PB (Petabyte) 的级别。这是一个数据大小的单位,通常用于描述非常大的数据集。

数据大小的一些常见单位和它们之间的关系如下:

  1. Byte (B): 基础的数据单位。
  2. Kilobyte (KB): 1 KB = 1,024 Bytes
  3. Megabyte (MB): 1 MB = 1,024 KB
  4. Gigabyte (GB): 1 GB = 1,024 MB
  5. Terabyte (TB): 1 TB = 1,024 GB
  6. Petabyte (PB): 1 PB = 1,024 TB
  7. Exabyte (EB): 1 EB = 1,024 PB ... 以此类推。

当我们谈论PB级数据时,我们指的是在1PB以上的数据量。这种级别的数据通常在大型数据中心、云计算环境和一些特定的研究领域中出现,需要特定的技术和工具来存储、处理和分析。

# hdfs存储数据以块进行存储,什么是块?

在HDFS(Hadoop Distributed File System)中,**块(block)**是数据存储和管理的最小单位。块的概念有助于HDFS在分布式环境中有效地存储和处理数据。

以下是关于HDFS块的一些关键点:

  1. 固定大小:默认情况下,HDFS的块大小为128 MB(在早期的Hadoop版本中为64 MB)。这与许多常规文件系统的块大小(通常为4 KB或8 KB)相比是相当大的。大块大小可以减少元数据的数量,并且对于大文件和数据流式访问(如MapReduce作业)来说,这种大块大小是非常有益的。

  2. 分布式存储:当文件被写入HDFS时,它会被分割成多个块,这些块会被分散地存储在集群中的多个节点上。

  3. 数据冗余:为了确保数据的可靠性和容错能力,每个块在HDFS中都有多个副本(默认为3)。这意味着,如果集群中的某个节点出现故障,那么该节点上的数据块仍然可以从其他节点上的副本中恢复。

  4. 块管理:块的元数据,如其位置、所属文件等,由NameNode(HDFS的主节点)管理。实际的块数据存储在DataNodes上。

通过使用块,HDFS可以轻松地在整个集群中分布存储和管理数据,使其能够扩展到数百或数千个节点,并处理PB级别的数据。

# hbase的列存储

HBase 是一个基于列的存储系统,这意味着数据是按列而不是按行存储的。这与传统的关系型数据库系统(RDBMS)的行存储模型形成了对比。列存储的优势主要体现在对大量数据的读取、写入和压缩方面。

在关系型数据库中,一行数据通常包含多个字段,这些字段在磁盘上连续存储。相反,HBase 和其他列式存储系统将同一列中的所有数据值存储在一起。

来看一个简化的示例来理解HBase的列存储:

考虑以下表格:

| UserID | Name | Age | Address |
| --- | --- | --- | --- |
| 1 | Alice | 25 | City\_A |
| 2 | Bob | 30 | City\_B |
| 3 | Charlie | 28 | City\_C |

在传统的行存储系统中,数据可能按以下方式存储:

1,Alice,25,City_A; 2,Bob,30,City_B; 3,Charlie,28,City_C;

但在 HBase 这样的列式存储系统中,数据可能按以下方式存储:

1,Alice; 2,Bob; 3,Charlie; 25,30,28; City_A,City_B,City_C;

这意味着,例如,所有的 "Name" 数据都存储在一起,所有的 "Age" 数据也存储在一起,以此类推。

# 列存储的优点:

  1. 读优化:如果应用只需要查询或分析特定的列,列式存储可以显著加快读取速度,因为它只需要读取那些特定的列数据。

  2. 压缩:由于同一列中的数据往往具有相似性,因此列数据通常更容易进行有效压缩。

  3. 快速写入:增量数据(例如新的日志条目)可以迅速追加到现有列中。

  4. 扩展性:HBase 可以轻松地添加新列,而无需进行大规模的数据迁移或架构更改。

在实际应用中,HBase 的列存储模型使其特别适合于需要大规模写入、随机读取和列级操作的场景。

# 1. Hadoop (HDFS) 操作

# 1.1 配置

首先,你需要在你的Java项目中引入Hadoop的相关依赖。

# 1.2 增(写入数据)

这是一个简单的将数据写入HDFS的示例:

java

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;

public class HDFSExample {

    public static void main(String[] args) throws Exception {
        Configuration conf = new Configuration();
        FileSystem fs = FileSystem.get(conf);
        Path filePath = new Path("/path/to/your/file.txt");
        
        String content = "Hello Hadoop!";
        try (InputStream in = new ByteArrayInputStream(content.getBytes(StandardCharsets.UTF_8))) {
            if (!fs.exists(filePath)) {
                IOUtils.copyBytes(in, fs.create(filePath), conf);
            }
        }

        fs.close();
    }
}

# 1.3 查(读取数据)

读取HDFS上的数据:

java

// ... (其他import语句)

public class HDFSExample {

    public static void main(String[] args) throws Exception {
        Configuration conf = new Configuration();
        FileSystem fs = FileSystem.get(conf);
        Path filePath = new Path("/path/to/your/file.txt");
        
        try (InputStream in = fs.open(filePath)) {
            IOUtils.copyBytes(in, System.out, 4096, false);
        }

        fs.close();
    }
}

对于HDFS的其他操作(如删除、重命名),你可以查看 FileSystem API文档。

# 2. HBase 操作

# 2.1 配置

你需要在Java项目中引入HBase的相关依赖。

# 2.2 增(插入数据)

插入数据到HBase:

java

import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;

public class HBaseExample {

    public static void main(String[] args) throws Exception {
        org.apache.hadoop.conf.Configuration conf = HBaseConfiguration.create();
        Connection connection = ConnectionFactory.createConnection(conf);
        Table table = connection.getTable(TableName.valueOf("your_table_name"));

        Put put = new Put("row1".getBytes());
        put.addColumn("column_family".getBytes(), "qualifier".getBytes(), "value".getBytes());

        table.put(put);
        
        table.close();
        connection.close();
    }
}

# 2.3 查(获取数据)

从HBase获取数据:

java

// ... (其他import语句)

public class HBaseExample {

    public static void main(String[] args) throws Exception {
        // ... (前面的代码)

        Get get = new Get("row1".getBytes());
        Result result = table.get(get);
        byte[] value = result.getValue("column_family".getBytes(), "qualifier".getBytes());
        System.out.println(new String(value));
        
        table.close();
        connection.close();
    }
}

对于HBase的其他操作(如删除数据),你可以查看HBase的 TableAdmin API文档。

这些示例为你提供了一个基础,你可以在此基础上进行扩展,实现更复杂的功能。在开始之前,请确保你已经正确配置了Hadoop和HBase,并确保所有的守护进程都已经运行。

# 守护进程

在Hadoop和HBase的上下文中,守护进程是一些在后台持续运行的服务进程,它们是分布式系统的核心组件。这些守护进程控制各种任务,如数据存储、任务调度、资源管理和系统健康检查。

# Hadoop的守护进程:

  1. NameNode: 这是HDFS(Hadoop分布式文件系统)的主服务器,负责维护文件系统的元数据。它知道HDFS中的文件和块的位置。

  2. DataNode: 存储在HDFS中的实际数据块是由DataNode守护进程管理的。一个Hadoop集群通常有多个DataNode。

  3. Secondary NameNode: 虽然名字可能让你认为它是NameNode的备份,但实际上它的主要作用是定期合并HDFS的编辑日志和镜像,以防止编辑日志变得过大。

  4. ResourceManager (YARN): 这是YARN框架的核心,负责管理和调度集群资源。

  5. NodeManager (YARN): 在每个集群节点上运行的进程,管理那个节点上的资源并与ResourceManager协调。

# HBase的守护进程:

  1. HMaster: 类似于HDFS的NameNode,HMaster负责协调HBase集群并管理HBase表的元数据。

  2. HRegionServer: 在HBase中,表被分为多个区域(regions),而HRegionServer则负责服务这些区域,处理客户端请求和管理数据存储。

这些守护进程必须始终在线并正常运行,以确保Hadoop和HBase集群的稳定性和性能。当我们说"确保所有的守护进程都已经运行"时,意思是要确保所有这些核心服务都是活跃的,并且正常工作。