关于update:什么是-Backwardscompatible-update-releases

Backwards-compatible update releases,也被称为“向后兼容的更新公布”,是软件开发和保护中的一个要害概念。它指的是在软件系统中进行更新或降级时,确保新版本的软件可能与旧版本的软件放弃兼容,不会毁坏已有的性能和接口,从而使得用户可能平滑地降级而无需进行大规模的改变。这个概念在企业级软件架构中尤为重要,因为许多组织应用简单的软件系统来反对其业务流程,而不心愿因为软件更新而导致业务中断或额定的开发工作。为什么须要 Backwards-compatible update releases?在软件开发中,一直推出新的版本是常见的景象,这可能是为了修复破绽、提供新性能、改良性能等。然而,当用户在应用旧版本的软件上构建了一系列的业务流程、集成和自定义性能时,将现有的系统升级到新版本可能会导致一系列问题。这些问题可能包含: 性能中断:新版本的软件可能会引入不兼容的更改,导致现有性能无奈失常工作,从而影响业务流程。 接口变更:如果新版本的软件更改了与内部零碎或模块的接口,那么与这些零碎或模块的集成可能会受到影响,导致数据传输或交互中断。 培训和适应老本:用户和员工可能须要投入大量工夫和精力来适应新版本的软件,从而减少了培训和适应老本。 不稳定性:新版本可能蕴含未知的破绽或问题,可能会导致系统不稳固,从而影响业务连续性。 为了解决这些问题,采纳向后兼容的更新公布策略变得至关重要。Backwards-compatible update releases 的特点:向后兼容的更新公布具备以下几个外围特点: 放弃接口稳定性:在进行更新时,放弃现有的接口(API、数据格式等)稳固不变,以确保已有的零碎和模块能够持续失常运行。 增量变更:将更改合成为小的增量,逐渐引入新性能和修复,而不是一次性引入大量更改。 透明度:用户无需大规模扭转现有的工作流程,新性能能够平滑地集成到现有环境中。 文档和培训:提供具体的文档和培训资料,帮忙用户了解新性能,并尽可能升高适应老本。 例子: 让咱们通过一个虚构的企业级软件案例来具体阐明 Backwards-compatible update releases 的概念。假如有一家名为“EnterpriseERP”的公司,提供企业资源打算(ERP)软件。他们的软件用于治理洽购、库存、销售等业务流程。用户曾经在应用版本为“ERP v1.0”的软件,并构建了简单的业务流程和自定义模块。当初,EnterpriseERP 公司筹备推出“ERP v2.0”的新版本,其中包含许多新性能和改良。然而,公司理解到许多用户放心降级到新版本会导致业务中断。因而,他们决定采纳 Backwards-compatible update releases 的策略来安稳进行降级。以下是他们采纳的策略和办法: 放弃接口稳定性:在新版本中,ERP v2.0 放弃了与 v1.0 雷同的接口,包含 API、数据格式和用户界面。这意味着用户不须要批改他们曾经构建的集成和自定义性能。 增量变更:ERP v2.0 将更改分为多个小的增量,每个增量引入一些新性能、修复和改良。这样,用户能够逐渐适应新的变动,而不会被一次性大规模的更改所吞没。 透明度:新性能被有条理地集成到原有的用户界面中,用户能够在不影响业务流程的状况下逐渐应用它们。例如,在销售模块中,用户能够在创立订单时看到一些新的选项,而不用重新学习整个流程。 文档和培训:EnterpriseERP 公司提供了具体的文档,解释了新性能如何应用,以及如何在现有业务流程中集成它们。此外,他们还提供了在线培训和演示,以帮忙用户更快地上手。 通过采纳这些策略,EnterpriseERP 公司胜利地实现了向后兼容的更新公布。用户能够平滑地降级到 ERP v2.0,享受新性能和改良,同时放弃业务连续性。总结:Backwards-compatible update releases 是企业级软件架构中的重要概念,旨在确保新版本的软件可能与旧版本放弃兼容,从而防止性能中断、接口变更和额定的适应老本。通过放弃接口稳定性、增量变更、透明度以及提供文档和培训,能够实现向后兼容的更新公布,使用户可能顺利降级而不受影响。这种策略有助于维持业务连续性,进步用户满意度,并促成软件系统的可继续倒退。对于 Spartacus 来说,也就是指 non-breaking changes.

