Spark&Spark性能调优实战(zhuan)

本文详细阐述了在处理大规模数据时,如何通过一系列步骤优化Spark性能,包括数据压缩、选择合适的数据格式、优化序列化机制、调整工作节点配置以及解决垃圾回收问题,最终将查询时间从40秒优化至2秒。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

标签: spark spark 性能调优 | 发表时间:2014-08-09 22:09 | 作者:zcc_0015
分享到:
出处:http://blog.youkuaiyun.com

       Spark特别适用于多次操作特定的数据,分mem-only和mem & disk。其中mem-only:效率高,但占用大量的内存,成本很高;mem & disk:内存用完后,会自动向磁盘迁移,解决了内存不足的问题,却带来了数据的置换的消费。Spark常见的调优工具有nman、Jmeter和Jprofile,以下是Spark调优的一个实例分析:

1、场景:精确客户群

对一个容量为300g的客户信息表在spark上进行查询优化,该大宽表有1800多列,有效使用的有20列。

2、优化达到的效果:查询由原来的40.232s降低为2.7s

3、优化过程分析

第一步:首先发现磁盘存在大量的iowait,通过查看相关日志文件,发现一个block的大小进而推算出整个数据文件大小为300G整个内存无法容纳,采用压缩的方法实现优化,结合本数据文件的特点,存在大量的0和1,选 Gzip算法进行压缩,压缩后的大小为1.9G,该步使得查询从40.232降为了20.12s。

第二步:大宽表存在1800多列,而有效使用的只有20多列,故通过RCFILE只将有效的列加载,该步使得查询从20s降为12s。

第三步:通过Jprofile分析出CPU的负载过高,到底是什么原因造成的,仔细发现序列化机制有问题。Spark的serialization框架有两种:java自身的和kryo的。其中kryo 是一个快速高效的Java对象图形序列化框架,主要特点是性能、高效和易用,换成kryo后,查询从12s降到7s。

第四步:进一步分析CPU各核负载量很不均匀,内存也没有用满,系统的资源没有得到充分利用,该如何利用? (1)Spark的RDD的partition个数创建task的个数是对应的;(2)Partition的个数在hadoop的RDD中由block的个数决定的,内存:系统总内存数=work内存大小*work数=SPARK_WORKER_MEMORY*SPARK_WORKER_INSTANCES;

CPU:系统总的task数=work数×work所占的cores数=SPARK_WORKER_INSTANCES*SPARK_WORKER_CORES,计算task并行度,内存分配情况,调优参数:

SPARK_WORKER_INSTANCES=4

SPARK_WORKER_CORES = 3

SPARK_WORKER_MEMORY = 6G

Cpu(12core)  mem(24G),通过这几个参数的优化,查询由7s降到5s。

第五步:进一步发现Sharkserver端出现明显的fullGC,通过调优参数

Export SHARK_MASTER_MEM=2g,该步由6s降到3sl;

第六步:又发现当两表关联时,cpu 出现瓶颈,分析原因是日表做了gzip压缩,优化方法:日表不使用gzip压缩,将日表做成内存表。查询从3s降到2s。

4、总结

        优化是一个逐步求精的过程,回顾该优化过程,主要是从以下几个因素考虑:(1)mem;(2)cpu;(3)dis;(4)网络IO;(5)序列化机制。认真这些因素为主线,挖掘与其相关的内容时行大胆尝试。

作者:zcc_0015 发表于2014-8-9 22:09:38 原文链接
阅读:102 评论:0 查看评论
<think>好的,我现在要解决用户的问题:“java Long zhuan Interger”。看起来用户可能想了解如何将Java中的Long类型转换为Integer类型,但可能存在拼写错误。首先,我需要确认用户的需求是否正确,即是否真的是将Long转为Integer,而不是其他类型,比如int。 接下来,我应该回顾Java中基本数据类型和包装类的转换方法。Long和Integer都是包装类,分别对应基本类型long和int。由于它们都是Number的子类,但直接转换可能会遇到问题,因为它们之间没有继承关系,所以需要显式转换。 可能的转换步骤包括:首先从Long对象中获取long值,然后将其转换为int,再使用Integer的valueOf方法或者直接构造Integer对象。但需要注意,如果Long的值超出了Integer的范围(-2^31到2^31-1),转换会导致数据丢失或错误,因此需要检查范围。 另外,还要考虑自动拆箱和装箱的问题,以及Java 8之后的一些方法,比如Math.toIntExact,这个方法在转换时如果超出范围会抛出异常,增加安全性。 还需要提醒用户,从Java 9开始,Integer的构造函数被标记为过时,推荐使用静态工厂方法valueOf,以提高性能,因为会利用缓存。 可能的示例代码包括:使用intValue()方法,或者显式转换,以及处理可能的异常情况。同时,应该比较不同方法的缺点,比如直接转换和检查范围的方法。 最后,总结步骤和注意事项,确保用户理解转换过程中可能的风险和最佳实践。</think>在Java中,将`Long`类型转换为`Integer`类型需要分步处理。以下是详细的步骤和注意事项: --- ### 一、基本转换步骤 1. **获取`Long`的基本类型值** 通过`longValue()`方法提取`Long`对象的原始`long`类型值: ```java Long longObj = 12345L; long primitiveLong = longObj.longValue(); ``` 2. **将`long`强制转换为`int`** 通过强制类型转换将`long`转为`int`: ```java int primitiveInt = (int) primitiveLong; ``` 3. **将`int`封装为`Integer`** 使用`Integer.valueOf()`或自动装箱生成`Integer`对象: ```java Integer integerObj = Integer.valueOf(primitiveInt); // 或直接自动装箱 Integer integerObj2 = primitiveInt; ``` --- ### 二、完整代码示例 ```java Long longValue = 12345L; // 方法1:分步显式转换 int intValue = longValue.intValue(); // 直接用intValue()方法 Integer integerValue1 = Integer.valueOf(intValue); // 方法2:一步完成(自动拆箱+强制转换) Integer integerValue2 = (int) (long) longValue; // 方法3:使用Java 8的Math.toIntExact()(推荐) try { Integer integerValue3 = Math.toIntExact(longValue); } catch (ArithmeticException e) { System.out.println("超出Integer范围!"); } ``` --- ### 三、关键注意事项 1. **范围检查** `Integer`的范围是$-2^{31}$到$2^{31}-1$(即`-2147483648`到`2147483647`)。 如果`Long`值超出此范围,强制转换会导致数据错误: ```java Long largeLong = 3000000000L; // 超出Integer最大值 int badValue = (int) largeLong.longValue(); // 结果为-1294967296(错误) ``` 2. **推荐使用`Math.toIntExact()`** Java 8新增的`Math.toIntExact()`方法会在转换时检查范围,若溢出则抛出`ArithmeticException`: ```java try { int safeValue = Math.toIntExact(largeLong); } catch (ArithmeticException e) { System.out.println("转换失败:" + e.getMessage()); } ``` 3. **避免直接用构造函数** Java 9后,`new Integer(int)`已过时,建议使用`Integer.valueOf(int)`,该方法会复用缓存对象(范围`-128`到`127`),提高性能。 --- ### 四、总结 - **安全转换流程**: $$ \text{Long对象} \xrightarrow{\text{.longValue()}} \text{long} \xrightarrow{\text{强制转换}} \text{int} \xrightarrow{\text{Integer.valueOf()}} \text{Integer对象} $$ - **先选择范围检查方法**(如`Math.toIntExact()`),避免数据丢失。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值