我想扫描大量数据(基于范围的查询),在写入数据时我可以做哪些优化以使扫描变得更快?

2024-01-22

I have billion我要扫描的 hbase 行数million一次行。什么是最好的优化技术我可以尽可能快地进行扫描。


我们有类似的问题,我们需要通过键扫描数百万行,为此我们使用了映射缩减技术。对此没有标准的解决方案,因此我们编写了一个自定义输入格式来扩展InputFormat<ImmutableBytesWritable, Result>。有一个镜头描述了我们如何做到这一点。

首先,您需要创建一个分割,以便密钥转到包含它的区域所在的机器:

public List<InputSplit> getSplits(JobContext context) throws IOException {
    context.getConfiguration();

    //read key for scan
    byte[][] filterKeys = readFilterKeys(context);

    if (table == null) {
        throw new IOException("No table was provided.");
    }

    Pair<byte[][], byte[][]> keys = table.getStartEndKeys();
    if (keys == null || keys.getFirst() == null || keys.getFirst().length == 0) {
        throw new IOException("Expecting at least one region.");
    }

    List<InputSplit> splits = new ArrayList<InputSplit>(keys.getFirst().length);
    for (int i = 0; i < keys.getFirst().length; i++) {
        //get key for current region 
        //it should lying between start and end key of region 
        byte[][] regionKeys =
                getRegionKeys(keys.getFirst()[i], keys.getSecond()[i],filterKeys);
        if (regionKeys == null) {
            continue;
        }
        String regionLocation = table.getRegionLocation(keys.getFirst()[i]).
                getServerAddress().getHostname();
        //create a split for region
        InputSplit split = new MultiplyValueSplit(table.getTableName(),
                regionKeys, regionLocation);
        splits.add(split);

    }
    return splits;
}

“MultiplyValueSplit”类包含有关键和表的信息

public class MultiplyValueSplit extends InputSplit
    implements Writable, Comparable<MultiplyValueSplit> {

    private byte[] tableName;
    private byte[][] keys;
    private String regionLocation;
}

在方法中createRecordReader在输入格式类中,有一个“MultiplyValueReader”,其中包含如何创建从表中读取值的逻辑。

@Override
public RecordReader<ImmutableBytesWritable, Result> createRecordReader(
        InputSplit split, TaskAttemptContext context) throws IOException {
    HTable table = this.getHTable();
    if (table == null) {
        throw new IOException("Cannot create a record reader because of a" +
                " previous error. Please look at the previous logs lines from" +
                " the task's full log for more details.");
    }

    MultiplyValueSplit mSplit = (MultiplyValueSplit) split;
    MultiplyValuesReader mvr = new MultiplyValuesReader();

    mvr.setKeys(mSplit.getKeys());
    mvr.setHTable(table);
    mvr.init();

    return mvr;
}

“MultiplyValuesReader”类包含有关如何从 HTable 读取数据的逻辑

public class MultiplyValuesReader 
        extends RecordReader<ImmutableBytesWritable, Result> {
    .......

    @Override
    public ImmutableBytesWritable getCurrentKey() {
        return key;
    }

    @Override
    public Result getCurrentValue() throws IOException, InterruptedException {
        return value;
    }

    @Override
    public boolean nextKeyValue() throws IOException, InterruptedException {
        if (this.results == null) {
            return false;
        }

        while (this.results != null) {
            if (resultCurrentKey >= results.length) {
                this.results = getNextResults();
                continue;
            }

            if (key == null) key = new ImmutableBytesWritable();
            value = results[resultCurrentKey];
            resultCurrentKey++;

            if (value != null && value.size() > 0) {
                key.set(value.getRow());
                return true;
            }

        }
        return false;
    }

    public float getProgress() {
        // Depends on the total number of tuples
        return (keys.length > 0 ? ((float) currentKey) / keys.length : 0.0f);
    }

    private Result[] getNextResults() throws IOException {
        if (currentKey <= keys.length) {
            return null;
        }

        //using batch for faster scan
        ArrayList<Get> batch = new ArrayList<Get>(BATCH_SIZE);
        for (int i = currentKey; 
             i < Math.min(currentKey + BATCH_SIZE, keys.length); i++) {
            batch.add(new Get(keys[i]));
        }

        currentKey = Math.min(currentKey + BATCH_SIZE, keys.length);
        resultCurrentKey = 0;
        return htable.get(batch);
    }

}

