Apache Accumulo 简介

在本教程中,我们讨论了 Apache Accumulo,这是一个多功能、可扩展的数据库,擅长处理具有复杂访问要求的海量数据集。

其独特的功能(例如单元级安全性、迭代器和灵活的数据模型)使其成为需要安全高效的数据管理(用于实时分析、安全数据处理或大规模数据存储)的应用程序的绝佳选择。

首先,我们了解了安装和设置的步骤。然后,我们了解了其独特的数据模型。最后,我们熟悉了可用的操作和功能。

人类每天都会产生大量敏感数据,组织需要管理从个人信息和财务记录到机密文件和网络安全日志的所有内容。统计数据显示,传统数据库通常难以应对大数据量和现代企业复杂的安全要求。

由于安全数据管理在现代世界中的作用变得更具战略性,并且大多数组织都要求精确到单元级别的细粒度访问控制,因此我们需要一个能够处理海量数据集同时保持严格安全协议的数据库系统——以 PB 级数据为规模,具有数十亿个单独的访问决策。

在这篇介绍性文章中,我们将探索Apache Accumulo,这是一个功能强大的分布式键值存储,具有无与伦比的单元级安全性、高性能和可扩展性。

什么是 Apache Accumulo?
Apache Accumulo 最初由美国国家安全局(NSA)基于Google 的 Bigtable设计开发,是一个分布式键值存储。
它建立在 Apache Hadoop 和 Apache ZooKeeper 之上,旨在处理跨商品硬件集群的海量数据。

Accumulo 可实现高效的数据采集、检索和存储。它还提供服务器端编程,允许直接在数据库内进行复杂的数据处理,使其成为一种具有细粒度访问控制的复杂解决方案,可处理敏感的大数据。

Apache Accumulo 的主要功能如下:

  • 可扩展性:可以管理大型集群中的 PB 级数据
  • 高性能:使用内存处理和优化实现高效的数据访问
  • 单元级安全性:允许细粒度的访问控制,其中每个单元可以具有唯一的可见性标签
  • 丰富的自定义 API:提供用于数据库内处理的迭代器等功能

与用于网络索引、Google Earth 和 Google Finance 的 Google Bigtable类似,Apache Accumulo 可用于各种应用程序,但不仅限于:
  • 政府和军事数据系统
  • 医疗记录管理
  • 金融服务数据
  • 网络安全分析
  • 大规模图形处理

 安装和设置
首先,让我们确保安装了Java 11Apache Hadoop、YARN 和Apache ZooKeeper等先决条件,以及在路径中设置了相应的JAVA_HOME、HADOOP_HOME和ZOOKEEPER_HOME 。

然后,我们将下载最新版本的 Apache Accumulo 并将其提取:
$ tar -xzf accumulo-2.1.3-bin.tar.gz

同样,我们可以将ACCUMULO_HOME添加到路径变量中:
$ export ACCUMULO_HOME=/path/to/accumulo $ export PATH=$ACCUMULO_HOME/bin:$PATH

接下来,我们按顺序启动 ZooKeeper、Hadoop HDFS 和 YARN 等服务:
$ zkServer start $ start-dfs.sh $ start-yarn.sh

此外,我们需要确保 HDFS 在localhost:8020上启动,并且 ZooKeeper 主机设置为localhost:2181 ,因为这些是accumulo.properties中设置的默认属性。

让我们使用jps命令确认一切都运行正常,该命令应该显示如下输出:

82306 Main 81385 DataNode 81745 ResourceManager 82867 Jps 81846 NodeManager 81530 SecondaryNameNode 68474 ResourceManager 81276 NameNode


现在,我们准备设置 Accumulo 将数据存储在 ZooKeeper 和 HDFS 中:
$ accumulo init

init命令仅需要一次,并提示输入实例名称和 root密码。

然后,我们将创建启动集群所需的其他配置文件:
$ accumulo-cluster create-config

最后,我们准备启动集群:
$ accumulo-cluster start

一旦启动,我们就可以运行Accumulo shell——一个用于与 Apache Accumulo 交互的命令行工具:
$ accumulo shell -u root

注意:此命令要求在accumulo-client.properties中设置实例名称和密码。

Accumulo Shell 提供基本命令来管理、查询和执行表和实例的管理任务。

