HIVE外部表到底损失多少性能

我们经常说HIVE外部表比内部表要慢,到底是为什么?  以HBASE为例,如果把HIVE作为一个HBASE客户端的查询工具,语句转义之后发到HBASE,HBASE返回数据,按理不至于慢很多,毕竟只多做了一层SQL到HBASE的语句的转义。 既然事实却是慢,那么我们就可以认为HIVE外部表不能这么理解,应该还有其他的东西在阻碍HIVE外部表的性能,毕竟HIVE是走MAPREDUCE。

hbase(main):003:0> count 't_device_fault_statistics'
557 row(s) in 0.2890 seconds

=> 557

这里用一个只有557条数据的HBASE表来测试,看看HIVE外部表到底和HBASE本身的客户端有哪些区别。 准别工作如下:

1. 打开HBASE UI,  http://hostname:60010/table.jsp?name=t_device_fault_statistics   这里有一个指标是requests(起初,我觉得这个是请求次数,测试之后我认为这是查询请求最后获得的行数, 因为你随便查询一个不存在的数字,你会发现这个数字是不会增长的,但是如果你查询输出10条数据,这个数字就会增长10)

2. 写一个JAVA程序,或者通过HBASE客户端也行

3. 建立HBASE的HIVE外部表

完成以上工作就开始测试,整个猜想是, 比较通过HIVE外部表访问之后requests增长和通过Hbase本身的API或者客户端访问的requests增长的区别。

当前requests:  74555

以下是程序访问,通过匹配ROWKEY的前缀,看看requests增长:

      val scan = new Scan()
      scan.setCaching(100)
      scan.setRowPrefixFilter(Bytes.toBytes(" i517T5100"))

访问之后的requests为: 74559 ,  增长了4, 返回结果也为4, 那么我可以这么理解,通过 i517T5100这个ROWKEY前缀访问,获取4条记录,requests也增长了4

以上程序我可以改写为SQL: select count(*) from t_device_fault_statistics where id like 'i517T5100%' 

访问之后,返回结果为4, 我们来看看requests问为多少: 75216,  75216-74559=657 ( 我测试很多次,表的实际行是557,但是每次这里增长657,我不确定为什么不是557,而是657)

这里暂时不管为什么不是557,而是实际的657, 总之可以看到,通过访问ROWKEY前缀,HBASE客户端只有4个requests增长,但是HIVE外部表有657。 能否这么理解,HIVE通过SQL查询是把
数据全部查询出来,然后通过HIVE本身来过滤,而HBASE查询是在服务器上过滤的,所以HIVE查询之后requests增长为表的行数. 


经过测试,除了SQL条件采用 等于 rowkey的方式,requests增长会和Hbase客户端一样,其他的一定是全表扫描。 

从上面的测试,HIVE外部表除了使用等于ROWKEY方式不慢,其他的查询应该是从HBASE加载全部数据,然后通过HIVE本身来过滤。奇怪的是等于ROWKEY方式为什么HIVE就可以通过HBASE过滤,而不是依靠HIVE自己本身呢?  说明等于ROWKEY的方式,HIVE可以直接转义成HBASE执行语句,定位一条数据,而其他方式HIVE无能为力,只能全表。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/17036462/viewspace-2141330/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/17036462/viewspace-2141330/

### AWS EMR 跨集群数据迁移方案及操作指南 #### 数据迁移的核心概念 AWS Elastic MapReduce (EMR) 是一种托管的 Hadoop 和 Spark 集群服务,能够轻松处理规模数据分析任务。当涉及跨集群的数据迁移时,主要关注的是如何高效地将数据从源集群迁移到目标集群,同时最小化停机时间和成本。 为了完成这一过程,可以采用多种策略和技术手段来实现数据的无缝迁移。以下是具体的解决方案和操作指南: --- #### 方案概述 1. **利用 S3 作为中间存储层** - 将源集群中的数据导出至 Amazon S3 存储桶。 - 使用目标集群重新加载这些数据。 - 这种方式适用于批量数据迁移场景,尤其适合静态数据集[^1]。 2. **通过 Hive 或 Spark SQL 实现表级迁移** - 如果数据存储在 Hive 表中,则可以通过 `INSERT INTO` 或 `CREATE TABLE AS SELECT` 的方式将数据复制到新位置。 - 对于动态更新频繁的数据,推荐使用增量同步机制[^2]。 3. **借助 Oozie 自动化工作流管理** - 创建一个自动化的工作流,在夜间或其他低负载时段执行数据迁移任务。 - 此方法特别适合定期全量或增量备份需求[^2]。 4. **直接网络通信(高级选项)** - 若两个集群位于同一 VPC 内部或者可通过私有链接访问彼此,则可以直接建立 SSH/FTP/SMB 等协议通道进行文件交换。 - 不过需要注意网络安全性和带宽限制等问题[^1]。 5. **使用第三方工具加速流程** - 像 DistCp 工具就是专为 HDFS 文件系统之间快速拷贝而设计的命令行实用程序之一; ```bash hadoop distcp hdfs://source-cluster/path/to/data hdfs://target-cluster/new-location/ ``` - 另外还有商业产品如 Talend Big Data Integration 提供图形界面简化整个过程[^4]。 --- #### 操作步骤详解 ##### 方法一:基于 S3 的间接迁移法 1. 在源 EMR 上运行如下 HiveQL 查询语句把原始记录保存成 Parquet/ORC 格式的外部表形式上传给指定 Bucket: ```sql INSERT OVERWRITE DIRECTORY 's3a://my-bucket/source-data' ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' STORED AS TEXTFILE; ``` 2. 登录到新的实例组里设置好相应的 IAM Role 权限以便允许其读取刚才生成的对象资源。 3. 执行类似下面这样的导入动作重建内部结构并填充内容进去: ```sql LOAD DATA INPATH 's3n://my-bucket/source-data/*.*' INTO TABLE my_table PARTITION(dt='value'); ``` ##### 方法二:运用 Apache Sqoop 导入关系型数据库资料 如果待转移的内容来源于 MySQL Server/RDS Instance 类的关系型管理系统的话,那么就可以考虑调用 Sqoop API 完成转换作业啦! ```bash sqoop import --connect jdbc:mysql://hostname/dbname \ --username root --password secret \ --table employees --as-parquetfile \ --warehouse-dir s3a://bucket-name/target-path/; ``` 最后再参照前述提到过的办法将其接入目的端即可[^3]。 ##### 方法三:实施实时流式转发模式 对于那些需要持续捕获最新变动情况的应用场合而言,Kafka Connect 插件无疑是一个不错的选择哦!它能帮助我们将 Producer 发送过来的消息即时分发出去从而达成预期效果[^4]. --- ### 注意事项 - 确认所有参与方都已正确配置防火墙规则以及子网路由表条目使得它们相互可见可达。 - 监控 CPU/Memory/Disk I/O Utilization Metrics 确保不会因为突发流量冲击而导致性能下降甚至崩溃事故的发生。 - 测试期间务必保留原样副本直到验证无误后再删除以免造成不可挽回损失。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值