有关更多详细信息,您可以查看类的源代码TableInputFormat, TableInputFormatBase, TableSplit and TableRecordReader.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我想扫描大量数据(基于范围的查询),在写入数据时我可以做哪些优化以使扫描变得更快? 的相关文章

  • 如何跟踪hadoop中哪个数据块在哪个数据节点?

    如果复制一个数据块 会复制到哪个数据节点 是否有任何工具可以显示复制块存在的位置 如果您知道文件名 则可以通过 DFS 浏览器查找 转到您的 namenode Web 界面 说 浏览文件系统 并导航到您感兴趣的文件 在页面底部 将列出文件中
  • Spark 写入 hdfs 无法使用 saveAsNewAPIHadoopFile 方法

    我在 CDH 5 2 0 上使用 Spark 1 1 0 并试图确保我可以读取和写入 hdfs 我很快意识到 textFile 和 saveAsTextFile 调用旧的 api 并且似乎与我们的 hdfs 版本不兼容 def testHD
  • 从 HDFS 传出文件

    我想将文件从 HDFS 传输到另一台服务器的本地文件系统 该服务器不在 hadoop 集群中 而是在网络中 我本可以这样做 hadoop fs copyToLocal
  • 使用字符串数组在 Hive 表上加载 CSV 文件

    我正在尝试将 CSV 文件插入 Hive 其中一个字段是 string 数组 这是 CSV 文件 48 Snacks that Power Up Weight Loss Aidan B Prince Health Fitness Trave
  • 如何按行扩展数组值!!使用 Hive SQL

    我有一个有 4 列的表 其中一列 项目 类型是 ARRAY 其他是字符串 ID items name loc id1 item1 item2 item3 item4 item5 Mike CT id2 item3 item7 item4 i
  • 如何直接将一个mapper-reducer的输出发送到另一个mapper-reducer而不将输出保存到hdfs中

    问题最终解决检查底部的我的解决方案 最近 我尝试运行 Mahout in Action 的第 6 章 列表 6 1 6 4 中的推荐示例 但我遇到了一个问题 我用谷歌搜索但找不到解决方案 问题是 我有一对映射器减速器 public fina
  • 无法在 Windows 10 中启动 Spark Master

    我是 Spark 新手 我正在尝试手动启动 master 在 Windows 10 中使用 MINGW64 当我这样做时 Downloads spark 1 5 1 bin hadoop2 4 spark 1 5 1 bin hadoop2
  • 公平调度器和容量调度器有什么区别?

    我是 Hadoop 世界的新手 想了解公平调度程序和容量调度程序之间的区别 另外我们什么时候应该使用每一个 请简单地回答一下 因为我在网上读了很多东西 但从中得到的不多 公平调度是一种为作业分配资源的方法 使得所有作业随着时间的推移平均获得
  • Hadoop-reducer 如何获取数据?

    据我所知 映射器为每个减速器生成 1 个分区 减速器如何知道要复制哪个分区 假设有 2 个节点运行用于字数统计程序的映射器 并且配置了 2 个缩减器 如果每个映射节点生成 2 个分区 并且两个节点中的分区都可能包含相同的单词作为键 那么减速
  • 适用于 Python 3.x 的 Hive 客户端

    是否可以使用 Python 3 x 连接到 hadoop 并运行 hive 查询 我正在使用Python 3 4 1 我发现可以按照这里写的方式完成 https cwiki apache org confluence display Hiv
  • 覆盖hadoop中的log4j.properties

    如何覆盖hadoop中的默认log4j properties 如果我设置 hadoop root logger WARN console 它不会在控制台上打印日志 而我想要的是它不应该在日志文件中打印 INFO 我在 jar 中添加了一个
  • 将 Hbase 与 PHP 集成 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我已经安装了 Hbase 现在我正在寻找一些 PHP 库来将 hbase 与 PHP 集成 我尝试了 2 个库 第一个是我尝试与 th
  • Hive NVL 不适用于列的日期类型 - NullpointerException

    我正在使用 HDFS 上的 MapR Hive 发行版并面临以下问题 如果表的列类型是 日期 类型 则NVL https cwiki apache org confluence display Hive LanguageManual UDF
  • 如何在Hadoop中序列化List集合对象?

    有没有办法在 Hadoop 中序列化 java 集合 The Writable接口仅适用于 Java 原语 我有以下类属性 private String keywords private List
  • 如何用snappy解压hadoop的reduce输出文件尾?

    我们的 hadoop 集群使用 snappy 作为默认编解码器 Hadoop作业减少输出文件名就像part r 00000 snappy JSnappy 无法解压缩文件 bcz JSnappy 需要以 SNZ 开头的文件 归约输出文件以某种
  • Spark/Yarn:HDFS 上不存在文件

    我在 AWS 上设置了 Hadoop Yarn 集群 有 1 个主服务器和 3 个从服务器 我已经验证我有 3 个活动节点在端口 50070 和 8088 上运行 我在客户端部署模式下测试了 Spark 作业 一切正常 当我尝试使用 Spa
  • Hadoop - 直接从 Mapper 写入 HBase

    我有一个 hadoop 作业 其输出应写入 HBase 我并不真正需要减速器 我想要插入的行类型是在映射器中确定的 如何使用 TableOutputFormat 来实现此目的 从所有示例中 我看到的假设是 reducer 是创建 Put 的
  • 没有函数映射到名称“coord:formatTime”

    我正在尝试使用 oozie 中的以下内容获取当前时间戳
  • 如何使用hbase协处理器实现groupby?

    最近学习了hbase协处理器 我使用endpoint来累加hbase表的一列 例如 名为 pendings 的hbase表 它的家族是 asset 我累加了 asset amount 的所有值 该表还有其他列 例如 asset custom
  • 匿名类上的 NotSerializedException

    我有一个用于过滤项目的界面 public interface KeyValFilter extends Serializable public static final long serialVersionUID 7069537470113

