大数据开发过程中遇到的问题

本文介绍了Linux系统中buffer/cache的作用及回收方法,并提供了批量删除Hadoop任务、解决map/reduce锁死等问题的解决方案。

1.由于内存不够引起
在linux下执行top命令查看各进程使用内存情况
如果发现没有进程耗费太大的内存
查看空闲内存:free -m
这里写图片描述
发现空闲内存所剩无几:
buffers与cached占用了将近一半的内存
什么是buffer/cache?
buffer和cache是两个在计算机技术中被用滥的名词,放在不通语境下会有不同的意义。在Linux的内存管理中,这里的buffer指Linux内存的:Buffer cache。这里的cache指Linux内存中的:Page cache。翻译成中文可以叫做缓冲区缓存和页面缓存。在历史上,它们一个(buffer)被用来当成对io设备写的缓存,而另一个(cache)被用来当作对io设备的读缓存,这里的io设备,主要指的是块设备文件和文件系统上的普通文件。但是现在,它们的意义已经不一样了。在当前的内核中,page cache顾名思义就是针对内存页的缓存,说白了就是,如果有内存是以page进行分配管理的,都可以使用page cache作为其缓存来管理使用。当然,不是所有的内存都是以页(page)进行管理的,也有很多是针对块(block)进行管理的,这部分内存使用如果要用到cache功能,则都集中到buffer cache中来使用。(从这个角度出发,是不是buffer cache改名叫做block cache更好?)然而,也不是所有块(block)都有固定长度,系统上块的长度主要是根据所使用的块设备决定的,而页长度在X86上无论是32位还是64位都是4k。

明白了这两套缓存系统的区别,就可以理解它们究竟都可以用来做什么了。

什么是page cache?
Page cache主要用来作为文件系统上的文件数据的缓存来用,尤其是针对当进程对文件有read/write操作的时候。如果你仔细想想的话,作为可以映射文件到内存的系统调用:mmap是不是很自然的也应该用到page cache?在当前的系统实现里,page cache也被作为其它文件类型的缓存设备来用,所以事实上page cache也负责了大部分的块设备文件的缓存工作。

什么是buffer cache

Buffer cache则主要是设计用来在系统对块设备进行读写的时候,对块进行数据缓存的系统来使用。这意味着某些对块的操作会使用buffer cache进行缓存,比如我们在格式化文件系统的时候。一般情况下两个缓存系统是一起配合使用的,比如当我们对一个文件进行写操作的时候,page cache的内容会被改变,而buffer cache则可以用来将page标记为不同的缓冲区,并记录是哪一个缓冲区被修改了。这样,内核在后续执行脏数据的回写(writeback)时,就不用将整个page写回,而只需要写回修改的部分即可。

如何回收cache?
Linux内核会在内存将要耗尽的时候,触发内存回收的工作,以便释放出内存给急需内存的进程使用。一般情况下,这个操作中主要的内存释放都来自于对buffer/cache的释放。尤其是被使用更多的cache空间。既然它主要用来做缓存,只是在内存够用的时候加快进程对文件的读写速度,那么在内存压力较大的情况下,当然有必要清空释放cache,作为free空间分给相关进程使用。所以一般情况下,我们认为buffer/cache空间可以被释放,这个理解是正确的。

但是这种清缓存的工作也并不是没有成本。理解cache是干什么的就可以明白清缓存必须保证cache中的数据跟对应文件中的数据一致,才能对cache进行释放。所以伴随着cache清除的行为的,一般都是系统IO飙高。因为内核要对比cache中的数据和对应硬盘文件上的数据是否一致,如果不一致需要写回,之后才能回收。
cat /proc/sys/vm/drop_caches
1
方法是:

echo 1 > /proc/sys/vm/drop_caches
当然,这个文件可以设置的值分别为1、2、3。它们所表示的含义为:

echo 1 > /proc/sys/vm/drop_caches:表示清除pagecache。
echo 2 > /proc/sys/vm/drop_caches:表示清除回收slab分配器中的对象(包括目录项缓存和inode缓存)。slab分配器是内核中管理内存的一种机制,其中很多缓存数据实现都是用的pagecache。
echo 3 > /proc/sys/vm/drop_caches:表示清除pagecache和slab分配器中的缓存对象。
我们这里执行:echo 3,执行之后发现buffer跟cache所占内存明显小了

2.批量删除hadoop中的任务
for i in hadoop job -list | grep -w root| awk '{print $1}' | grep job_; do hadoop job -kill $i; done
for i in yarn application -list | grep -w root| awk '{print $1}' | grep application_; do yarn application -kill $i; done

3.map,reudce锁死问题:
(我们用的CDH平台,解决方式是把mapreduce.job.reduce.slowstart.completedmaps中的参数由0.8改为1)参考博客:https://www.cnblogs.com/yueweimian/p/4667888.html

