hadoop - 批量加载键值对数据到HBASE

标签 hadoop hbase bigdata nosql

我正在评估 HBASE 以处理每行列数可变的非常宽的数据集。在其原始形式中,我的数据有一个变量列表,其中包含每行的参数名称和值。在转换后的形式中,它以键值对形式提供。

我想将此数据加载到 HBASE 中。将我的键值对处理数据转换为单独的“put”语句以获取数据非常容易。但是我需要批量加载,因为我有数千列和数百万行,导致数十亿个单独的键值对,需要数十亿个“put”语句。此外,列的列表 (a、b、c、d、...) 并不是提前完全知道的。到目前为止,我调查了以下选项:

  • importtsv:无法使用,因为这需要提前将数据从行转换为列,并导入一组固定的已知列。<
  • HIVE 生成 HFile:此选项也需要提前指定列名,并将 hive 表中的每一列映射到 hbase 中的一列。<

我唯一的选择似乎是一次解析一大块数据,将其转换为一组已知列,然后批量加载。这看起来很浪费,因为 HBASE 无论如何都会将其分解为键值对。真的应该有一种更简单、更有效的方式来批量加载键值对吗?

原始数据格式:

rowkey1, {a:a1, b:b1}
rowkey2, {a:a2, c:c2}
rowkey3, {a:a3, b:b3, c:c3, d:d3}

处理后的数据格式:

rowkey1, a, a1
rowkey1, b, b1
rowkey2, a, a2
rowkey2, c, c2
rowkey3, a, a3
rowkey3, b, b3
rowkey3, c, c3
rowkey3, d, d3

最佳答案

您几乎肯定想要使用客户 M/R 作业 + 增量加载(也称为批量加载)。

一般流程是:

  1. 提交已使用 HFileOutputFormat.configureIncrementalLoad 配置的 M/R 作业
  2. 映射原始数据并为 HBase 编写 PUT
  3. 使用以下方法将作业的输出加载到表中:

    sudo -u hdfs hdfs dfs -chown -R hbase:hbase/path/to/job/output

    sudo -u hbase hbase org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles/path/to/job/output table-name-here

有很多方法可以从 java 进行加载,但这意味着模拟 HBase。这里棘手的部分是确保文件归 HBase 所有,并且运行增量加载的用户也是 HBase。这Cloudera Blog Post详细讨论这些细节。

一般来说,我建议看一下这个 GH Repo这似乎涵盖了流程的基础知识。

关于hadoop - 批量加载键值对数据到HBASE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40116953/

相关文章:

java - 如何设置一个 reducer 来发送 <Text, IntWritable> 和一个 mapper 来接收 <Text, IntWritable>?

hadoop - Hadoop集群有docker编排吗

hadoop - 如何将平面文件(非分隔文件)加载到HBase中?

java - 如何通过 Maven 在 Intellij 中导入 hadoop.hbase.mapreduce?

python - 提前比较两个或多个 csv 文件

hadoop - CloudStore 与 HDFS

hadoop - 使用 hbase.hregion.max.filesize 自动分割 HBase 区域

hadoop - Mac 操作系统 Hadoop : Exception in thread "main" java. io.FileNotFoundException

java - 比较木瓦以进行近似重复检测

mongodb - 如何使用 spark 和 mongo Hadoop 连接器更新 mongo 集合中的多个字段?