随机推荐

  • Shiny 应用程序中的“read_excel”

    我有一个闪亮的应用程序 使用read xlsx包中的函数xlsx 一切正常 但我想改为read excel from readxl 希望它会更快并且能够应对大文件 ui part fileInput inputFile Upload fil
  • 手部检测 Opencv

    我正在尝试使用 OpenCV 和 C 检测手 我能够找到图像中存在人手的手的轮廓 正图像 基本上我找到最大的轮廓并将其视为手部轮廓 假设在给定的图像中不存在手 那么我将采用任何轮廓并将其视为手 所以我开始思考我可以使用 haar 级联来确定
  • 反应式框架/DoubleClick

    我知道有一个简单的方法可以做到这一点 但今晚它打败了我 我想知道两个事件是否在 300 毫秒内发生 例如双击 在 300 毫秒内单击鼠标左键两次 我知道这就是响应式框架的构建目的 但该死的是 如果我能找到一个好的文档 其中包含所有扩展运算符
  • 使用 conda 安装 opencv

    这个问题与 如何通过Conda安装Python OpenCV 不同 因为这个问题是 5 年前提出的 当时所有软件包都有不同的版本 我尝试了该问题的所有答案 但都不起作用 有关详细信息 请参阅问题正文 现在 2019 年 7 月 如何使用 c
  • 用于解析日期/时间字符串(包括时区)的 C++ 库(unix)

    我有多种格式的日期 现在我想在 C 中有一个函数 来自某个库 它可以解析这些日期 时间字符串 并给我一些像 tm 这样的结构 或者将它们转换为某种确定性表示 以便我可以处理日期 时间 我看到的一些格式如下 2008 年 2 月 19 日星期
  • 是否可以用 C++ 编写敏捷的 Pimpl?

    我一直在研究 Pimpl 习语并从中获得了各种好处 我唯一不太感兴趣的是定义函数时的感觉 一旦进入标题 P def 一旦到达 cpp 的顶部 Impl def 一旦进入 cpp Impl Impl 中间 一旦到达 cpp 的下端 P Imp
  • ASP.NET MVC 模型绑定器通过 GET 和 POST 请求以不同的方式解析十进制

    服务器正在托管 Asp net mvc3 应用程序 并且浏览器区域性设置为 da 丹麦语 GET request url get d 1 1 note that the decimal separator is return da 1 1
  • 使用 osmdroid 在 OpenStreet Maps 上制作动画标记

    我正在使用给出的谷歌地图标记动画逻辑here https gist github com broady 6314689 我的标记变得动画 但每次之后marker setPosition newPosition 我需要打电话mapView i
  • Prestashop 无尽旋转产品保存按钮

    我运行的是 Prestashop 1 6 1 1 产品保存按钮大约需要 45 秒才能加载 我升级到 1 6 1 3 现在根本无法加载 我尝试回滚并升级到1 6 1 4 我删除了 Smarty Cache 删除了 Chrome 的历史记录 c
  • 过滤用户输入

    我在这里阅读了很多有关过滤用户输入的问答 但大多数时候答案是这取决于您在做什么 这就是我正在做的 通过表单提交的数据将在 MySQL 查询中使用 function clean field link return mysql real esc
  • 使用包含 2 个以上单词的单个搜索字符串对名字和姓氏列执行搜索

    我有一个查询 当前采用单个用户提供的搜索字符串 并尝试搜索包含单独的名字和姓氏列的表 如果搜索字符串中有空格 则它运行的查询基本上如下所示 SELECT FROM table WHERE table firstName LIKE first
  • 从设备删除应用程序后无法创建带有 nil 模型的 NSPersistentStoreCoordinator

    我收到了 Cannot create an NSPersistentStoreCoordinator with a nil model 从设备删除我的应用程序后出错 我正在 iPad 设备上测试 iPhone 应用程序 我已经输入此代码来检
  • 如何使嵌入图表响应

    我已将 Tradingview 中的股票图表嵌入到我的网站中 但我无法使其响应 尤其是宽度 当页面缩小时 图表开始移出屏幕 这是代码 div class tradingview widget container div div div cl
  • 如何在php中创建对象数组

    我正在尝试在 php 中创建一个对象数组 并且很好奇我将如何去做 任何帮助都会很棒 谢谢 这是将包含在数组中的类
  • Laravel 4:加载旧库:如何?

    我有一个旧图书馆 phpquery http code google com p phpquery 我想将其包含在我的项目中 我已将其放入供应商内部 但它不起作用 因为它不符合 PSR 0 标准 我不希望它为每个请求加载 所以我没有放置re
  • Spark工作人员未连接到主设备

    我想创建一个 Spark 独立集群 我可以在同一节点上运行主节点和从节点 但不同节点上的从节点既不显示主节点 URL 也不连接到主节点 我正在运行命令 start slave sh spark spark server 7077 where
  • 像函数一样组合类型构造函数

    我最近遇到了一种情况 我希望能够在实例声明中编写类型构造函数 我本来想这样做 instance SomeClass t SomeClass t gt SomeClass t t where with t t 定义为 t t a t t a
  • 如何在本地主机上测试 Facebook“点赞”按钮?

    可以测试 Like 本地主机上的按钮 并不真地 Facebook 必须抓取您的网站以获取标题 描述和缩略图 如果它位于本地主机上 则无法访问您的站点
  • 角度材料 - 自动完成组件下拉部分不粘在输入字段上

    角度材料的自动完成组件在 MatDialog 组件内未按预期工作 自动完成组件中的 drpodown 部分不会粘贴到输入字段 堆栈闪电战链接 example https stackblitz com edit angular s698hp
  • 我想扫描大量数据(基于范围的查询),在写入数据时我可以做哪些优化以使扫描变得更快?

    I have billion我要扫描的 hbase 行数million一次行 什么是最好的优化技术我可以尽可能快地进行扫描 我们有类似的问题 我们需要通过键扫描数百万行 为此我们使用了映射缩减技术 对此没有标准的解决方案 因此我们编写了一个