"4 .java.io.IOException: Filesystem closed"
多线程并发调用org.apache.hadoop.fs.FileSystem.close()
解决方式:
禁用hdfs缓冲
conf.setBoolean(“fs.hdfs.impl.disable.cache”, true);
"5.hbase预分区后只有一个map"
解决方式:
默认map数量是由region数量决定的,但是好像没有起作用,用TableMapReduceUtil.initTableMapperJob中的scan,有多少个scan就有多少个map
List scans = getScans(conf);
TableMapReduceUtil.initTableMapperJob(scans, PerformanceCounterDJob.PerformanceMapper.class,
ImmutableBytesWritable.class, LongWritable.class, job);

大数据开发过程中,常常会遇到一些具有挑战性的问题,这些问题可能涉及数据处理、存储、安全、性能优化等多个方面。以下是一些常见的复杂问题及其解决方案。 ### 数据倾斜问题 数据倾斜是大数据处理中非常常见的问题,尤其在使用MapReduce或Spark进行分布式计算时。当某些键(Key)的数据量远大于其他键时,会导致某些任务节点处理时间远长于其他节点,从而拖慢整个作业的执行效率。 - **解决方案**: - **过滤少数导致倾斜的Key**:如果某些Key的数据量极大,但其对最终结果影响较小,可以直接过滤掉这些Key。 - **提高Shuffle操作并行度**:通过增加Shuffle阶段的并行度来分散数据量较大的Key,但这种方法提升效果有限。 - **两阶段聚合**:先进行局部聚合(Local Aggregation),再进行全局聚合(Global Aggregation),适用于聚合类的Shuffle操作,效果明显。 - **将Reduce Join转为Map Join**:适用于小表和大表Join的情况,通过广播小表并在Map阶段完成Join操作,避免Shuffle。 - **使用随机前缀和扩容RDD进行Join**:对其中一个RDD打上随机前缀,并对另一个RDD进行扩容,从而分散Join操作的数据量,缓解数据倾斜问题。 ### 数据安全与隐私保护问题 大数据中往往包含大量敏感信息,如用户的个人信息和行为记录。因此,如何确保数据的安全性和隐私性是大数据开发中的重要挑战之一。 - **解决方案**: - **加密技术**:对存储和传输中的数据进行加密,确保即使数据被截获也无法被解读。 - **访问控制**:通过设置权限管理机制,限制不同用户对数据的访问权限,防止未经授权的数据访问。 - **隐私保护技术**:如差分隐私(Differential Privacy)、匿名化处理等技术,可以在不泄露个体信息的前提下进行数据分析。 ### ETL流程中的数据质量问题 ETL(Extract, Transform, Load)是大数据处理的核心流程之一,但在数据抽取、转换和加载过程中,常常会遇到数据质量不高的问题,如缺失值、重复数据、格式错误等。 - **解决方案**: - **数据清洗**:在ETL流程中加入数据清洗步骤,处理缺失值、去除重复数据、修正格式错误等。 - **数据校验**:在数据加载前进行数据校验,确保数据符合预期的格式和范围。 - **使用工具辅助**:如Flume等工具可以用于高效地收集和传输日志数据,减少人工干预。 ### 大数据平台性能调优问题 随着数据量的不断增长,大数据平台的性能问题也日益突出,如任务执行缓慢、资源利用率低等。 - **解决方案**: - **合理配置资源**:根据任务的计算和内存需求,合理分配CPU、内存等资源。 - **优化存储结构**:使用高效的存储格式(如Parquet、ORC)和压缩算法,提升I/O效率。 - **优化查询语句**:对于基于SQL的查询引擎(如Hive、Spark SQL),优化查询语句可以显著提升性能。 ### 编程语言与框架的选择问题大数据开发中,选择合适的编程语言和框架对于项目的成功至关重要。例如,Java是许多大数据框架(如Hadoop、Hive)的基础语言,而Scala和Python也在Spark等框架中广泛应用。 - **解决方案**: - **掌握主流语言**:熟练掌握Java、Scala、Python等语言,根据项目需求选择合适的语言。 - **熟悉主流框架**:深入了解Hadoop、Spark、Flink等框架的工作原理和使用方法,选择适合业务场景的框架。 - **代码规范与优化**:编写高效、可维护的代码,遵循良好的编码规范,提升代码质量和性能。 ### 示例代码:使用Spark解决数据倾斜问题 ```scala // 使用随机前缀和扩容RDD进行Join val rdd1 = sc.parallelize(Seq(("a", 1), ("b", 2), ("c", 3))) val rdd2 = sc.parallelize(Seq(("a", "x"), ("b", "y"), ("b", "z"), ("c", "w"))) // 对rdd2打上随机前缀 val rdd2WithPrefix = rdd2.flatMap { case (k, v) => (1 to 3).map(prefix => (s"$prefix:$k", v)) } // 对rdd1进行扩容 val rdd1Expanded = rdd1.flatMap { case (k, v) => (1 to 3).map(prefix => (s"$prefix:$k", v)) } // 进行Join操作 val result = rdd1Expanded.join(rdd2WithPrefix) result.foreach(println) ``` ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值