Hudi 0.5.2 查询数据(Querying Data)

查询 Hudi 数据集

从概念上讲,Hudi物理存储一次数据到DFS上,同时在其上提供三种查询类型,如之前所述。 数据集同步到Hive Metastore后,它将提供由Hudi的自定义输入格式支持的Hive外部表。一旦提供了适当的Hudi捆绑包, 就可以通过Hive、Spark和Presto之类的常用查询引擎来查询数据集。

具体来说,在写入过程中指定两个表类型的hudi表。创建hive表时指定STORED AS INPUTFORMAT参数创建不同的_ro/_rt表。
如果 table name = hudi_trips 并且 table type = COPY_ON_WRITE, 我们将会看到:

  • hudi_trips 支持设置HoodieParquetInputFormat的表上进行快照查询和增量查询,从而提供纯列式数据。

如果 table name = hudi_trips 并且 table type = MERGE_ON_READ, 我们将会看到:

  • hudi_trips_ro 支持设置 HoodieParquetInputFormat 的表上进行读优化查询,从而提供了纯列式数据。
  • hudi_trips_rt 支持设置 HoodieParquetRealtimeInputFormat 的表上进行快照查询(实时查询)和增量查询(准实时的数据),从而提供了基础文件和日志文件的合并查询。

如概念部分所述,增量处理所需要的 一个关键原语是增量拉取(以从数据集中获取更改流/日志)。您可以增量提取Hudi数据集,这意味着自指定的即时时间起, 您可以只获得全部更新和新行。 这与插入更新一起使用,对于构建某些数据管道尤其有用,包括将1个或多个源Hudi表(数据流/事实)以增量方式拉出(流/事实) 并与其他表(数据集/维度)结合以写出增量到目标Hudi数据集。增量视图是通过查询上表之一实现的,并具有特殊配置, 该特殊配置指示查询计划仅需要从数据集中获取增量数据。

查询引擎支持列表Permalink

下面的表格展示了各查询引擎是否支持Hudi格式

读优化表Permalink

查询引擎 实时视图 增量拉取
Hive Y Y
Spark SQL Y Y
Spark Datasource Y Y
Presto Y N
Impala Y N

实时表Permalink

查询引擎 实时视图 增量拉取 读优化表
Hive Y Y Y
Spark SQL Y Y Y
Spark Datasource N N Y
Presto N N Y
Impala N N Y

接下来,我们将详细讨论在每个查询引擎上如何访问所有三个视图。

HivePermalink

为了使Hive能够识别Hudi数据集并正确查询, HiveServer2需要在其辅助jars路径中提供hudi-hadoop-mr-bundle-x.y.z-SNAPSHOT.jar。 这将确保输入格式类及其依赖项可用于查询计划和执行。

读优化表Permalink

除了上述设置之外,对于beeline cli访问,还需要将hive.input.format变量设置为org.apache.hudi.hadoop.HoodieParquetInputFormat输入格式的完全限定路径名。 对于Tez,还需要将hive.tez.input.format设置为org.apache.hadoop.hive.ql.io.HiveInputFormat

实时表Permalink

除了在HiveServer2上安装Hive捆绑jars之外,还需要将其放在整个集群的hadoop/hive安装中,这样查询也可以使用自定义RecordReader。

增量拉取Permalink

HiveIncrementalPuller允许通过HiveQL从大型事实/维表中增量提取更改, 结合了Hive(可靠地处理复杂的SQL查询)和增量原语的好处(通过增量拉取而不是完全扫描来加快查询速度)。 该工具使用Hive JDBC运行hive查询并将其结果保存在临时表中,这个表可以被插入更新。 Upsert实用程序(HoodieDeltaStreamer)具有目录结构所需的所有状态,以了解目标表上的提交时间应为多少。 例如:/app/incremental-hql/intermediate/{source_table_name}_temp/{last_commit_included}。 已注册的Delta Hive表的格式为{tmpdb}.{source_table}_{last_commit_included}

以下是HiveIncrementalPuller的配置选项

配置 描述 默认值
hiveUrl 要连接的Hive Server 2的URL
hiveUser Hive Server 2 用户名
hivePass Hive Server 2 密码
queue YARN 队列名称
tmp DFS中存储临时增量数据的目录。目录结构将遵循约定。请参阅以下部分。
extractSQLFile 在源表上要执行的提取数据的SQL。提取的数据将是自特定时间点以来已更改的所有行。
sourceTable 源表名称。在Hive环境属性中需要设置。
targetTable 目标表名称。中间存储目录结构需要。
sourceDataPath 源DFS基本路径。这是读取Hudi元数据的地方。
targetDataPath 目标DFS基本路径。 这是计算fromCommitTime所必需的。 如果显式指定了fromCommitTime,则不需要设置这个参数。
tmpdb 用来创建中间临时增量表的数据库 hoodie_temp
fromCommitTime 这是最重要的参数。 这是从中提取更改的记录的时间点。
maxCommits 要包含在拉取中的提交数。将此设置为-1将包括从fromCommitTime开始的所有提交。将此设置为大于0的值,将包括在fromCommitTime之后仅更改指定提交次数的记录。如果您需要一次赶上两次提交,则可能需要这样做。 3
help 实用程序帮助

设置fromCommitTime=0和maxCommits=-1将提取整个源数据集,可用于启动Backfill。 如果目标数据集是Hudi数据集,则该实用程序可以确定目标数据集是否没有提交或延迟超过24小时(这是可配置的), 它将自动使用Backfill配置,因为增量应用最近24小时的更改会比Backfill花费更多的时间。 该工具当前的局限性在于缺乏在混合模式(正常模式和增量模式)下自联接同一表的支持。