August 24, 2023 · 1 min · jiezi

LVFS项目公告和介绍

Linux基金会欢迎LVFS(Linux Vendor Firmware Service,Linux供应商固件服务)加入作为一个新项目。LVFS是一个安全的网站,允许硬件供应商上传固件更新。它被所有主要Linux发行版用于为客户端提供元数据,例如fwupdmgr、GNOME Software和KDE Discover。为了更了解该项目的历史和目标,我们与LVFS的上游维护者兼Red Hat首席软件工程师Richard Hughes交谈。Linux基金会:简而言之,LVFS(Linux Vendor Firmware Service,Linux供应商固件服务)是什么?你能给我们一点关于这个项目的背景吗?Richard Hughes:很久以前我想设计和构建一个OpenHardware色度计(一种用于测量屏幕上确切颜色的设备)作为周末的爱好。为了更新设备,我还构建了一个命令行工具和一个GUI工具来更新ColorHug固件,从我的个人主页下载一个版本的XML文件列表。我从Lapo Calamandrei(来自GNOME的设计师)那里获得了很多关于GUI的好设计建议,但我们得出结论,重新发明轮子并为每个开放硬件设备构建新的UI是很糟糕的。几个月前,微软将UEFI UpdateCapsule作为“Windows 10贴纸”的要求。这意味着供应商必须通过可从任何操作系统使用的标准化格式开始支持系统固件更新。Peter Jones(Red Hat的一位同事)努力研究如何在Linux上成功部署这些软件。胶囊(capsule)本身只是二进制可执行文件,因此需要的是我为ColorHug生成的相同类型的元数据,但是采用通用格式。像戴尔这样的厂商已经在生成某种元数据并试图支持Linux。许多应用固件更新的工具都是OEM特定的,通常只适用于Windows,有时会做出可疑的安全选择。通过使用Microsoft提出的相同容器文件格式(我们使用cabinet存档而不是.tar或.zip的原因),供应商可以构建一个可在Windows和Linux上运行的交付件。自早期网站原型以来,戴尔一直是支持者。Mario Limonciello(来自戴尔的高级首席软件开发工程师)与我合作过lvfs-website项目和fwupd,我认为他是这两个项目的共同维护者。现在,LVFS支持来自约30家供应商的72种不同设备的固件更新,并为Linux客户端提供了500多万次固件更新。fwupd项目仍在不断发展,每次发布都支持更多硬件。LVFS继续增长,增加了重要功能,如双因素身份验证、OAuth和各种其他工具,旨在从OEM获取高质量的元数据,并将其集成到ODM管道中。LVFS目前由捐赠支持,它为两个服务器实例和我在帮助供应商时使用的一些测试硬件提供资金。硬件供应商将可发行的固件以行业标准.cab存档以及特定于Linux的元数据文件打包上载到LVFS站点。fwupd守护程序允许会话软件更新本地计算机上的设备固件。虽然fwupd和LVFS是专为台式机设计的,它们也可用于手机、平板电脑、物联网设备和无头(headless)服务器。LVFS和fwupd守护程序是开源项目,来自许多不同公司的数十人的贡献。插件允许支持许多不同的更新协议。Linux Foundation:LVFS项目的一些目标是什么?Richard Hughes:短期目标是获得95%的可更新消费者硬件支持。随着最近增加的惠普,现在已成为一个现实的目标,尽管你必须通过“今年销售的新的消费者非企业硬件”来获得95%的资格,因为相当多的供应商只支持最多不超过几年的硬件,并且大多数仍为企业硬件的固件更新收费。我的长期目标是将LVFS视为Linux中基础设施的沉闷关键部分,就像你考虑使用NTP服务器获得准确时间,或者将PGP密钥服务器视为信任。随着最近Spectre和Meltdown问题的出现,固件更新不再被视为仅增加对新硬件的支持或修复偶尔出现的硬件问题。现在,EFI BIOS是一个具有网络功能的完全成熟的操作系统,公司和政府机构都意识到固件更新与内核更新同样重要,许多人现在正在编写“必须支持LVFS”作为任何采购政策的一部分。Linux基金会:社区如何了解更多并参与其中?Richard Hughes:LVFS实际上只是一个Python Flask项目,而且它都是免费代码。如果你需要支持,无论是作为OEM、ODM、公司还是最终用户,我们都非常乐意通过电子邮件私下,或作为GitHub上的问题或拉取请求来讨论这些内容。如果供应商想要将自定义闪存协议添加到fwupd,相同的规则适用,我们很乐意提供帮助。相当多的供应商正在私下测试LVFS和fwupd,我们同意只在一切正常并且合法和公关团队竖起大拇指时公布。从用户的角度来看,我们当然需要告诉硬件供应商在设备上架之前支持fwupd和LVFS。我们还有一个低容量的LVFS通告邮件列表,或者一般问题的用户fwupd邮件列表。相当多的人通过在当地的LUG或会议上进行会谈,或在会议或其他地方提供信息,帮助宣传这个项目。我也很乐意为此提供帮助。KubeCon + CloudNativeCon + Open Source Summit大会日期:会议日程通告日期:2019 年 4 月 10 日会议活动举办日期:2019 年 6 月 24 至 26 日KubeCon + CloudNativeCon + Open Source Summit赞助方案KubeCon + CloudNativeCon + Open Source Summit多元化奖学金现正接受申请KubeCon + CloudNativeCon和Open Source Summit即将首次合体落地中国KubeCon + CloudNativeCon + Open Source Summit购票窗口,立即购票!CNCF邀请你加入最终用户社区

