我有一个hadoop集群,我们假设它表现得相当“糟糕”。这些节点非常强大.24核,60 + G RAM ..等等。我们想知道是否有一些基本的linux / hadoop默认配置阻止hadoop充分利用我们的硬件。
这里有post描述了一些我认为可能属实的可能性。
我尝试以root用户身份登录namenode,hdfs以及我自己,并尝试查看lsof
的输出以及ulimit
的设置。以下是输出,任何人都可以帮助我理解为什么设置与打开的文件编号不匹配。
例如,当我以root身份登录时。 lsof
看起来像这样:
[root@box ~]# lsof | awk '{print $3}' | sort | uniq -c | sort -nr
7256 cloudera-scm
3910 root
2173 oracle
1886 hbase
1575 hue
1180 hive
801 mapred
470 oozie
427 yarn
418 hdfs
244 oragrid
241 zookeeper
94 postfix
87 httpfs
...
但是当我查看ulimit
输出时,它看起来像这样:
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 806018
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 10240
cpu time (seconds, -t) unlimited
max user processes (-u) 1024
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
我假设,一个用户打开的文件不应超过1024个,但是,当您查看lsof
的输出时,有一个用户打开了7000多个文件,任何人都可以帮忙解释一下在这里?
如果我在理解ulimit
和lsof
之间的关系时犯了错误,请纠正我。
非常感谢!
答案 0 :(得分:2)
您需要检查流程的限制。它可能与您的shell会话不同:
例如:
[root@ADWEB_HAPROXY3 ~]# cat /proc/$(pidof haproxy)/limits | grep open
Max open files 65536 65536 files
[root@ADWEB_HAPROXY3 ~]# ulimit -n
4096
在我的情况下,haproxy在其配置文件上有一个指令来更改最大的打开文件,也应该有一些hadoop的东西
答案 1 :(得分:1)
我有一个非常类似的问题,导致其中一个claster的YARN TimeLine服务器由于达到神奇的1024个文件限制而停止,并且因“太多打开文件”错误而崩溃。
经过一番调查后发现,在TimeLine的LevelDB中处理太多文件时遇到了一些严重的问题。出于某种原因,YARN忽略了yarn.timeline-service.entity-group-fs-store.retain-seconds设置(默认设置为7天,604800ms)。我们有LevelDB文件可追溯到一个多月。
应用此处描述的修补程序有什么重要帮助:https://community.hortonworks.com/articles/48735/application-timeline-server-manage-the-size-of-the.html
基本上,我尝试过几种选择:
缩小TTL(生存时间)设置首先启用TTL:
<property>
<description>Enable age off of timeline store data.</description>
<name>yarn.timeline-service.ttl-enable</name>
<value>true</value>
</property>
然后设置yarn.timeline-service.ttl-ms(在一段时间内将其设置为某些低设置): \
<property>
<description>Time to live for timeline store data in milliseconds.</description>
<name>yarn.timeline-service.ttl-ms</name>
<value>604800000</value>
</property>
如上所述,第二个选项是停止TimeLine服务器,删除整个LevelDB并重启服务器。这将从头开始ATS数据库。如果您因任何其他选项而失败,则可以正常工作。
要执行此操作,请从yarn.timeline-service.leveldb-timeline-store.path中查找数据库位置,对其进行备份并从中删除所有子文件夹。此操作将要求对TimeLine所在的服务器进行root访问。
希望它有所帮助。