解决hive1.2.1不支持update更新操作

在pk环境下部署了一套原生hadoop环境,hive版本1.2.1,开发在用代码对hive表做update操作时报错:

Caused by: org.apache.hadoop.hive.ql.parse.SemanticException: Attempt to do update or delete using transaction manager that does not support these operations.
 at org.apache.hadoop.hive.ql.parse.UpdateDeleteSemanticAnalyzer.analyzeInternal(UpdateDeleteSemanticAnalyzer.java:65)
 at org.apache.hadoop.hive.ql.parse.BaseSemanticAnalyzer.analyze(BaseSemanticAnalyzer.java:227)
 at org.apache.hadoop.hive.ql.Driver.compile(Driver.java:424)
 at org.apache.hadoop.hive.ql.Driver.compile(Driver.java:308)
 at org.apache.hadoop.hive.ql.Driver.compileInternal(Driver.java:1122)
 at org.apache.hadoop.hive.ql.Driver.compileAndRespond(Driver.java:1116)
 at org.apache.hive.service.cli.operation.SQLOperation.prepare(SQLOperation.java:110)

Hive从0.14版本开始支持事务和行级更新,但缺省是不支持的,需要一些附加的配置。要想支持行级insert、update、delete,需要配置Hive支持事务。

修改hive-site.xml,增加如下配置参数:

<property>
    <name>hive.support.concurrency</name>
    <value>true</value>
</property>
<property>
    <name>hive.enforce.bucketing</name>
    <value>true</value>
</property>
<property>
    <name>hive.exec.dynamic.partition.mode</name>
    <value>nonstrict</value>
</property>
<property>
    <name>hive.txn.manager</name>
    <value>org.apache.hadoop.hive.ql.lockmgr.DbTxnManager</value>
</property>
<property>
    <name>hive.compactor.initiator.on</name>
    <value>true</value>
</property>
<property>
    <name>hive.compactor.worker.threads</name>
    <value>1</value>
</property>

停止hiveserver2,kill掉进程

重启hiveserver2

hiveserver2

或者nohup hive --service hiveserver2 &

能看到10000端口正在监听代表正常

Transaction有几个依赖条件:

    1、只支持ORCFile

    2、默认关闭,需要自己开启

    3、表必须分桶

    4、0.14开始支持insert、update和delete

    5、必须加入一大堆配置(下文)

开始测试是否成功:

1、建立测试表

create table t1(id int, name string) 
clustered by (id) into 8 buckets 
stored as orc TBLPROPERTIES ('transactional'='true');

2、插入数据

insert into t1 values (1,'aaa');
insert into t1 values (2,'bbb');

2、测试update、delete

update t1 set name='ccc' where id=1;
delete from t1 where id=2;

update成功将id为1的name改为ccc

查看分桶情况:

说明:不能修改bucket列的值,否则会报以下错误:
FAILED: SemanticException [Error 10302]: Updating values of bucketing columns is not supported.  Column id.

遇到的问题:

1、连接metastore失败

select * from t1;

FAILED: LockException [Error 10280]: Error communicating with the metastore

重启metastore

Error rolling back: Can't call rollback when autocommit=true

不要加这个配置!!!! 

 <property>

          <name>hive.in.test</name>

          <value>true</value>

  </property>

 

create table t1_new like t1;    //复制表结构
insert into t1_new select * from t1;   //复制表数据
ALTER TABLE t1 RENAME TO t2;   //重命名表

可以使用 Flink 的 Kafka Consumer 将数据从 Kafka 中读取出来,然后对数据做相应的处理,并将处理后的结果存储至 HBase 数据库中。同时,可以使用 Flink 的 Hive Connector 创建外部表,以便将 HBase 中的数据映射到 Hive 中进行查询。 具体实现方式可以参考以下代码示例: ```scala val env = StreamExecutionEnvironment.getExecutionEnvironment env.setParallelism(1) val properties = new Properties() properties.setProperty("bootstrap.servers", "localhost:9092") properties.setProperty("group.id", "test") val consumer = new FlinkKafkaConsumer[String]("topic", new SimpleStringSchema(), properties) val source = env.addSource(consumer) val stream = source.map(x => { // 对数据进行处理 x }).addSink(new HBaseSinkFunction) val hiveConf = new HiveConf() hiveConf.addResource(new Path("/usr/local/hive/conf/hive-site.xml")) val hiveCatalog = new HiveCatalog("hive-catalog", "default", "/usr/local/hive/conf", "1.2.1", hiveConf) val tableSchema = new TableSchema(Array("column"), Array(Types.STRING)) hiveCatalog.createTable(new ObjectPath("default", "myTable"), new CatalogTable(tableSchema), true) val createExternalCatalogTable = """ CREATE EXTERNAL TABLE myTable_external ( column STRING ) STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' WITH SERDEPROPERTIES ( 'hbase.columns.mapping' = ':key,cf1:column', 'hbase.table.name' = 'myTable' ) TBLPROPERTIES ('hbase.mapred.output.outputtable' = 'myTable') """ val tableEnv = StreamTableEnvironment.create(env) tableEnv.registerCatalog("hive-catalog", hiveCatalog) tableEnv.useCatalog("hive-catalog") tableEnv.sqlUpdate(createExternalCatalogTable) tableEnv.sqlUpdate( "INSERT INTO myTable_external SELECT column FROM myTable" ) env.execute("Flink Kafka-HBase-Hive Example") ``` 在上述示例中,我们首先构建了一个 Kafka Consumer,并将数据源注册为 Flink 中的一个数据流 `source`,随后对数据源进行处理,并将处理后的结果写入到 HBase 数据库中,具体的 HBase 写入代码可以根据实际情况进行编写。 接着,我们使用 Flink 的 Hive Connector 创建外部表,将 HBase 中的数据映射到 Hive 中进行查询。需要注意的是,在此过程中,我们需要手动引入 `HiveConf` 和 `HiveCatalog`,以便完成 Hive 的配置和注册。随后,我们可以使用 `TableEnvironment` 完成表的创建和查询等操作
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hblicy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值