Hive如何处理大量小文件
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hive如何处理大量小文件相关的知识,希望对你有一定的参考价值。
参考技术A 1.动态分区插入数据的时候,会产生大量的小文件,从而导致map数量的暴增2.数据源本身就包含有大量的小文件
3.reduce个数越多,生成的小文件也越多
1 从HIVE角度来看的话呢,小文件越多,map的个数也会越多,每一个map都会开启一个JVM虚拟机,每个虚拟机都要创建任务,执行任务,这些流程都会造成大量的资源浪费,严重影响性能
2 在HDFS中,每个小文件约占150byte,如果小文件过多则会占用大量的内存。这样namenode内存容量严重制约了集群的发展
4.1 使用Hadoop achieve把小文件进行归档
4.2 重建表,建表时减少reduce的数量
4.3 通过参数调节,设置map/reduce的数量
4.3.1设置map输入合并小文件的相关参数:
4.3.2 设置map输出和reduce输出进行合并的相关参数:
如何处理来自 REST 服务的大量数据
【中文标题】如何处理来自 REST 服务的大量数据【英文标题】:How to handle huge data from a REST service 【发布时间】:2014-03-03 18:09:35 【问题描述】:我们正在使用返回大量数据的 REST 服务。 在生产中,服务器硬件可以处理它。 我需要通过在本地机器上获取数据来测试 REST 服务, 它无法处理大量数据。 我的本地机器是 4G i5。 每次我点击服务时,我都会出现内存不足的异常。
response.getStatus()
返回 200 状态。
但是在使用输入流阅读器收集数据时,我遇到了内存不足的异常。
BufferedReader br = new BufferedReader(new
InputStreamReader(newByteArrayInputStream(response.getEntity().getBytes())));
有没有其他方法来收集数据而不会遇到内存异常?
我尝试将我的 VM 大小推到 2G,但它仍然不起作用。
【问题讨论】:
只返回部分响应怎么样? 写入磁盘或/dev/null @Petey 我需要字节数组来写入文件,但是在获取字节时它失败了 'response.getEntity().getBytes()' @LutzHorn,您的意思是更改 Web 服务以部分返回,或者在接收响应时我们可以将其拆分为部分? 考虑向您的 REST 服务添加“测试模式”,将响应数据写入文件或仅返回一小部分数据。 【参考方案1】:如果服务支持,在整个响应内容负载范围内使用requesting chunks的HTTP标准方法。
另一种方法(同样,假设 API 支持它)是pagination。
【讨论】:
这是我可以推荐的好方法。谢谢布赖恩!!【参考方案2】:您可以在 REST 服务配置中实施阈值设置,以限制返回的数据量。 在生产中,阈值要么不设置,要么设置为较大的值。 在您的测试环境中,您可以将阈值设置为一个小的、可管理的值。
【讨论】:
以上是关于Hive如何处理大量小文件的主要内容,如果未能解决你的问题,请参考以下文章