March 27, 2019 · 1 min · jiezi

MySQL中update修改数据与原数据相同会再次执行吗

背景本文主要测试MySQL执行update语句时,针对与原数据(即未修改)相同的update语句会在MySQL内部重新执行吗?测试环境MySQL5.7.25Centos 7.4binlog_format为ROW参数root@localhost : (none) 04:53:15> show variables like ‘binlog_row_image’;+——————+——-+| Variable_name | Value |+——————+——-+| binlog_row_image | FULL |+——————+——-+1 row in set (0.00 sec)root@localhost : (none) 04:53:49> show variables like ‘binlog_format’; +—————+——-+| Variable_name | Value |+—————+——-+| binlog_format | ROW |+—————+——-+1 row in set (0.00 sec)root@localhost : test 05:15:14> show variables like ’transaction_isolation’;+———————–+—————–+| Variable_name | Value |+———————–+—————–+| transaction_isolation | REPEATABLE-READ |+———————–+—————–+1 row in set (0.00 sec)测试步骤session1root@localhost : test 04:49:48> begin;Query OK, 0 rows affected (0.00 sec)root@localhost : test 04:49:52> select * from test where id =1;+—-+——+——+——+| id | sid | mid | name |+—-+——+——+——+| 1 | 999 | 871 | NW |+—-+——+——+——+1 row in set (0.00 sec)root@localhost : (none) 04:54:03> show engine innodb status\Gshow master status\G…—LOG—Log sequence number 12090390Log flushed up to 12090390Pages flushed up to 12090390Last checkpoint at 120903810 pending log flushes, 0 pending chkp writes33 log i/o’s done, 0.00 log i/o’s/second*************************** 1. row *************************** File: mysql-bin.000001 Position: 154 Binlog_Do_DB: Binlog_Ignore_DB: Executed_Gtid_Set: 1 row in set (0.00 sec)session2root@localhost : test 04:47:45> update test set sid=55 where id =1;Query OK, 1 row affected (0.01 sec)Rows matched: 1 Changed: 1 Warnings: 0root@localhost : (none) 04:54:03> show engine innodb status\Gshow master status\G…—LOG—Log sequence number 12091486Log flushed up to 12091486Pages flushed up to 12091486Last checkpoint at 120914770 pending log flushes, 0 pending chkp writes39 log i/o’s done, 0.00 log i/o’s/second*************************** 1. row *************************** File: mysql-bin.000001 Position: 500 Binlog_Do_DB: Binlog_Ignore_DB: Executed_Gtid_Set: 8392d215-4928-11e9-a751-0242ac110002:11 row in set (0.00 sec)session1root@localhost : test 04:49:57> update test set sid=55 where id =1; Query OK, 0 rows affected (0.00 sec)Rows matched: 1 Changed: 0 Warnings: 0root@localhost : (none) 04:54:03> show engine innodb status\Gshow master status\G…—LOG—Log sequence number 12091486Log flushed up to 12091486Pages flushed up to 12091486Last checkpoint at 120914770 pending log flushes, 0 pending chkp writes39 log i/o’s done, 0.00 log i/o’s/second*************************** 1. row *************************** File: mysql-bin.000001 Position: 500 Binlog_Do_DB: Binlog_Ignore_DB: Executed_Gtid_Set: 8392d215-4928-11e9-a751-0242ac110002:11 row in set (0.00 sec)root@localhost : test 04:52:05> select * from test where id =1;+—-+——+——+——+| id | sid | mid | name |+—-+——+——+——+| 1 | 999 | 871 | NW |+—-+——+——+——+1 row in set (0.00 sec)root@localhost : test 04:52:42> commit;Query OK, 0 rows affected (0.00 sec)root@localhost : test 04:52:52> select * from test where id =1;+—-+——+——+——+| id | sid | mid | name |+—-+——+——+——+| 1 | 55 | 871 | NW |+—-+——+——+——+1 row in set (0.00 sec)总结在binlog_format=row和binlog_row_image=FULL时,由于MySQL 需要在 binlog 里面记录所有的字段,所以在读数据的时候就会把所有数据都读出来,那么重复数据的update不会执行。即MySQL 调用了 InnoDB 引擎提供的“修改为 (1,55)”这个接口,但是引擎发现值与原来相同,不更新,直接返回binlog_format为STATEMENT参数root@localhost : (none) 04:53:15> show variables like ‘binlog_row_image’;+——————+——-+| Variable_name | Value |+——————+——-+| binlog_row_image | FULL |+——————+——-+1 row in set (0.00 sec)root@localhost : (none) 05:16:08> show variables like ‘binlog_format’;+—————+———–+| Variable_name | Value |+—————+———–+| binlog_format | STATEMENT |+—————+———–+1 row in set (0.00 sec)root@localhost : test 05:15:14> show variables like ’transaction_isolation’;+———————–+—————–+| Variable_name | Value |+———————–+—————–+| transaction_isolation | REPEATABLE-READ |+———————–+—————–+1 row in set (0.00 sec)测试步骤session1root@localhost : test 05:16:42> begin;Query OK, 0 rows affected (0.00 sec)root@localhost : test 05:16:44> select * from test where id =1;+—-+——+——+——+| id | sid | mid | name |+—-+——+——+——+| 1 | 111 | 871 | NW |+—-+——+——+——+1 row in set (0.00 sec)root@localhost : (none) 05:16:51> show engine innodb status\Gshow master status\G…—LOG—Log sequence number 12092582Log flushed up to 12092582Pages flushed up to 12092582Last checkpoint at 120925730 pending log flushes, 0 pending chkp writes45 log i/o’s done, 0.00 log i/o’s/second*************************** 1. row *************************** File: mysql-bin.000001 Position: 154 Binlog_Do_DB: Binlog_Ignore_DB: Executed_Gtid_Set: 1 row in set (0.00 sec)session2root@localhost : test 05:18:30> update test set sid=999 where id =1;Query OK, 1 row affected (0.00 sec)Rows matched: 1 Changed: 1 Warnings: 0root@localhost : (none) 05:18:47> show engine innodb status\Gshow master status\G…—LOG—Log sequence number 12093678Log flushed up to 12093678Pages flushed up to 12093678Last checkpoint at 120936690 pending log flushes, 0 pending chkp writes51 log i/o’s done, 0.14 log i/o’s/second*************************** 1. row *************************** File: mysql-bin.000001 Position: 438 Binlog_Do_DB: Binlog_Ignore_DB: Executed_Gtid_Set: 8392d215-4928-11e9-a751-0242ac110002:11 row in set (0.00 sec)session1root@localhost : test 05:16:47> update test set sid=999 where id =1;Query OK, 0 rows affected (0.00 sec)Rows matched: 1 Changed: 0 Warnings: 0root@localhost : (none) 05:20:03> show engine innodb status\Gshow master status\G…—LOG—Log sequence number 12094504Log flushed up to 12094504Pages flushed up to 12094504Last checkpoint at 120944950 pending log flushes, 0 pending chkp writes56 log i/o’s done, 0.00 log i/o’s/second*************************** 1. row *************************** File: mysql-bin.000001 Position: 438 Binlog_Do_DB: Binlog_Ignore_DB: Executed_Gtid_Set: 8392d215-4928-11e9-a751-0242ac110002:11 row in set (0.00 sec)root@localhost : test 05:19:33> select * from test where id =1; +—-+——+——+——+| id | sid | mid | name |+—-+——+——+——+| 1 | 999 | 871 | NW |+—-+——+——+——+1 row in set (0.00 sec)root@localhost : test 05:20:44> commit;Query OK, 0 rows affected (0.01 sec)root@localhost : test 05:20:57> select * from test where id =1;+—-+——+——+——+| id | sid | mid | name |+—-+——+——+——+| 1 | 999 | 871 | NW |+—-+——+——+——+1 row in set (0.00 sec)总结在binlog_format=statement和binlog_row_image=FULL时,InnoDB内部认真执行了update语句,即“把这个值修改成 (1,999)“这个操作,该加锁的加锁,该更新的更新。一站式开发者服务,海量学习资源0元起!阿里热门开源项目、机器学习干货、开发者课程/工具、小微项目、移动研发等海量资源;更有开发者福利Kindle、技术图书幸运抽奖,100%中–》https://www.aliyun.com/acts/product-section-2019/developer?utm_content=g_1000047140本文作者:powdba阅读原文本文为云栖社区原创内容,未经允许不得转载。 ...

