Impala查询 - HDFS缓存数据

HDFS缓存数据命令

  • 查看缓存池信息
hdfs cacheadmin -listPools -stats
  • 查看已缓存的数据信息
hdfs cacheadmin -listDirectives -stats
  • Impala表卸载缓存数据
alter table dw_crawler.bsl_zhongda_weibo_article_hive set uncached;
  • 创建缓存池
hdfs cacheadmin -addPool article_pool2 -owner impala
  • 显示表状态
show table stats bsl_zhongda_weibo_article_hive;
  • 将表加入缓存
alter table dw_crawler.bsl_zhongda_weibo_article_hive set cached in 'article_pool3';
  • 指定分区将表加入缓存
alter table dw_crawler.bsl_zhongda_weibo_article_hive partition(pt_created_date=20180101) set cached in 'article_pool3';

性能测试结果:

是否缓存

数据条数

数据量

处理时间(并发1)

处理时间(并发3)

处理时间(并发5)

-

116.5G

8s

20s

29s

-

116.5G

68.17

136

240

-

72.7G

8.38

20.6

30.3

-

72.7G

80s

165s

235s

 

异常处理

1.hdfs缓存池空间不足

 

[fwqzx002.zh:21000] ods_crawler> alter table  xxx partition (pt_created_date='201811') set cached in 'article_pool';
Query: alter table  xxx partition (pt_created_date='201811') set cached in 'article_pool'
ERROR: ImpalaRuntimeException: Caching path /user/hive/warehouse/xxxx/pt_created_date=201811 of size 24274436556 bytes at replication 1 would exceed pool article_pool's remaining capacity of 20450868109 bytes.
        at org.apache.hadoop.hdfs.server.namenode.CacheManager.checkLimit(CacheManager.java:405)
        at org.apache.hadoop.hdfs.server.namenode.CacheManager.addDirective(CacheManager.java:531)
        at org.apache.hadoop.hdfs.server.namenode.FSNDNCacheOp.addCacheDirective(FSNDNCacheOp.java:45)
        at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.addCacheDirective(FSNamesystem.java:6782)
        at org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.addCacheDirective(NameNodeRpcServer.java:1883)
        at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolServerSideTranslatorPB.addCacheDirective(ClientNamenodeProtocolServerSideTranslatorPB.java:1265)
        at org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos$ClientNamenodeProtocol$2.callBlockingMethod(ClientNamenodeProtocolProtos.java)
        at org.apache.hadoop.ipc.ProtobufRpcEngine$Server$ProtoBufRpcInvoker.call(ProtobufRpcEngine.java:523)
        at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:991)
        at org.apache.hadoop.ipc.Server$RpcCall.run(Server.java:869)
        at org.apache.hadoop.ipc.Server$RpcCall.run(Server.java:815)
        at java.security.AccessController.doPrivileged(Native Method)
        at javax.security.auth.Subject.doAs(Subject.java:422)
        at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1685)
        at org.apache.hadoop.ipc.Server$Handler.run(Server.java:2675)

CAUSED BY: InvalidRequestException: Caching path /user/hive/warehouse/xxxx/pt_created_date=201811 of size 24274436556 bytes at replication 1 would exceed pool article_pool's remaining capacity of 20450868109 bytes.
        at org.apache.hadoop.hdfs.server.namenode.CacheManager.checkLimit(CacheManager.java:405)
        at org.apache.hadoop.hdfs.server.namenode.CacheManager.addDirective(CacheManager.java:531)
        at org.apache.hadoop.hdfs.server.namenode.FSNDNCacheOp.addCacheDirective(FSNDNCacheOp.java:45)
        at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.addCacheDirective(FSNamesystem.java:6782)
        at org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.addCacheDirective(NameNodeRpcServer.java:1883)
        at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolServerSideTranslatorPB.addCacheDirective(ClientNamenodeProtocolServerSideTranslatorPB.java:1265)
        at org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos$ClientNamenodeProtocol$2.callBlockingMethod(ClientNamenodeProtocolProtos.java)
        at org.apache.hadoop.ipc.ProtobufRpcEngine$Server$ProtoBufRpcInvoker.call(ProtobufRpcEngine.java:523)
        at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:991)
        at org.apache.hadoop.ipc.Server$RpcCall.run(Server.java:869)
        at org.apache.hadoop.ipc.Server$RpcCall.run(Server.java:815)
        at java.security.AccessController.doPrivileged(Native Method)
        at javax.security.auth.Subject.doAs(Subject.java:422)
        at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1685)
        at org.apache.hadoop.ipc.Server$Handler.run(Server.java:2675)

CAUSED BY: RemoteException: Caching path /user/hive/warehouse/xxxx/pt_created_date=201811 of size 24274436556 bytes at replication 1 would exceed pool article_pool's remaining capacity of 20450868109 bytes.
        at org.apache.hadoop.hdfs.server.namenode.CacheManager.checkLimit(CacheManager.java:405)
        at org.apache.hadoop.hdfs.server.namenode.CacheManager.addDirective(CacheManager.java:531)
        at org.apache.hadoop.hdfs.server.namenode.FSNDNCacheOp.addCacheDirective(FSNDNCacheOp.java:45)
        at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.addCacheDirective(FSNamesystem.java:6782)
        at org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.addCacheDirective(NameNodeRpcServer.java:1883)
        at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolServerSideTranslatorPB.addCacheDirective(ClientNamenodeProtocolServerSideTranslatorPB.java:1265)
        at org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos$ClientNamenodeProtocol$2.callBlockingMethod(ClientNamenodeProtocolProtos.java)
        at org.apache.hadoop.ipc.ProtobufRpcEngine$Server$ProtoBufRpcInvoker.call(ProtobufRpcEngine.java:523)
        at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:991)
        at org.apache.hadoop.ipc.Server$RpcCall.run(Server.java:869)
        at org.apache.hadoop.ipc.Server$RpcCall.run(Server.java:815)
        at java.security.AccessController.doPrivileged(Native Method)
        at javax.security.auth.Subject.doAs(Subject.java:422)
        at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1685)
        at org.apache.hadoop.ipc.Server$Handler.run(Server.java:2675)

