优化bash命令以计算HDFS txt文件中的所有行
总结: 我需要计算HDFS实例中所有.txt文件中的所有唯一行 .txt文件的总大小约为450GB 我使用这个bash命令: hdfs dfs-cat//*/*/.txt | cut-d,-f 1 | sort-parallel=| uniq | wc-l 问题是这个命令占用了所有空闲ram,HDFS实例退出时内存中出现代码137 问题: 有没有办法限制整个命令的ram使用量,比如说hdfs中空闲内存的一半,或者在命令仍在运行时以某种方式清理内存 更新: 我需要删除| sort |,因为它是一个合并排序实现,所以空间复杂度很高优化bash命令以计算HDFS txt文件中的所有行,bash,sorting,hdfs,out-of-memory,Bash,Sorting,Hdfs,Out Of Memory,总结: 我需要计算HDFS实例中所有.txt文件中的所有唯一行 .txt文件的总大小约为450GB 我使用这个bash命令: hdfs dfs-cat//*/*/.txt | cut-d,-f 1 | sort-parallel=| uniq | wc-l 问题是这个命令占用了所有空闲ram,HDFS实例退出时内存中出现代码137 问题: 有没有办法限制整个命令的ram使用量,比如说hdfs中空闲内存的一半,或者在命令仍在运行时以某种方式清理内存 更新: 我需要删除| sort |,因为它是一个
我只能使用| uniq |而不使用| sort |。减少并行运行的排序数 从信息排序: -parallel=N:将并行运行的排序数设置为N。默认情况下,设置为N 到可用处理器的数量,但限于8个,如下所示 在那之后,性能的提升会逐渐减少。还请注意,使用 N个线程将内存使用量增加了log N的一倍
减少并行运行的排序数 从信息排序: -parallel=N:将并行运行的排序数设置为N。默认情况下,设置为N 到可用处理器的数量,但限于8个,如下所示 在那之后,性能的提升会逐渐减少。还请注意,使用 N个线程将内存使用量增加了log N的一倍
您可以尝试限制sort的内存消耗:
使用sort-u代替sort | uniq。这样,sort就有机会当场删除重复项,而不必将它们保留到最后 您可以尝试限制sort的内存消耗: 使用sort-u代替sort | uniq。这样,sort就有机会当场删除重复项,而不必将它们保留到最后。 内存不足 发件人: 这些是您可以考虑的选项。在光盘上指定一个临时目录,并指定缓冲区大小,例如1GB。比如sort-u-T$HOME/tmp-s1g 正如其他答案中建议的那样,使用sort-u而不是sort | uniq 有没有什么方法可以限制整个命令的ram使用量,比如说hdfs中可用内存的一半 有点像,使用-S选项。您可以对-S$free-t | awk'/Total/{print$4}进行排序 内存不足 发件人: 这些是您可以考虑的选项。在光盘上指定一个临时目录,并指定缓冲区大小,例如1GB。比如sort-u-T$HOME/tmp-s1g 正如其他答案中建议的那样,使用sort-u而不是sort | uniq 有没有什么方法可以限制整个命令的ram使用量,比如说hdfs中可用内存的一半
有点像,使用-S选项。您可以对-S$free-t | awk'/Total/{print$4}进行排序。我不确定它是否能解决您的问题,但您可以将管道简化为hdfs…|排序-u-t,-k1,1 | wc-l@TomFenech:我不会删除cut,因为它减少了要排序的数据量。是的,有道理,在这种情况下,您可以使用hdfs…|cut-d,-f1 | sort-u | wc-lAs只要使用| sort |,就可以保证内存不足。我添加了一些信息-txt文件的总大小约为450GB。谢谢你的评论。你能估计一下……的产量吗uniq会是什么样子?你预计要排几行?每条线可以有多长?典型的线是什么样子的?还有,你有多少空闲内存?我不确定它是否能解决你的问题,但你可以简化hdfs的管道…|排序-u-t,-k1,1 | wc-l@TomFenech:我不会删除cut,因为它减少了要排序的数据量。是的,有道理,在这种情况下,您可以使用hdfs…|cut-d,-f1 | sort-u | wc-lAs只要使用| sort |,就可以保证内存不足。我添加了一些信息-txt文件的总大小约为450GB。谢谢你的评论。你能估计一下……的产量吗uniq会是什么样子?你预计要排几行?每条线可以有多长?典型的线是什么样子的?还有,你有多少可用内存?我想你想写的是打印int$4/2而不是打印$4。我想你想写的是打印int$4/2而不是打印$4。谢谢你的评论。不幸的是,所有.txt文件的总大小都是巨大的~450GB。我必须从我的命令中删除“排序”。否则->内存不足。你真的尝试过所有这些东西,特别是-S…和-T…?只要您有>450GB的可用磁盘空间,就应该能够在管道中使用排序。对于中间文件,您需要两倍的可用磁盘空间。谢谢您的评论。不幸的是,所有.txt文件的总大小都是巨大的~450GB。我必须从我的命令中删除“排序”。否则->内存不足。你真的尝试过所有这些东西,特别是-S…和-T…?只要您有>450GB的可用磁盘空间,您就应该能够 o在管道中使用分拣。对于中间文件,您需要两倍的可用磁盘空间。
--batch-size=NMERGE
merge at most NMERGE inputs at once; for more use temp files
--compress-program=PROG
compress temporaries with PROG; decompress them with PROG -d-T,
-S, --buffer-size=SIZE
use SIZE for main memory buffer
-T, --temporary-directory=DIR
use DIR for temporaries, not $TMPDIR or /tmp; multiple options
specify multiple directories