-
Ranger作为当前比较流行的大数据生态权限控制方案,在大部分的公司有着广泛使用,Ranger提供了不同用户访问大数据资源的权限控制方案,配合用户认证登录系统,它提供了细粒度级、基于角色的授权. 在MRS 服务的1.9.3的版本中,已经提供了对ranger的支持。在创建完安装了Ranger组件的MRS集群后,Hive的权限控制暂未集成在Ranger中,本章节主要介绍Hive组件如何集成在Ranger中。登录Ranger WebUI界面。在“Service Manager”中的HIVE处,单击+添加Hive Service。图1 添加Hive Service请参考表1填写添加Hive Service的相关参数,未在表中列出的参数请保持默认值。表1 参数说明参数说明示例值Service Name创建的service name名称,固定填写:hivedev。hivedevUsername可以任意填写。adminPassword可以任意填写。-jdbc.driverClassName连接hive的驱动类,固定填写:org.apache.hive.jdbc.HiveDriver。org.apache.hive.jdbc.HiveDriverjdbc.url连接hive的url,格式为ZooKeeper Mode:jdbc:hive2://<host>:2181/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2其中<host>为ZooKeeper地址,ZooKeeper地址可通过登录MRS Manager然后选择“服务管理 > ZooKeeper > 实例”,查看ZooKeeper实例的“管理IP”地址获取。jdbc:hive2://xx.xx.xx.xx:2181,xx.xx.xx.xx:2181,xx.xx.xx.xx:2181/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2图2 Create hivedev单击“Add”添加服务。启动Ranger Hive Plugin,授权Ranger管理Hive。hive.security.authorization.enabled = truehive.security.authorization.manager = org.apache.ranger.authorization.hive.authorizer.RangerHiveAuthorizerFactory在MRS控制台,单击集群名称进入集群详情页面。选择“组件管理”。选择“Hive > 服务配置”,将“基础配置”切换为“全部配置”。搜索配置“hive.security.authorization”,修改如下两个配置:图3 修改hive.security.authorization单击“保存配置”,并勾选“重新启动受影响的服务或实例。”重启Hive服务。添加访问控制策略,即Policy。登录Ranger WebUI界面。在HIVE区域单击已添加的服务名称“hivedev”。单击“Add New Policy”,新增访问控制策略。参考表2配置参数,未在表中列出的参数请保持默认值。表2 参数说明参数说明示例值Policy Name策略名称。Policy001database该策略允许访问的数据库名称。testtable该策略允许访问的数据库对应的表名称。table1Hive Column该策略允许访问的数据库对应的表的列名。nameAllow ConditionsSelect Group:该策略允许访问的用户组。Select User:该策略允许访问的用户组中的用户。Permissions:该策略允许用户使用的权限。Select Group:testuserSelect User:testuserPermissions:Create和select图4 新增hivedev的访问控制策略单击“Add”,完成策略添加,依据如上Policy示例,testuser用户组中的testuser用户将对Hive的“test”数据库中的表“table1”的“name”列有Create和select的权限,而对于其他列则没有任何的访问权限。参见从零开始使用Hive登录hive客户端,验证Ranger是否已经完成集成Hive。执行如下命令,进入hive beeline。source /opt/client/bigdata_envbeeline执行如下命令,建立连接并使用testuser登录。!connect jdbc:hive2://xx.xx.xx.xx:2181,xx.xx.3.81:2181,192.168.3.153:2181/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2图5 登录Hive查询数据,验证Ranger是否已经集成成功。图6 验证Ranger集成Hive
-
12.5 Hive12.5.1 建立表分区操作场景Hive在做Select查询时,一般会扫描整个表内容,会消耗较多时间去扫描不关注的数据。此时,可根据业务需求及其查询维度,建立合理的表分区,从而提高查询效率。操作步骤1. 使用PuTTY工具,以root用户登录已安装Hive客户端的节点。2. 执行以下命令,进入客户端安装目录,例如“/opt/client”。cd /opt/client3. 执行source bigdata_env命令,配置客户端环境变量。4. 在客户端中执行如下命令,执行登录操作。kinit 用户名5. 执行以下命令登录客户端工具。beeline6. 指定静态分区或者动态分区。1. 静态分区:静态分区是手动输入分区名称,在创建表时使用关键字PARTITIONED BY指定分区列名及数据类型。应用开发时,使用ALTER TABLE ADD PARTITION语句增加分区,以及使用LOAD DATA INTO PARTITON语句将数据加载到分区时,只能静态分区。2. 动态分区:通过查询命令,将结果插入到某个表的分区时,可以使用动态分区。动态分区通过在客户端工具执行如下命令来开启:set hive.exec.dynamic.partition=true动态分区默认模式是strict,也就是必须至少指定一列为静态分区,在静态分区下建立动态子分区,可以通过如下设置来开启完全的动态分区:set hive.exec.dynamic.partition.mode=nonstrict 说明:1. 动态分区可能导致一个DML语句创建大量的分区,对应的创建大量新文件夹,对系统性能可能带来影响。2. 在文件数量大的情况下,执行一个SQL语句启动时间较长,可以在执行SQL语句之前执行“set mapreduce.input.fileinputformat.list-status.num-threads = 100;”语句来缩短启动时间。“mapreduce.input.fileinputformat.list-status.num-threads”参数需要先添加到Hive的白名单才可设置。12.5.2 Join优化操作场景使用Join语句时,如果数据量大,可能造成命令执行速度和查询速度慢,此时可进行Join优化。Join优化可分为以下方式:· Map Join· Sort Merge Bucket Map Join· Join顺序优化Map JoinHive的Map Join适用于能够在内存中存放下的小表(指表大小小于25MB),通过“hive.mapjoin.smalltable.filesize”定义小表的大小,默认为25MB。Map Join的方法有两种:· 使用/*+ MAPJOIN(join_table) */。· 执行语句前设置如下参数,当前版本中该值默认为true。set hive.auto.convert.join=true使用Map Join时没有Reduce任务,而是在Map任务前起了一个MapReduce Local Task,这个Task通过TableScan读取小表内容到本机,在本机以HashTable的形式保存并写入硬盘上传到DFS,并在distributed cache中保存,在Map Task中从本地磁盘或者distributed cache中读取小表内容直接与大表join得到结果并输出。使用Map Join时需要注意小表不能过大,如果小表将内存基本用尽,会使整个系统性能下降甚至出现内存溢出的异常。Sort Merge Bucket Map Join使用Sort Merge Bucket Map Join必须满足以下2个条件:1. join的两张表都很大,内存中无法存放。2. 两张表都按照join key进行分桶(clustered by (column))和排序(sorted by(column)),且两张表的分桶数正好是倍数关系。通过如下设置,启用Sort Merge Bucket Map Join:set hive.optimize.bucketmapjoin=true set hive.optimize.bucketmapjoin.sortedmerge=true这种Map Join也没有Reduce任务,是在Map任务前启动MapReduce Local Task,将小表内容按桶读取到本地,在本机保存多个桶的HashTable备份并写入HDFS,并保存在Distributed Cache中,在Map Task中从本地磁盘或者Distributed Cache中按桶一个一个读取小表内容,然后与大表做匹配直接得到结果并输出。Join顺序优化当有3张及以上的表进行Join时,选择不同的Join顺序,执行时间存在较大差异。使用恰当的Join顺序可以有效缩短任务执行时间。Join顺序原则:· Join出来结果较小的组合,例如表数据量小或两张表Join后产生结果较少,优先执行。· Join出来结果大的组合,例如表数据量大或两张表Join后产生结果较多,在后面执行。例如,customer表的数据量最多,orders表和lineitem表优先Join可获得较少的中间结果。原有的Join语句如下:select l_orderkey, sum(l_extendedprice * (1 - l_discount)) as revenue, o_orderdate, o_shippriorityfrom customer, orders, lineitemwhere c_mktsegment = 'BUILDING' and c_custkey = o_custkey and l_orderkey = o_orderkey and o_orderdate < '1995-03-22' and l_shipdate > '1995-03-22'limit 10;Join顺序优化后如下:select l_orderkey, sum(l_extendedprice * (1 - l_discount)) as revenue, o_orderdate, o_shippriorityfrom orders, lineitem, customerwhere c_mktsegment = 'BUILDING' and c_custkey = o_custkey and l_orderkey = o_orderkey and o_orderdate < '1995-03-22' and l_shipdate > '1995-03-22'limit 10;注意事项Join数据倾斜问题执行任务的时候,任务进度长时间维持在99%,这种现象叫数据倾斜。数据倾斜是经常存在的,因为有少量的Reduce任务分配到的数据量和其他Reduce差异过大,导致大部分Reduce都已完成任务,但少量Reduce任务还没完成的情况。解决数据倾斜的问题,可通过设置set hive.optimize.skewjoin=true并调整hive.skewjoin.key的大小。hive.skewjoin.key是指Reduce端接收到多少个key即认为数据是倾斜的,并自动分发到多个Reduce。12.5.3 Group By优化操作场景优化Group by语句,可提升命令执行速度和查询速度。Group by的时候, Map端会先进行分组, 分组完后分发到Reduce端, Reduce端再进行分组。可采用Map端聚合的方式来进行Group by优化,开启Map端初步聚合,减少Map的输出数据量。操作步骤在Hive客户端进行如下设置:set hive.map.aggr=true注意事项Group By数据倾斜Group By也同样存在数据倾斜的问题,设置hive.groupby.skewindata为true,生成的查询计划会有两个MapReduce Job,第一个Job的Map输出结果会随机的分布到Reduce中,每个Reduce做聚合操作,并输出结果,这样的处理会使相同的Group By Key可能被分发到不同的Reduce中,从而达到负载均衡,第二个Job再根据预处理的结果按照Group By Key分发到Reduce中完成最终的聚合操作。Count Distinct聚合问题当使用聚合函数count distinct完成去重计数时,处理值为空的情况会使Reduce产生很严重的数据倾斜,可以将空值单独处理,如果是计算count distinct,可以通过where字句将该值排除掉,并在最后的count distinct结果中加1。如果还有其他计算,可以先将值为空的记录单独处理,再和其他计算结果合并。12.5.4 数据存储优化操作场景“ORC”是一种高效的列存储格式,在压缩比和读取效率上优于其他文件格式。建议使用“ORC”作为Hive表默认的存储格式。前提条件已登录Hive客户端,具体操作请参见《管理员指南》的“使用Hive客户端”。操作步骤· 推荐:使用“SNAPPY”压缩,适用于压缩比和读取效率要求均衡场景。Create table xx stored as orc tblproperties ("orc.compress"="SNAPPY")· 可用:使用“ZLIB”压缩,适用于压缩比要求较高场景。Create table xx stored as orc tblproperties ("orc.compress"="ZLIB") 说明:xx为具体使用的Hive表名。12.5.5 SQL优化操作场景在Hive上执行SQL语句查询时,如果语句中存在“(a&b) or (a&c)”逻辑时,建议将逻辑改为“a & (b or c)”。样例假设条件a为“p_partkey = l_partkey”,优化前样例如下所示:select sum(l_extendedprice* (1 - l_discount)) as revenuefrom lineitem, partwhere ( p_partkey = l_partkey and p_brand = 'Brand#32' and p_container in ('SM CASE', 'SM BOX', 'SM PACK', 'SM PKG') and l_quantity >= 7 and l_quantity <= 7 + 10 and p_size between 1 and 5 and l_shipmode in ('AIR', 'AIR REG') and l_shipinstruct = 'DELIVER IN PERSON' ) or ( p_partkey = l_partkey and p_brand = 'Brand#35' and p_container in ('MED BAG', 'MED BOX', 'MED PKG', 'MED PACK') and l_quantity >= 15 and l_quantity <= 15 + 10 and p_size between 1 and 10 and l_shipmode in ('AIR', 'AIR REG') and l_shipinstruct = 'DELIVER IN PERSON' ) or ( p_partkey = l_partkey and p_brand = 'Brand#24' and p_container in ('LG CASE', 'LG BOX', 'LG PACK', 'LG PKG') and l_quantity >= 26 and l_quantity <= 26 + 10 and p_size between 1 and 15 and l_shipmode in ('AIR', 'AIR REG') and l_shipinstruct = 'DELIVER IN PERSON' )优化后样例如下所示:select sum(l_extendedprice* (1 - l_discount)) as revenuefrom lineitem, partwhere p_partkey = l_partkey and (( p_brand = 'Brand#32' and p_container in ('SM CASE', 'SM BOX', 'SM PACK', 'SM PKG') and l_quantity >= 7 and l_quantity <= 7 + 10 and p_size between 1 and 5 and l_shipmode in ('AIR', 'AIR REG') and l_shipinstruct = 'DELIVER IN PERSON' ) or ( p_brand = 'Brand#35' and p_container in ('MED BAG', 'MED BOX', 'MED PKG', 'MED PACK') and l_quantity >= 15 and l_quantity <= 15 + 10 and p_size between 1 and 10 and l_shipmode in ('AIR', 'AIR REG') and l_shipinstruct = 'DELIVER IN PERSON' ) or ( p_brand = 'Brand#24' and p_container in ('LG CASE', 'LG BOX', 'LG PACK', 'LG PKG') and l_quantity >= 26 and l_quantity <= 26 + 10 and p_size between 1 and 15 and l_shipmode in ('AIR', 'AIR REG') and l_shipinstruct = 'DELIVER IN PERSON' ))12.5.6 使用Hive CBO优化查询操作场景在Hive中执行多表Join时,Hive支持开启CBO(Cost Based Optimization),系统会自动根据表的统计信息,例如数据量、文件数等,选出最优计划提高多表Join的效率。Hive需要先收集表的统计信息后才能使CBO正确的优化。 说明:· CBO优化器会基于统计信息和查询条件,尽可能地使join顺序达到最优。但是也可能存在特殊情况导致join顺序调整不准确。例如数据存在倾斜,以及查询条件值在表中不存在等场景,可能调整出非优化的join顺序。· 开启列统计信息自动收集时,需要在reduce侧做聚合统计。对于没有reduce阶段的insert任务,将会多出reduce阶段,用于收集统计信息。前提条件已登录Hive客户端,具体操作请参见《管理员指南》的“使用Hive客户端”。操作步骤1. 在Manager界面Hive组件的服务配置中搜索“hive.cbo.enable”参数,选中“true”永久开启功能或者通过以下命令临时开启功能:set hive.cbo.enable=true;2. 手动收集Hive表已有数据的统计信息。执行以下命令,可以手动收集统计信息。仅支持统计一张表,如果需要统计不同的表需重复执行。ANALYZE TABLE [db_name.]tablename [PARTITION(partcol1[=val1], partcol2[=val2], ...)]COMPUTE STATISTICS[FOR COLUMNS][NOSCAN]; 说明:1. 指定FOR COLUMNS时,收集列级别的统计信息。2. 指定NOSCAN时,将只统计文件大小和个数,不扫描具体文件。例如:analyze table table_name compute statistics;analyze table table_name compute statistics for columns;3. 配置Hive自动收集统计信息。开启配置后,执行insert overwrite/into命令插入数据时才自动统计新数据的信息。0. 在Hive客户端执行以下命令临时开启收集:set hive.stats.autogather = true; 开启表/分区级别的统计信息自动收集。set hive.stats.column.autogather = true; 开启列级别的统计信息自动收集。 说明:1. 列级别统计信息的收集不支持复杂的数据类型,例如Map,Struct等。2. 表级别统计信息的自动收集不支持Hive on HBase表。1. 在Manager界面Hive的服务配置中,搜索参数“hive.stats.autogather”和“hive.stats.column.autogather”,选中“true”永久开启收集功能。4. 执行以下命令可以查看统计信息。DESCRIBE FORMATTED table_name[.column_name] PARTITION partition_spec;例如:desc formatted table_name;desc formatted table_name.id;desc formatted table_name.id partition(time='2016-05-27'); 说明:分区表仅支持分区级别的统计信息收集,因此分区表需要指定分区来查询统计信息。
-
通过Hcatalog的java接口,获取hive表的元数据信息 一、获取hive表元数据的方式: 1、通过hive的beeline客户端命令获取表元数据,如在beeline客户端中执行desc tablename; 2、通过hive的jdbc接口获取获取表元数据; 3、通过HCatalog的hcat客户端获取表元数据,如执行hcat -e "desc tablename"; 4、通过HCatalog的java接口获取表元数据; 5、通过WebHcat的restful接口获取表元数据; 6、通过hive表的元数据库高斯DB获取表元数据(hive表的元数据库不对外开放)。 二、关于HCatalog HCatalog建立在Hive Metastore之上,具有Hive的DDL能力。 从另外一种意义上说,HCatalog还是Hadoop的表和存储管理层,它使用户能够通过使用不同的数据处理工具(比如Pig和MapReduce),更轻松地在网格上读写HDFS上的数据, HCatalog还能为这些数据处理工具提供读写接口,并使用Hive的命令行接口发布数据定义和元数据探索命令。此外,经过封装这些命令,WebHcat Server还对外提供了RESTful接口。 HCatalog接口直接访问Hive Metastore,在效率上更为高效。本章节主要介绍通过Hcatalog的java接口,获取hive的元数据信息。 三、java代码 样例代码功能:获取hive表中列的个数。 package com.huawei.bigdata.hcatalog.example; import java.util.HashMap; import org.apache.hadoop.conf.Configured; import org.apache.hadoop.hive.conf.HiveConf; import org.apache.hadoop.mapreduce.Job; import org.apache.hadoop.util.Tool; import org.apache.hadoop.util.ToolRunner; import org.apache.hive.hcatalog.data.schema.HCatSchema; import org.apache.hive.hcatalog.mapreduce.HCatOutputFormat; import org.apache.hive.hcatalog.mapreduce.OutputJobInfo; public class HCatalogExample extends Configured implements Tool { public HashMap<String, Integer> hm = new HashMap<>(); public int run(String[] args) { HiveConf.setLoadMetastoreConfig(true); String[] tablenames = args[0].split(","); Job outputJob = null; HCatSchema schema = null; try { outputJob = Job.getInstance(); for (int i = 0; i < tablenames.length; i++) { OutputJobInfo outputjobInfo = OutputJobInfo.create("default", tablenames[i], null); HCatOutputFormat.setOutput(outputJob, outputjobInfo); schema = outputjobInfo.getOutputSchema(); hm.put(tablenames, schema.getFieldNames().size()); } } catch (Exception e) { e.printStackTrace(); return 1; } return 0; } public static void main(String[] args) throws Exception { HCatalogExample he = new HCatalogExample(); int errcode = ToolRunner.run(he, args); he.hm.forEach((a, b) -> System.out.println("表"+a + "的列的个数为:" + b)); System.exit(errcode); } } 四、调试代码 1、安装集群的客户端,例如安装目录为“/opt/client”; 2、将上述代码打包成 HCatalog-examples.jar,并上传至客户端所在服务器的指定目录下,例如上传目录为“/opt/hive_client”; 3、加载如下环境变量: export HCAT_CLIENT=/opt/hive_client export HADOOP_HOME=/opt/client/HDFS/hadoop export HIVE_HOME=/opt/client/Hive/Beeline export HCAT_HOME=$HIVE_HOME/../HCatalog export LIB_JARS=$HCAT_HOME/lib/hive-hcatalog-core-3.1.0.jar,$HCAT_HOME/lib/hive-metastore-3.1.0.jar,$HCAT_HOME/lib/hive-standalone-metastore-3.1.0.jar,$HIVE_HOME/lib/hive-exec-3.1.0.jar,$HCAT_HOME/lib/libfb303-0.9.3.jar,$HCAT_HOME/lib/slf4j-api-1.7.10.jar,$HCAT_HOME/lib/antlr-3.5.2.jar,$HCAT_HOME/lib/jdo-api-3.0.1.jar,$HCAT_HOME/lib/antlr-runtime-3.5.2.jar,$HCAT_HOME/lib/datanucleus-api-jdo-4.2.4.jar,$HCAT_HOME/lib/datanucleus-core-4.1.17.jar,$HCAT_HOME/lib/datanucleus-rdbms-fi-4.1.19.jar,$HCAT_HOME/lib/log4j-api-2.10.0.jar,$HCAT_HOME/lib/log4j-core-2.10.0.jar export HADOOP_CLASSPATH=$HCAT_HOME/lib/hive-hcatalog-core-3.1.0.jar:$HCAT_HOME/lib/hive-metastore-3.1.0.jar:$HCAT_HOME/lib/hive-standalone-metastore-3.1.0.jar:$HIVE_HOME/lib/hive-exec-3.1.0.jar:$HCAT_HOME/lib/libfb303-0.9.3.jar:$HADOOP_HOME/etc/hadoop:$HCAT_HOME/conf:$HCAT_HOME/lib/slf4j-api-1.7.10.jar:$HCAT_HOME/lib/antlr-3.5.2.jar:$HCAT_HOME/lib/jdo-api-3.0.1.jar:$HCAT_HOME/lib/antlr-runtime-3.5.2.jar:$HCAT_HOME/lib/datanucleus-api-jdo-4.2.4.jar:$HCAT_HOME/lib/datanucleus-core-4.1.17.jar:$HCAT_HOME/lib/datanucleus-rdbms-fi-4.1.19.jar:$HCAT_HOME/lib/log4j-api-2.10.0.jar:$HCAT_HOME/lib/log4j-core-2.10.0.jar 4、执行提交命令: yarn --config $HADOOP_HOME/etc/hadoop jar $HCAT_CLIENT/HCatalog-examples.jar com.huawei.bigdata.hcatalog.example.HCatalogExample -libjars $LIB_JARS table10,table11,table12
-
2020-09-11:Hive的优化策略有哪些?#福大大架构师每日一题#
-
当一个大表和小表进行join,大表的join列是分区列,小表的join列不是分区列时,Hive的动态分区剪裁就会收集小表的join列的集合,发送给tez am, am在为大表计算split时,会根据集合的值过滤大表不需要扫描的分区,从而减少数据扫描量,提高sql执行性能。详情请点击博文链接:https://bbs.huaweicloud.com/blogs/174030
-
1. 背景 对hive做数据更新,由于不支持事务,所以需要先对原表进行数据备份,即存到另外一张表结构一样的hive表中,其中hive表数据存储格式为ORC。详情请点击博文链接:https://bbs.huaweicloud.com/blogs/170644
-
【准备CarbonData】参考:Apache CarbonData 2.0 开发实用系列之一:与Spark SQL集成使用【准备Hadoop】 1. 下载Hadoop 2.7.7 下载地址:https://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/common/hadoop-2.7.7/详情请点击博文链接:https://bbs.huaweicloud.com/blogs/170472
-
Zstandard(或Zstd)是由Facebook的Yann Collet开发的一个无损数据压缩算法,Zstandard在设计上与DEFLATE(.zip、gzip)算法有着差不多的压缩比,但有更高的压缩和解压缩速度。在其官网(https://github.com/facebook/zstd)给出的性能测试中,Zstandard比snappy、lzo等算法有较高的优势。详情请点击博文链接:https://bbs.huaweicloud.com/blogs/168931
-
1. Hive介绍Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供类SQL的查询功能。Hive基本原理是将HQL语句自动转换成可以在计算引擎上执行的任务。Hive 在加载数据过程中不会对数据进行任何的修改,只是将数据移动到HDFS 中Hive 设定的目录下。详情请点击博文链接:https://bbs.huaweicloud.com/blogs/168644
-
转载至华为云社区【摘要】 Hive On Spark大体与Spark SQL结构类似,只是SQL引擎不同,但是计算引擎都是Spark。将Spark作为计算引擎,性能会比传统的MapReduce快很多。华为云DLI服务全面兼容Spark能力,DLI SQL在封装Spark SQL的同时,集成了carbon和carbondata的全部功能,同时兼容传统的DataSource和hive语法建表,支持跨源访问多个服务的数据,增强了 Hive on Spark是由Cloudera发起,将Hive的查询作为Spark的任务提交到Spark集群上进行计算。通过该项目,可以提高Hive查询的性能,同时为已经部署了Hive或者Spark的用户提供了更加灵活的选择,从而进一步提高Hive和Spark的普及率。Hive on Spark是一个Hive的发展计划,该计划将Spark作为Hive的底层引擎之一,也就是说,Hive将不再受限于一个引擎,可以采用Map-Reduce、Tez、Spark等引擎。而Spark SQL的前身是Shark,是给熟悉RDBMS但又不理解MapReduce的技术人员提供快速上手的工具,其对Hive有太多依赖(如采用Hive的语法解析器、查询优化器等),2014年Spark团队停止对Shark的开发,将所有资源放Spark SQL项目上。Spark SQL作为Spark生态的一员继续发展,而不再受限于Hive,只是兼容Hive。 在分析区别之前,先看一下SQL语句通用解析执行过程: 语法解析: 对读入的SQL语句进行解析(Parse),分辨出SQL语句中哪些词是关键词(如SELECT、FROM、WHERE),哪些是表达式、哪些是Projection、哪些是Data Source等,从而判断SQL语句是否规范,形成一个语法树; 操作绑定: 将SQL语句和数据库的数据字典(列、表、视图等等)进行绑定(Bind),如果相关的Projection、Data Source等都是存在的话,就表示这个SQL语句是可以执行的; 策略优化:语法树中的每个节点是执行的rule,整棵树称之为执行策略。形成上述的执行策略树的执行策略可以进行优化(包括逻辑优化、生成物理计划和物理优化),所谓的优化就是对树中节点进行合并或是进行顺序上的调整,进而选择一个最优计划(Optimize),最终生成一棵任务树(Task Tree); 计划执行:依次执行(Execute)任务树中的各个Task,并将结果返回给用户。每个Task按照不同的实现,会把任务提交到不同的计算引擎上执行。 Hive on Spark总体的设计思路是,尽可能重用Hive逻辑层面的功能,从生成物理计划开始,提供一整套针对Spark的实现,比如Spark Compiler、Spark Task等,这样Hive的查询就可以作为Spark的任务来执行了。其设计的动机和主要原则有:1、 Hive on Spark尽可能少改动Hive的代码,从而不影响Hive目前对MapReduce和Tez的支持,以及在功能和性能方面的影响;2、 对于选择Spark的用户,应使其能够自动的获取Hive现有的和未来新增的功能,如数据类型、UDF、逻辑优化等;3、 尽可能降低维护成本,保持对Spark依赖的松耦合,不做专门针对spark引擎,而对其它引擎有影响的改动。 Spark SQL是spark套件中一个模板,它将数据的计算任务通过SQL的形式转换成了RDD的计算,类似于Hive通过SQL的形式将数据的计算任务转换成了MapReduce。Spark SQL的特点有: 1、和Spark Core的无缝集成,可以在写整个RDD应用的时候,配置Spark SQL来完成逻辑实现; 2、统一的数据访问方式,Spark SQL提供标准化的SQL查询; 3、Hive的继承,Spark SQL通过内嵌的hive或者连接外部已经部署好的hive案例,实现了对hive语法的继承和操作; 4、标准化的连接方式,Spark SQL可以通过启动thrift Server来支持JDBC、ODBC的访问,将自己作为一个BI Server使用。 总结:Hive On Spark大体与Spark SQL结构类似,只是SQL引擎不同,但是计算引擎都是Spark。将Spark作为计算引擎,性能会比传统的MapReduce快很多。华为云DLI服务全面兼容Spark能力,DLI SQL在封装Spark SQL的同时,集成了carbon和carbondata的全部功能,同时兼容传统的DataSource和hive语法建表,支持跨源访问多个服务的数据,增强了易用性,降低了使用门槛,同时避免了数据搬迁,从而实现高效的数据处理和检索。参考链接:Spark SQL: https://spark.apache.org/sql/Hive on Spark : https://cwiki.apache.org/confluence/display/Hive/Hive+on+Spark%3A+Getting+Started#HiveonSpark:GettingStarted-DesigndocumentsApache Spark源码走读之11 -- sql的解析与执行: https://www.cnblogs.com/hseagle/p/3752917.html
-
当用户要对Hive重点数据库、表或目录进行监控,防止“insert overwrite”语句误操作导致数据丢失时,可以利用Hive配置中的“hive.local.dir.confblacklist”进行目录保护。该配置项已对“/opt/”,“/user/hive/warehouse”等目录进行了默认配置。在MRS管理控制台进入集群管理页面。选择“组件管理 > 服务 > Hive > 服务配置”,在全部配置中搜索“hive.local.dir.confblacklist”配置项。在该配置项中添加用户要重点保护的数据库、表或目录路径。输入完成后,单击“保存”,保存配置项即可。
-
安全版本的集群中,HiveServer服务正常的情况下,使用Shell客户端或二次开发工具登录HiveServer失败,日志异常提“Read timed out”示关键字。at org.apache.hadoop.hive.jdbc.ha.HAHiveConnection.<init>(HAHiveConnection.java:60) ... 6 more Caused by: java.net.SocketTimeoutException: Read timed out at java.net.SocketInputStream.socketRead0(Native Method)可能原因:网络原因导致Hive客户端连接HiveServer时,Socket超时,连接失败。排查步骤:在客户端所在机器上,用ping命令检查Hive客户端与集群网络质量。如果网络不通或者延迟较大,证明网络状况较差。请联系网络管理员排查网络问题,以保证满足业务使用。增加网络闪断的保护,使用Hive客户端的应用层,增加连接失败重试机制,保证业务正常。
-
HiveServer服务正常的情况下,使用Shell客户端或二次开发工具登录HiveServer失败,日志提示“The ZooKeeper client is AuthFailed”关键字。20/05/19 10:52:00 WARN utils.HAClientUtilDummyWatcher: The ZooKeeper client is AuthFailed 2020/05/19 10:52:00 INFO utils.HiveHAClientUtil: Exception thrown while reading data from znode.The possible reason may be connectionless. This is recoverable. Retrying..可能原因:客户端用户使用的keytab文件存在问题。客户端所在节点的系统时间与集群的系统时间不一致导致鉴权失败。排查步骤:使用keytab方式认证的客户端,与系统管理员确认客户端用户使用的keytab信息是否正确,保证获取正确的keytab文件。检查客户端所在节点的系统时间,是否与集群的系统时间一致。
-
开启安全认证的MRS集群中,执行beeline命令,登录失败,界面提示“authentication failed”关键字,具体信息如下:Debug is true storeKey false useTicketCache true useKeyTab false doNotPrompt false ticketCache is null isInitiator true KeyTab is null refreshKrb5Config is false principal is null tryFirstPass is false useFirstPass is false storePass is false clearPass is false Acquire TGT from Cache Credentials are no longer valid Principal is null null credentials from Ticket Cache [Krb5LoginModule] authentication failed No password provided处理步骤:cd /opt/clientsource bigdata_env命令,配置环境变量。在客户端中执行如下命令,执行登录操作。kinit user然后重新执行beeline命令登录Hive客户端即可。
上滑加载中
推荐直播
-
GaussDB管理平台TPOPS,DBA高效运维的一站式解决方案
2024/12/24 周二 16:30-18:00
Leo 华为云数据库DTSE技术布道师
数据库的复杂运维,是否让你感到头疼不已?今天,华为云GaussDB管理平台将彻底来改观!本期直播,我们将深入探索GaussDB管理平台的TPOPS功能,带你感受一键式部署安装的便捷,和智能化运维管理的高效,让复杂的运维、管理变得简单,让简单变得可靠。
回顾中 -
DTT年度收官盛典:华为开发者空间大咖汇,共探云端开发创新
2025/01/08 周三 16:30-18:00
Yawei 华为云开发工具和效率首席专家 Edwin 华为开发者空间产品总监
数字化转型进程持续加速,驱动着技术革新发展,华为开发者空间如何巧妙整合鸿蒙、昇腾、鲲鹏等核心资源,打破平台间的壁垒,实现跨平台协同?在科技迅猛发展的今天,开发者们如何迅速把握机遇,实现高效、创新的技术突破?DTT 年度收官盛典,将与大家共同探索华为开发者空间的创新奥秘。
回顾中
热门标签