我想在 Linux 内核上运行 Nutch,我已以 root 用户身份登录,并设置了所有环境变量和 Nutch 文件设置。我创建了一个 url.txt 文件,其中包含要抓取的 URL,当我尝试使用以下命令运行 Nutch 时,
bin/nutch crawl urls -dir pra
它会产生以下异常。
crawl started in: pra
rootUrlDir = urls
threads = 10
depth = 5
Injector: starting
Injector: crawlDb: pra/crawldb
Injector: urlDir: urls
Injector: Converting injected urls to crawl db entries.
Exception in thread "main" java.io.IOException: Failed to get the current user's information.
at org.apache.hadoop.mapred.JobClient.getUGI(JobClient.java:717)
at org.apache.hadoop.mapred.JobClient.configureCommandLineOptions(JobClient.java:592)
at org.apache.hadoop.mapred.JobClient.submitJob(JobClient.java:788)
at org.apache.hadoop.mapred.JobClient.runJob(JobClient.java:1142)
at org.apache.nutch.crawl.Injector.inject(Injector.java:160)
at org.apache.nutch.crawl.Crawl.main(Crawl.java:113)
Caused by: javax.security.auth.login.LoginException: Login failed: Cannot run program "whoami": java.io.IOException: error=12, Cannot allocate memory
at org.apache.hadoop.security.UnixUserGroupInformation.login(UnixUserGroupInformation.java:250)
at org.apache.hadoop.security.UnixUserGroupInformation.login(UnixUserGroupInformation.java:275)
at org.apache.hadoop.mapred.JobClient.getUGI(JobClient.java:715)
... 5 more
服务器有足够的空间来运行任何 Java 应用程序。我已经附加了静态信息。
total used free
Mem: 524320 194632 329688
-/+ buffers/cache: 194632 329688
Swap: 2475680 0 2475680
Total: 3000000 194632 2805368
内存空间是否足够用于 nutch?请有人帮助我,我是 linux 内核和 nutch 的新手。提前致谢。
答案1
读取输出:
无法运行程序“whoami”:java.io.IOException:错误=12,无法分配内存
看起来您没有足够的 RAM 或没有交换文件/分区。
答案2
在 Java 中调用可执行文件(如 whoami)需要先复制整个 Java 进程。您需要降低最大堆大小 (-Xmx256m),以便可以同时在 RAM 中复制两个副本。
答案3
在 32 位操作系统安装中,JVM(Java 虚拟机)无法处理大于 4GB 的内存。如果您想使用 JVM 占用超过 4GB 的内存,那么您必须使用 64 位版本的 JVM,这也意味着操作系统也应该是 64 位版本。
我猜这就是您收到该错误的原因。您有 5GB 内存,这可能是问题所在。您应该告诉您的应用程序仅使用 75% 的可用内存,或者尝试将 RAM 减少到 4GB 并进行检查。我在使用 Java 作为 Web 界面的 Zimbra Messaging 解决方案中遇到了同样的问题。
答案4
您的服务器可能已禁用 /proc/sys/vm/overcommit_memory。如果没有过度使用,则“fork”系统调用要求您的服务器具有足够的 RAM 或交换空间,以便完整复制 Java 进程的第二份副本。这可能需要大量的 RAM。