Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
优化bash命令以计算HDFS txt文件中的所有行_Bash_Sorting_Hdfs_Out Of Memory - Fatal编程技术网

优化bash命令以计算HDFS txt文件中的所有行

优化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 |,因为它是一个

总结:

我需要计算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