Java客户端读取Hive 3.0任务进度(一)

本文探讨了在Hive3.0中读取任务进度的挑战,详细介绍了通过Hadoop API接口读取MapReduce任务进度的过程。文章指出,Hive任务进度与MapReduce进度一致,可通过特定接口获取JSON格式的任务状态数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

通过查阅网上大神的博客可以发现,博客中读取Hive进度的方法都是通过Hive的日志去读取。但是我在查看Hive3.0的日志后,发现Hive3.0的日志中不会记录实时的任务进度,只会记录实时进度以外的其他数据。所以必须另辟蹊径,以解决这个问题。

如何才能读取到Hive的任务进度?

通过观察可以发现,Hive的任务可以分为两种:

  1. 不需要执行MapReduce的简单任务,可以瞬时完成。
  2. 需要执行MapReduce的复杂任务,如:需要表关联、统计等任务,需要执行一段时间。

所以我们可以看出,我们只要读取需要执行MapReduce的Hive任务进度即可,并且这个任务进度应该就是MapReduce的任务进度。在CLI执行Hive SQL时可以发现,HIve能在命令行显示出MapReduce任务的进度。那么Hive是通过何种方式读取到MapReduce的任务进度的呢?

HIve自身是如何读取任务进度?

通过分析源码,我发现Hive自身是通过Hadoop所提供的API接口,去读取MapReduce的任务进度。通过查阅文档和实际测试我们可以发现在http://slave2.hadoop:8088/ws/v1/cluster/apps/application_1430424020775_0001这个接口下,可以由application_1430424020775_0001这个MapReduce任务ID,拿到对应任务状态的JSON格式数据,如下(hadoop 3.0)

{
    "app": {
        "id": "application_1545745555642_0008",
        "user": "hdfs",
        "name": "HIVE-f33a32e4-5932-46a9-8473-dc755616a595",
        "queue": "default",
        "state": "FINISHED",
        "finalStatus": "SUCCEEDED",
        "progress": 100,
        "trackingUI": "History",
        "trackingUrl": "http://slave2.hadoop:8088/proxy/application_1545745555642_0008/",
        "diagnostics": "Session timed out, lastDAGCompletionTime=1548319082823 ms, sessionTimeoutInterval=600000 ms\nSession stats:submittedDAGs=1, successfulDAGs=1, failedDAGs=0, killedDAGs=0\n",
        "clusterId": 1545745555642,
        "applicationType": "TEZ",
        "applicationTags": "hive_20190124163742_0a204765-22a4-4a35-b08c-c629a8244758",
        "priority": 0,
        "startedTime": 1548319064617,
        "finishedTime": 1548319741514,
        "elapsedTime": 676897,
        "amContainerLogs": "http://slave3.hadoop:8042/node/containerlogs/container_e12_1545745555642_0008_01_000001/hdfs",
        "amHostHttpAddress": "slave3.hadoop:8042",
        "amRPCAddress": "slave3.hadoop:45439",
        "masterNodeId": "slave3.hadoop:45454",
        "allocatedMB": -1,
        "allocatedVCores": -1,
        "reservedMB": -1,
        "reservedVCores": -1,
        "runningContainers": -1,
        "memorySeconds": 12773007,
        "vcoreSeconds": 692,
        "queueUsagePercentage": 0,
        "clusterUsagePercentage": 0,
        "resourceSecondsMap": {
            "entry": {
                "key": "vcores",
                "value": "692"
            }
        },
        "preemptedResourceMB": 0,
        "preemptedResourceVCores": 0,
        "numNonAMContainerPreempted": 0,
        "numAMContainerPreempted": 0,
        "preemptedMemorySeconds": 0,
        "preemptedVcoreSeconds": 0,
        "preemptedResourceSecondsMap": {},
        "logAggregationStatus": "SUCCEEDED",
        "unmanagedApplication": false,
        "amNodeLabelExpression": "",
        "timeouts": {
            "timeout": [
                {
                    "type": "LIFETIME",
                    "expiryTime": "UNLIMITED",
                    "remainingTimeInSeconds": -1
                }
            ]
        }
    }
}

可以发现其中的progress就是任务的状态。(需要注意的是,这个接口获取的任务状态,在任务进行时是准确的,但是任务一旦完成或者失败,这个任务的进度就会变为0,而不是100或者其他数字。其次,在hive连续提交任务时,多个hive任务会共用一个app_id)。

初步思路

我们可以通过读取Hive的日志获取到,MapReduce的app_id,然后在通过这个id和yarn的接口获取到任务进度。

即:

  1. 读取到HIve的日志,从日志中获取MapReduce的任务id
  2. 通过任务id和接口获取到任务的状态对应的JSON格式的数据
Hive 3.0相对于Hive 1.0引入了些重大变化和新功能,以下是Hive 1.0Hive 3.0之间的些主要区别: 1. 执行引擎:Hive 1.0使用的是MapReduce作为默认的执行引擎,而Hive 3.0引入了新的执行引擎,称为Hive LLAP(Low Latency Analytical Processing)。Hive LLAP可以提供更低的查询延迟和更高的并发性能。 2. ACID事务支持:Hive 3.0引入了ACID(原子性、致性、隔离性和持久性)事务支持。这意味着可以在Hive中执行原子性的事务操作,包括插入、更新和删除操作。 3. 命名空间(Namespace)支持:Hive 3.0引入了命名空间的概念,可以更好地组织和管理表、视图等对象。命名空间可以帮助避免名称冲突,并提供更好的隔离性。 4. 分区表语法变更:Hive 3.0中推荐使用`PARTITIONED BY`关键字来定义分区列,而不再使用`CLUSTERED BY`和`SORTED BY`。这个改变可以提供更灵活和简化的分区表语法。 5. 存储格式变更:Hive 3.0默认使用ORC格式作为存储格式,而Hive 1.0默认使用TEXTFILE格式。ORC格式在压缩和查询性能方面通常比TEXTFILE格式更优秀。 6. 优化器和执行计划:Hive 3.0引入了新的优化器和执行计划,可以提供更好的查询性能和优化。 总体而言,Hive 3.0相对于Hive 1.0引入了更多的功能和改进,包括新的执行引擎、ACID事务支持、命名空间支持等。这些变化使得Hive 3.0在性能、功能和可扩展性方面有了显著的提升。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值