java8在docker里性能不好是真的吗
发布时间:2025-05-20 15:11:16 发布人:远客网络
一、java8在docker里性能不好是真的吗
在讨论Java8在Docker中的性能表现时,需要明确几个关键点。首先,从JDK 10开始引入了默认开启的参数`UseContainerSupport`,此特性被回溯至JDK1.8的8u191版本。这意味着从8u191开始,JDK版本支持cgroup以查看内存限制,并结合`MaxRAMPercentage`动态计算堆内存上限,这个值根据服务使用的堆外内存和线程使用量来确定,通常情况下设置为75/80是安全的。
对于具体程序使用内存的合理设置,实践方法是先设定一个保守值,通过在环境中运行来测试,并结合实际请求量和监控数据持续调整Kubernetes或Docker的内存限制。这确保了资源的高效利用,同时也避免了资源浪费。
以下是一个使用Spring Boot(分层jar)工程构建镜像的Dockerfile示例,展示了如何在Docker构建过程中集成上述内存管理策略。
要特别注意,从JDK 9(8u131)开始,与容器支持相关的参数进行了几轮变更。在没有持续关注上游更新或参考低质量国内CSDN文章时,容易误入误区。例如,看到一些已废弃或不再适用的参数,此时不必再关注它们。
自Kubernetes 1.25版本开始,默认启用cgroup v2,导致早期版本的Java 8服务可能无法正确识别内存限制,尤其是对于那些在使用JDK版本<8u372、11.0.6.15及更低版本的Java服务。如遇到容器内存异常增加的情况,应关注这一问题,及时升级JDK版本以解决。
二、hadoop系统原理
1.Hadoop介绍
Hadoop是Apache旗下的一个用java语言实现开源软件框架,是一个开发和运行处理大规模数据的软件平台。允许使用简单的编程模型在大量计算机集群上对大型数据集进行分布式处理。
Hadoop是Apache旗下的一个用java语言实现开源软件框架,是一个开发和运行处理大规模数据的软件平台。允许使用简单的编程模型在大量计算机集群上对大型数据集进行分布式处理。
狭义上说,Hadoop指Apache这款开源框架,它的核心组件有:
HDFS(分布式文件系统):解决海量数据存储
YARN(作业调度和集群资源管理的框架):解决资源任务调度
MAPREDUCE(分布式运算编程框架):解决海量数据计算
广义上来说,Hadoop通常是指一个更广泛的概念——Hadoop生态圈。
当下的Hadoop已经成长为一个庞大的体系,随着生态系统的成长,新出现的项目越来越多,其中不乏一些非Apache主管的项目,这些项目对HADOOP是很好的补充或者更高层的抽象。
扩容能力(Scalable):Hadoop是在可用的计算机集群间分配数据并完成计算任务的,这些集群可用方便的扩展到数以千计的节点中。
成本低(Economical):Hadoop通过普通廉价的机器组成服务器集群来分发以及处理数据,以至于成本很低。
高效率(Efficient):通过并发数据,Hadoop可以在节点之间动态并行的移动数据,使得速度非常快。
可靠性(Rellable):能自动维护数据的多份复制,并且在任务失败后能自动地重新部署(redeploy)计算任务。所以Hadoop的按位存储和处理数据的能力值得人们信赖。
1.x版本系列:hadoop版本当中的第二代开源版本,主要修复0.x版本的一些bug等,该版本已被淘汰
2.x版本系列:架构产生重大变化,引入了yarn平台等许多新特性,是现在使用的主流版本。
3.x版本系列:对HDFS、MapReduce、YARN都有较大升级,还新增了Ozone key-value存储。
由于Hadoop 2.0是基于JDK 1.7开发的,而JDK 1.7在2015年4月已停止更新,这直接迫使Hadoop社区基于JDK 1.8重新发布一个新的Hadoop版本,即hadoop 3.0。Hadoop 3.0中引入了一些重要的功能和优化,包括HDFS可擦除编码、多Namenode支持、MR Native Task优化、YARN基于cgroup的内存和磁盘IO隔离、YARN container resizing等。
Apache hadoop项目组最新消息,hadoop3.x以后将会调整方案架构,将Mapreduce基于内存+io+磁盘,共同处理数据。改变最大的是hdfs,hdfs通过最近block块计算,根据最近计算原则,本地block块,加入到内存,先计算,通过IO,共享内存计算区域,最后快速形成计算结果,比Spark快10倍。