关于使用Fetch任务执行的Hive查询的说明: 由于Fetch任务为每个分区调用InputFormat.listStatus(),每个listStatus()调用都会列出Hoodie元数据。 为了避免这种情况,如下操作可能是有用的,即使用Hive session属性对增量查询禁用Fetch任务: set hive.fetch.task.conversion = none;。这将确保Hive查询使用Map Reduce执行, 合并分区(用逗号分隔),并且对所有这些分区仅调用一次InputFormat.listStatus()。

SparkPermalink

Spark可将Hudi jars和捆绑包轻松部署和管理到作业/笔记本中。简而言之,通过Spark有两种方法可以访问Hudi数据集。

  • Hudi DataSource:支持读取优化和增量拉取,类似于标准数据源(例如:spark.read.parquet)的工作方式。
  • 以Hive表读取:支持所有三个视图,包括实时视图,依赖于自定义的Hudi输入格式(再次类似Hive)。

通常,您的spark作业需要依赖hudi-sparkhudi-spark-bundle-x.y.z.jar, 它们必须位于驱动程序和执行程序的类路径上(提示:使用--jars参数)。

读优化表Permalink

要使用SparkSQL将RO表读取为Hive表,只需按如下所示将路径过滤器推入sparkContext。 对于Hudi表,该方法保留了Spark内置的读取Parquet文件的优化功能,例如进行矢量化读取。

spark.sparkContext.hadoopConfiguration.setClass("mapreduce.input.pathFilter.class", classOf[org.apache.hudi.hadoop.HoodieROTablePathFilter], classOf[org.apache.hadoop.fs.PathFilter]);

如果您希望通过数据源在DFS上使用全局路径,则只需执行以下类似操作即可得到Spark DataFrame。

Dataset<Row> hoodieROViewDF = spark.read().format("org.apache.hudi")
// pass any path glob, can include hudi & non-hudi datasets
.load("/glob/path/pattern");

实时表Permalink

当前,实时表只能在Spark中作为Hive表进行查询。为了做到这一点,设置spark.sql.hive.convertMetastoreParquet = false, 迫使Spark回退到使用Hive Serde读取数据(计划/执行仍然是Spark)。

$ spark-shell --jars hudi-spark-bundle-x.y.z-SNAPSHOT.jar --driver-class-path /etc/hive/conf  --packages com.databricks:spark-avro_2.11:4.0.0 --conf spark.sql.hive.convertMetastoreParquet=false --num-executors 10 --driver-memory 7g --executor-memory 2g  --master yarn-client

scala> sqlContext.sql("select count(*) from hudi_rt where datestr = '2016-10-02'").show()

增量拉取Permalink

hudi-spark模块提供了DataSource API,这是一种从Hudi数据集中提取数据并通过Spark处理数据的更优雅的方法。 如下所示是一个示例增量拉取,它将获取自beginInstantTime以来写入的所有记录。

 Dataset<Row> hoodieIncViewDF = spark.read()
     .format("org.apache.hudi")
     .option(DataSourceReadOptions.VIEW_TYPE_OPT_KEY(),
             DataSourceReadOptions.VIEW_TYPE_INCREMENTAL_OPT_VAL())
     .option(DataSourceReadOptions.BEGIN_INSTANTTIME_OPT_KEY(),
            <beginInstantTime>)
     .option(DataSourceReadOptions.INCR_PATH_GLOB_OPT_KEY(),
            "/year=2020/month=*/day=*") // 可选,从指定的分区增量拉取
     .load(tablePath); // 用数据集的最底层路径

请参阅设置部分,以查看所有数据源选项。

另外,HoodieReadClient通过Hudi的隐式索引提供了以下功能。

API 描述
read(keys) 使用Hudi自己的索通过快速查找将与键对应的数据作为DataFrame读出
filterExists() 从提供的RDD[HoodieRecord]中过滤出已经存在的记录。对删除重复数据有用
checkExists(keys) 检查提供的键是否存在于Hudi数据集中

PrestoPermalink

Presto是一种常用的查询引擎,可提供交互式查询性能。 Hudi RO表可以在Presto中无缝查询。 这需要在整个安装过程中将hudi-presto-bundle jar放入<presto_install>/plugin/hive-hadoop2/中。

Impala (3.4 or later)Permalink

读优化表Permalink

Impala可以在HDFS上查询Hudi读优化表,作为一种 EXTERNAL TABLE 的形式。
可以通过以下方式在Impala上建立Hudi读优化表:

CREATE EXTERNAL TABLE database.table_name
LIKE PARQUET '/path/to/load/xxx.parquet'
STORED AS HUDIPARQUET
LOCATION '/path/to/load';

Impala可以利用合理的文件分区来提高查询的效率。 如果想要建立分区的表,文件夹命名需要根据此种方式year=2020/month=1. Impala使用=来区分分区名和分区值.
可以通过以下方式在Impala上建立分区Hudi读优化表:

CREATE EXTERNAL TABLE database.table_name
LIKE PARQUET '/path/to/load/xxx.parquet'
PARTITION BY (year int, month int, day int)
STORED AS HUDIPARQUET
LOCATION '/path/to/load';
ALTER TABLE database.table_name RECOVER PARTITIONS;

在Hudi成功写入一个新的提交后, 刷新Impala表来得到最新的结果.

REFRESH database.table_name

关于大数据方面技术问题可以咨询,替你解决你的苦恼。微信 hainanzhongjian

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342