HADOOP测试常见问题和测试方法
作者:网络转载 发布时间:[ 2012/8/2 10:42:06 ] 推荐标签:
7、单个worker内存限制
【现象】小数据量,测试通过,可是运行大数据,任务总是被平台kill。
【问题说明】现在hadoop平台对每个task运行时的内存进行了限制,默认是800M,当程序运行内存超过800M,平台自动会kill该任务
【测试方法】针对该点测试有2种方法:1,在集群运行大数据量,被平台kill后,查看日志,确认是因为内存超出被平台kill。2,在本地运行mapred程序,查看程序内存占用。若是在800M左右,上线会有很大风险。
8、MPI程序对hadoop上文件目录的操作
【现象】在mpi节点上对同一目录上的文件进行操作,偶尔会失败。
【问题说明】该问题同Hadoop副本任务对程序结果的影响 原因一样,都多个节点对hadoop上同一个文件的操作。只是一个是hadoop上,一个是mpi上。
【测试方法】多个地方对hdfs上的同一个文件或者目录进行操作。特别是同一个模块即在hadoop,又在mpi集群上运行。不要在每个mpi节点同时对同一个hadoop目录或者文件进行修改操作。
9、对于map reduce的运行参数的设置
【现象】程序在本地能执行成功,可是在hadoop上却无法运行
【问题说明】有时候,map reduce的运行参数比较长,为了阅读方便,rd可能会对程序参数进行折行,添加tab键排版,这样反倒使hadoop上解析命令失败。
【测试方法】对于map reduce的运行参数比较长的情况,可以督促rd用shell变量进行设置。然后在hadoop程序启动参数用shell变量进行替换。即阅读方便,又不会出错。
10、Hadoop程序的结果使用的bistreaming的二进制文件结果
【现象】程序结果文件是二进制格式,可是下载到本地,按照详细设计中描述的格式,解析格式总是错误。
【问题说明】当前流模式可以用streaming和bistreaming,当使用bistreaming时,生成的结果文件是hadoop的 sequence file文件格式,文件格式中含有key length和value length信息。在hadoop上使用该数据时,这个格式对用户是透明的。下载到本地后,不能直接使用了。
【测试方法】当任务的输出outputformat=SequenceFileAsBinaryOutputFormat 时,可以使用hadoop dfs -copySeqFileToLocal –ignoreLen命令,把二进制数据下载到本地,并去掉长度信息,和文档中写的格式一致了。
11、Hadoop对于输入文件的切分
【现象】输入文件是基于session的query日志行,session之间空行分割。当设置一个map的时候,程序结果正确,当设置多个map时,运行结果错误。
【问题说明】hadoop对于输入文件会以行为小单元切分,因此,当输入以空行为分割,有二次数据格式的时候,hadoop无法保证不把一个session切到两个map task中。这样把一个session拆分为多个session了。
【测试方法】当程序实现逻辑依赖于比行粒度更大的单元时,需要设置map的切分大小比单个输入文件大,否则回出现把输入文件切分成多个map输入,导致切断更大的输入单元。
二、常用测试方法
1、跨集群拷贝或者大数据量集群内拷贝
在测试过程中,可能需要从摸个集群或者某个目录拷贝大量测试数据,若是先把数据拷贝到本地,在上传到目的集群,将会非常的耗时间,这时,可以考虑用distcp命令。
DistCp(分布式拷贝)是用于大规模集群内部和集群之间拷贝的工具。它使用Map/Reduce实现文件分发,错误处理和恢复,以及报告生成。 它把文件和目录的列表作为map任务的输入,每个任务会完成源列表中部分文件的拷贝。
hadoop distcp hdfs://nn1:8020/foo/bar hdfs://nn2:8020/bar/foo这条命令会把nn1集群的/foo/bar目录下的所有文件或目录名展开并存储到一个临时文件中,这些文件内容的拷贝工作被分配给多个map任务, 然后每个TaskTracker分别执行从nn1到nn2的拷贝操作。注意DistCp使用路径进行操作。
由于distcp无法指定两个用户名和密码,因此,拷贝的源和目的集群的用户名和密码必须一致,且该用户名密码在源集群具有读权限,在目的集群具有写权限。
2、单机模拟分布式测试功能点
在测试部分功能点时或者内存不超过800M的性能时,可能会考虑到先用单机模拟分布式上运行进行测试:
cat input | mapper | sort | reducer > output
在用单机模拟分布式测试时,有以下注意点:
1)Streaming的输入是按行划分的文本,可以使用cat input即可;但是BiStreaming是“<key-length><key><value- length><value>”的格式,所以在输入前要进行一定的处理;常用方法是:
cat input | ./ reader |./mapper |./ reducer >output
reader程序负责将文件转化为mapper程序能够识别的keyLength, key, valueLength, value的二进制格式。当输入已经是sequencefile格式时,也不需要reader。
2)当Mapper或Reducer中使用到hadoop的环境变量时,单机模拟时,需要先修改这些环境变量或者在运行时设置这些环境变量的值。
3、分布式程序和单机程序结果的对比
在校验分布式程序结果时,我们常常使用的方法是,实现一个单机版的程序,然后diff单机版和分布式版本的运行结果。
由于hadoop对于输入文件的切分,以及map后的reduce分桶。在和单机版做结果对比时,需要考虑到输入行乱序对于结果的影响。若输入行的乱序对结果的正确性没有影响。那在做分布式的结果和本地单机模拟的结果diff时,一定要先sort,然后在diff。
4、总控脚本的测试
分布式程序虽然以map-reduce程序为主体,但每一轮map-reduce任务都是在单机用脚本进行任务提交和启动,大多数项目都包含多轮map-reduce 任务。因此,各轮任务之间的调度协调和项目的系统运行需要总控脚本来完成。
在测试总控脚本的时候,用-x参数运行,并把运行log重定向到输出文件。运行介绍后,即使结果正确,也需要看看运行脚本的log,很可能发现一些意想不到的问题。
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11