让我们来看看一些最方便的命令:

  • tables:列出实例中的所有表
  • createtable :创建一个新表
  • deletetable
  • :删除表
  • scan:扫描并显示当前表中的数据
  • 插入 :将值插入表中
  • delete :从表中删除特定条目
  • setiter -t
  • :设置特定于表的迭代器
  • listiter [-scan | -table]:列出扫描仪或表的迭代器
  • createuser <用户名>:创建新用户
  • info:显示有关 Accumulo 实例的系统信息
  • config:查看或更改配置设置
  • flush
  • :强制将表的内存刷新到磁盘
  • compact
  • :压缩表的数据

    数据模型
    Accumulo 数据模型与 Google 的 Bigtable 类似,提供稀疏、分布式、持久的多维排序图。
    具体来说,Accumulo 实例的密钥由三个部分组成(帮助它对于存储的每个值都是唯一的):

    • Row ID:一行数据的主要标识符,用于按字典顺序对数据进行排序
    • 柱子:
      • 系列:列被分组为系列,作为数据的类别或命名空间。列系列提供了一种组织相关数据的方法。
      • 限定符:在每个列族中,各个列由列限定符标识。这允许对列族内的数据进行细粒度区分。
      • 可见性:每个键值对都可以与安全标签或可见性相关联。这允许进行单元级访问控制,其中用户必须具有适当的授权才能读取数据。
    • TimeStamp:与每个键值对关联的版本号,允许 Accumulo 存储同一数据的多个版本

    总体而言,Accumulo 数据模型提供了一个灵活、安全的框架,用于管理具有复杂安全需求的大规模结构化数据集。
    它使用行 ID、列族和限定符来实现强大的数据组织和查询,而单元格级可见性控制可确保敏感信息的保护。


     操作和功能
    1. 基本表操作
    Accumulo 提供了强大的表管理功能。我们可以根据需要创建新表、克隆现有表以进行测试或开发,以及将大表拆分为较小的表以优化性能。

    此外,还可以合并表格以整合数据并提高查询效率。Accumulo还支持灵活的数据导入和导出操作,实现无缝数据迁移和与其他系统的集成。

    2. 数据处理
    Accumulo 提供基本的数据操作来创建、更新和删除数据。为了高效处理大型数据集,Accumulo 提供批处理操作,允许批量处理数据。

    此外,基于范围的扫描能够有效检索特定数据子集,从而优化查询性能。

    3. 安全功能
    Accumulo 通过为每条数据设置安全标签来提供单元级安全性。我们可以使用布尔表达式设置复杂的安全规则,并管理用户访问以实施细粒度的授权策略。

    4. 迭代器框架
    Accumulo 提供强大的迭代器,可充当现场数据处理器,直接在数据所在位置工作。它们在服务器本身上处理数据的过滤、聚合和转换,因此我们不需要通过网络发送大量原始数据。

    这会加快查询处理速度、提高效率并减少网络流量。

    5. 性能优化
    Accumulo 结合了预写日志、基于内存的写入、布隆过滤器和局部性组等各种性能优化,以确保高效的数据存储和检索。

    预写日志可保证数据持久性,而基于内存的写入可加速数据提取。布隆过滤器可实现快速查找,从而减少全表扫描的需要。局部组可优化数据放置,从而提高读写性能。

    6. 扩展和分布
    当添加更多数据时,Accumulo 会自动拆分平板电脑并平衡负载,将新机器集成到集群中就像将它们指向集群一样简单。随着数据的扩展,系统会顺利管理数据分布。

    7. 实时洞察
    Accumulo 允许我们监控性能指标、跟踪资源使用情况并检测出现的问题,从而提供实时洞察。

    凭借其高效的数据处理能力以及与监控工具的集成,我们可以快速响应变化并确保最佳的系统性能。

    8. 管理
    Accumulo 提供强大的管理功能,包括可靠的备份和恢复机制、智能数据压缩策略和灵活的系统配置选项。

    它还提供全面的用户管理和资源控制等好处,确保安全访问和最佳性能。

     Accumulo 客户
    现在我们已经介绍了 Accumulo 的安装过程、数据模型、操作和功能,让我们探索 Accumulo 客户端通过 Java API 与 Accumulo 进行交互。

    Accumulo 客户端 API 允许我们以编程方式执行管理任务、查询数据和管理表。

    1. Maven 依赖
    首先,让我们将最新的accumulo-core Maven 依赖项添加到我们的pom.xml中:

    <dependency>
        <groupId>org.apache.accumulo</groupId>
        <artifactId>accumulo-core</artifactId>
        <version>2.1.3</version>
    </dependency>

    此依赖项添加了与 Accumulo 协作所需的类和方法。

    2. 创建 Accumulo 客户端
    接下来,让我们创建一个客户端来与 Accumulo 交互:

    AccumuloClient client = Accumulo.newClient()
      .to("accumuloInstanceName", "localhost:2181")
      .as(
    "username", "password").build();

    我们使用构建器方法通过指定 Accumulo 实例名称、ZooKeeper 主机详细信息、用户名和 Accumulo 实例的密码来初始化连接。

    3. 基本操作
    接下来,客户端设置完毕,我们来执行创建表的基本操作:
    client.tableOperations().create(tableName);

    然后,要向表中添加数据,我们可以使用提供高性能、面向批处理的写入的BatchWriter类:

    try (BatchWriter writer = client.createBatchWriter(tableName, new BatchWriterConfig())) {
        Mutation mutation1 = new Mutation("row1");
        mutation1.at()
          .family(
    "column family 1")
          .qualifier(
    "column family 1 qualifier 1")
          .visibility(
    "public").put("value 1");
        Mutation mutation2 = new Mutation(
    "row2");
        mutation2.at()
          .family(
    "column family 1")
          .qualifier(
    "column family 1 qualifier 2")
          .visibility(
    "private").put("value 2");
        writer.addMutation(mutation1);
        writer.addMutation(mutation2);
    }

    这里,每个条目都由Mutation对象表示,该对象接受列信息,如前面数据模型中讨论的系列、限定符和可见性。

    类似地,让我们使用Scanner类从表中检索数据:

    try (var scanner = client.createScanner(tableName, new Authorizations("public"))) {
        scanner.setRange(new Range());
        for (Map.Entry<Key, Value> entry : scanner) {
            System.out.println(entry.getKey() +
    " -> " + entry.getValue());
        }
    }

    在这里,我们迭代扫描整个表的指定范围内的行,并应用授权等过滤器,确保只获取公开可见的数据。