March 19, 2019 · 4 min · jiezi

hive0.14-insert、update、delete操作测试

问题导读1.测试insert报错,该如何解决?2.hive delete和update报错,该如何解决?3.什么情况下才允许delete和update?首先用最普通的建表语句建一个表: hive>create table test(id int,name string)row format delimited fields terminated by ',';复制代码测试insert: insert into table test values (1,'row1'),(2,'row2');复制代码结果报错: java.io.FileNotFoundException: File does not exist: hdfs://127.0.0.1:9000/home/hadoop/git/hive/packaging/target/apache-hive-0.14.0-SNAPSHOT-bin/ apache-hive-0.14.0-SNAPSHOT-bin/lib/curator-client-2.6.0.jar         at org.apache.hadoop.hdfs.DistributedFileSystem$17.doCall(DistributedFileSystem.java:1128)         at org.apache.hadoop.hdfs.DistributedFileSystem$17.doCall(DistributedFileSystem.java:1120)         at org.apache.hadoop.fs.FileSystemLinkResolver.resolve(FileSystemLinkResolver.java:81)         at org.apache.hadoop.hdfs.DistributedFileSystem.getFileStatus(DistributedFileSystem.java:1120)         at org.apache.hadoop.mapreduce.filecache.ClientDistributedCacheManager.getFileStatus(ClientDistributedCacheManager.java:288)         at org.apache.hadoop.mapreduce.filecache.ClientDistributedCacheManager.getFileStatus(ClientDistributedCacheManager.java:224)         at org.apache.hadoop.mapreduce.filecache.ClientDistributedCacheManager.determineTimestamps(ClientDistributedCacheManager.java:99)         at org.apache.hadoop.mapreduce.filecache.ClientDistributedCacheManager.determineTimestampsAndCacheVisibilities(ClientDistributedCacheManager.java:57)         at org.apache.hadoop.mapreduce.JobSubmitter.copyAndConfigureFiles(JobSubmitter.java:265)         at org.apache.hadoop.mapreduce.JobSubmitter.copyAndConfigureFiles(JobSubmitter.java:301)         at org.apache.hadoop.mapreduce.JobSubmitter.submitJobInternal(JobSubmitter.java:389)         at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1285)         at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1282)         at java.security.AccessController.doPrivileged(Native Method)         ......复制代码貌似往hdfs上找jar包了,小问题,直接把lib下的jar包上传到hdfs hadoop fs -mkdir -p /home/hadoop/git/hive/packaging/target/apache-hive-0.14.0-SNAPSHOT-bin/apache-hive-0.14.0-SNAPSHOT-bin/lib/ hadoop fs -put $HIVE_HOME/lib/* /home/hadoop/git/hive/packaging/target/apache-hive-0.14.0-SNAPSHOT-bin/apache-hive-0.14.0-SNAPSHOT-bin/lib/ 复制代码接着运行insert,没有问题,接下来测试delete hive>delete from test where id = 1;复制代码报错!:FAILED: SemanticException [Error 10294]: Attempt to do update or delete using transaction manager that does not support these operations.说是在使用的转换管理器不支持update跟delete操作。原来要支持update操作跟delete操作,必须额外再配置一些东西,见:https://cwiki.apache.org/conflue ... tersforTransactions根据提示配置hive-site.xml:     hive.support.concurrency – true     hive.enforce.bucketing – true     hive.exec.dynamic.partition.mode – nonstrict     hive.txn.manager – org.apache.hadoop.hive.ql.lockmgr.DbTxnManager     hive.compactor.initiator.on – true     hive.compactor.worker.threads – 1复制代码配置完以为能够顺利运行了,谁知开始报下面这个错误: FAILED: LockException [Error 10280]: Error communicating with the metastore复制代码与元数据库出现了问题,修改log为DEBUG查看具体错误: 4-11-04 14:20:14,367 DEBUG [Thread-8]: txn.CompactionTxnHandler (CompactionTxnHandler.java:findReadyToClean(265)) - Going to execute query <select cq_id, cq_database, cq_table, cq_partition, cq_type, cq_run_as from COMPACTION_QUEUE where cq_state = 'r'> 2014-11-04 14:20:14,367 ERROR [Thread-8]: txn.CompactionTxnHandler (CompactionTxnHandler.java:findReadyToClean(285)) - Unable to select next element for cleaning, Table 'hive.COMPACTION_QUEUE' doesn't exist 2014-11-04 14:20:14,367 DEBUG [Thread-8]: txn.CompactionTxnHandler (CompactionTxnHandler.java:findReadyToClean(287)) - Going to rollback 2014-11-04 14:20:14,368 ERROR [Thread-8]: compactor.Cleaner (Cleaner.java:run(143)) - Caught an exception in the main loop of compactor cleaner, MetaException(message :Unable to connect to transaction database com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'hive.COMPACTION_QUEUE' doesn't exist     at sun.reflect.GeneratedConstructorAccessor19.newInstance(Unknown Source)     at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)     at java.lang.reflect.Constructor.newInstance(Constructor.java:526)     at com.mysql.jdbc.Util.handleNewInstance(Util.java:409)复制代码在元数据库中找不到COMPACTION_QUEUE这个表,赶紧去mysql中查看,确实没有这个表。怎么会没有这个表呢?找了很久都没找到什么原因,查源码吧。在org.apache.hadoop.hive.metastore.txn下的TxnDbUtil类中找到了建表语句,顺藤摸瓜,找到了下面这个方法会调用建表语句: private void checkQFileTestHack() {     boolean hackOn = HiveConf.getBoolVar(conf, HiveConf.ConfVars.HIVE_IN_TEST) ||         HiveConf.getBoolVar(conf, HiveConf.ConfVars.HIVE_IN_TEZ_TEST);     if (hackOn) {       LOG.info("Hacking in canned values for transaction manager");       // Set up the transaction/locking db in the derby metastore       TxnDbUtil.setConfValues(conf);       try {         TxnDbUtil.prepDb();       } catch (Exception e) {         // We may have already created the tables and thus don't need to redo it.         if (!e.getMessage().contains("already exists")) {           throw new RuntimeException("Unable to set up transaction database for" +               " testing: " + e.getMessage());         }       }     }   }复制代码什么意思呢,就是说要运行建表语句还有一个条件:HIVE_IN_TEST或者HIVE_IN_TEZ_TEST.只有在测试环境中才能用delete,update操作,也可以理解,毕竟还没有开发完全。终于找到原因,解决方法也很简单:在hive-site.xml中添加下面的配置: <property> <name>hive.in.test</name> <value>true</value> </property>复制代码OK,再重新启动服务,再运行delete: hive>delete from test where id = 1;复制代码又报错: FAILED: SemanticException [Error 10297]: Attempt to do update or delete on table default.test that does not use an AcidOutputFormat or is not bucketed复制代码说是要进行delete操作的表test不是AcidOutputFormat或没有分桶。估计是要求输出是AcidOutputFormat然后必须分桶网上查到确实如此,而且目前只有ORCFileformat支持AcidOutputFormat,不仅如此建表时必须指定参数('transactional' = true)。感觉太麻烦了。。。。于是按照网上示例建表: hive>create table test(id int ,name string )clustered by (id) into 2 buckets stored as orc TBLPROPERTIES('transactional'='true');复制代码insert hive>insert into table test values (1,'row1'),(2,'row2'),(3,'row3');复制代码delete hive>delete from test where id = 1;复制代码update hive>update test set name = 'Raj' where id = 2;复制代码OK!全部顺利运行,不过貌似效率太低了,基本都要30s左右,估计应该可以优化,再研究研究...

October 24, 2017 · 3 min · jiezi