原因是创建时指定-limit 40000000000,即大小为40000000000 字节 ≈ 37.25GB,而我缓存的数据是18.21(已成功缓存分区)+22.61(缓存异常分区) 大于

之前创建缓存池命令

hdfs cacheadmin -addPool article_pool -owner impala -limit 40000000000

 解决方法:修改缓存池大小为自己可用值,默认为不限制

2.HDFS未全部缓存分区数据

明显看出数据Size 大小与BytesCached大小不相同

[fwqzx002.zh:21000] ods_crawler> show table stats tableName ;
Query: show table stats tableName 
+-----------------+-------+--------+---------+--------------+-------------------+---------+-------------------+-------------------------------------------------------------------------------------------------------------+
| pt_created_date | #Rows | #Files | Size    | Bytes Cached | Cache Replication | Format  | Incremental stats | Location                                                                                                    |
+-----------------+-------+--------+---------+--------------+-------------------+---------+-------------------+-------------------------------------------------------------------------------------------------------------+
| 201810          | -1    | 75     | 18.21GB | 5.36GB       | 1                 | PARQUET | false             | hdfs://nameservice1/user/hive/warehouse/tableName /pt_created_date=201810 |
| 201811          | -1    | 94     | 22.61GB | 55.35MB      | 1                 | PARQUET | false             | hdfs://nameservice1/user/hive/warehouse/tableName /pt_created_date=201811 |
| 201812          | -1    | 141    | 33.70GB | 33.22GB      | 1                 | PARQUET | false             | hdfs://nameservice1/user/hive/warehouse/tableName /pt_created_date=201812 |
| Total           | -1    | 310    | 74.51GB | 38.63GB      |                   |         |                   |                                                                                                             |
+-----------------+-------+--------+---------+--------------+-------------------+---------+-------------------+-------------------------------------------------------------------------------------------------------------+

 查看hdfs,发现需要缓存大小(BYTES_NEEDED)与实际缓存(BYTES_CACHED)的大小不相同

[hdfs@fwqzx002 root]$ hdfs cacheadmin -listDirectives -stats
Found 4 entries
 ID POOL            REPL EXPIRY  PATH                                                      BYTES_NEEDED  BYTES_CACHED  FILES_NEEDED  FILES_CACHED
 20 article_pool3      1 never   /user/hive/warehouse/tableName/pt_created_date=201812    36183104282   35666895768           141           139
 21 article_pool3      1 never   /user/hive/warehouse/tableName                                     0             0             0             0
 22 article_pool3      1 never   /user/hive/warehouse/tableName/pt_created_date=201810    19549131891    5751122434            75            22
 23 article_pool3      1 never   /user/hive/warehouse/tableName/pt_created_date=201811    24274436556      58042919            94             1

实际操作中未报异常,猜测HDFS缓存达到上限,去查看下HDFS配置

查看HDFS “dfs.datanode.max.locked.memory”参数,发现为4G,集群中有10个DataNode节点,一共加起来最多缓存40G,上面实际缓存大小≈38G左右已基本达到上限(因为数据并非绝对的平均存储,可能部分节点数据超过4G就会达到缓存上限)

 

尝试修改“dfs.datanode.max.locked.memory”为50G(根据个人服务器适当调整),结果全部缓存成功

 

  • 注:show table stats bsl_zhongda_weibo_article_hive 与 hdfs cacheadmin -listDirectives -stats 区别在于,show table stats bsl_zhongda_weibo_article_hive 未完成Bytes Cached显示为-1 ;后者是计算分配的空间,即后者非实际缓存完。

 

 

 

 

 

 

 

 

 

在Java中,可以通过不同的方式实现方法的参数传递。以下是一些常见的方法: 1. 值传递(Pass by Value):默认情况下,Java中的参数传递是通过值传递实现的。这意味着在方法调用时,实际参数的值被复制到形式参数中,方法内部对形式参数的修改不会影响实际参数的值。 2. 引用传递(Pass by Reference):Java中没有直接的引用传递机制,但可以通过传递对象引用来模拟引用传递的效果。当将一个对象作为参数传递给方法时,实际上是将对象的引用(地址)复制一份给形式参数,这样在方法内部对对象成员的修改会影响到实际参数指向的对象。 3. 数组传递:数组在Java中是对象,因此数组作为方法参数时,实际上是将数组的引用(地址)复制一份给形式参数。在方法内部对数组元素的修改会影响到实际参数指向的数组。 4. 可变参数(Varargs):Java 5及以上版本支持可变参数,在方法声明中使用省略号(...)表示。可变参数允许传递任意数量的参数,其实质是将参数打包成数组进行传递。 下面是具体的示例代码: ```java // 值传递示例 public void valuePass(int num) { num = 10; } // 引用传递示例 public void referencePass(MyObject obj) { obj.setValue(10); } // 数组传递示例 public void arrayPass(int[] arr) { arr[0] = 10; } // 可变参数示例 public void varargsPass(String... args) { for (String arg : args) { System.out.println(arg); } } ``` 希望这些信息对你有帮助!如果还有其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值