Hadoop/Spark Windows-Eclipse下调试Linux集群下运行时一些常见的错误


 

1.无法在HDFS中创建目录,上传文件等

Exception in thread "main" org.apache.hadoop.security.AccessControlException: Permission denied: user=xxx, access=WRITE, inode="xxx":root:supergroup:drwxr-xr-x
at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkFsPermission(FSPermissionChecker.java:271)
at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.check(FSPermissionChecker.java:257)

这是由于当前用户没有权限。
解决:在Windows本地添加环境变量HADOOP_USER_NAME,值为Linux的用户名(修改完重启eclipse,不然可能不生效)。

2.MapReduce输出结果不会覆盖之前的文件,会报输出文件夹已存在的错误

Exception in thread "main" org.apache.hadoop.mapred.FileAlreadyExistsException: Output directory hdfs://192.168.230.129:9000/output already exists
	at org.apache.hadoop.mapreduce.lib.output.FileOutputFormat.checkOutputSpecs(FileOutputFormat.java:123)
	at org.apache.hadoop.mapred.JobClient.submitJobInternal(JobClient.java:770)
	at org.apache.hadoop.mapreduce.Job.submit(Job.java:432)
	at org.apache.hadoop.mapreduce.Job.waitForCompletion(Job.java:447)
	at MyMapReduce.main(MyMapReduce.java:65)

解决方案:
方案1:每次手动删除输出文件夹,并refresh,再运行程序。
方案2:在程序中添加如下代码段

// 判断output文件夹是否存在,如果存在则删除
Path path = new Path(otherArgs[1]);// 取第1个表示输出目录参数(第0个参数是输入目录)
FileSystem fileSystem = path.getFileSystem(conf);// 根据path找到这个文件
if (fileSystem.exists(path)) {
	fileSystem.delete(path, true);// true的意思是,就算output有东西,也一带删除
}

3.提示 @Override must override a superclass method

今天换了workplace,在使用 @Override 出现以下错误:

The method *** of type *** must override a superclass method。

原因是因为Eclipse 默认的 Compiler是jdk5,(5不支持@Override等形式的批注), 只要把它改为1.7以上就可以了。
方法:将window->preferences->java-compiler中的Compiler compliance level修改为1.8。
如还不能解决: 找到现有的工程目录,修改为1.8

4.Spark集群启动时部分worker启动失败

报以下错误

failed to launch: nice -n 0 /opt/modules/hadoopentire/spark-2.4.3/bin/spark-class org.apache.spark.deploy.worker

解决:修改文件spark-config.sh(位于spark安装目录/sbin/下),在最后添加

export JAVA_HOME="javaport JAVA_HOME="java安装路径"

5.连接HDFS失败

报以下错误

java.net.ConnectException: Call From node1/192.168.100.10 to node1:9000 failed on connection exception: java.net.ConnectException: Connection refused: no further information; For more details see:  http://wiki.apache.org/hadoop/ConnectionRefused

hdfs用的是8020端口而不是9000,将代码中连hdfs部分改为8020即可。

6.提交远程服务器上的Spark任务

一开始测试,执行普通的jar包或者shell脚本都可以正确运行,而进行spark-submit却只得到空行,到UI界面也显示任务并未执行,将代码改进,添加如下:

if(StringUtils.isBlank(result)){  
	result=processStdout(session.getStderr(),DEFAULTCHART);  
}  

即如果返回空串,则打印错误信息。发现spark-submit时,会有如下报错:

JAVA_HOME is not set

在机器上直接执行没问题,但是远程调用就会出现该错误,原因是:在机器上直接执行时JAVA_HOME是配置在/etc/profile里的,这个是只给shell用户使用的;但对于ssh这种非login shell(non-login shell)用户,需要配置在/etc/bashrc中,即在/etc/bashrz中添加JAVA_HOME即jdk安装路径即可。之后便可成功远程spark-submit。

7.Eclipse异常关闭后无法启动

查看工作空间workspace/.metadata/下的.log文件,发现有如下异常信息记录:

!ENTRY org.eclipse.e4.ui.workbench 4 0 2019-12-07 21:01:24.232
!MESSAGE 
!STACK 0
java.lang.NullPointerException
	at org.eclipse.jface.resource.JFaceResources.getResources(JFaceResources.java:213)
	at org.eclipse.jface.resource.JFaceResources.getResources(JFaceResources.java:231)
	at org.eclipse.ui.part.WorkbenchPart.dispose(WorkbenchPart.java:104)
	at org.eclipse.ui.part.MultiPageEditorPart.dispose(MultiPageEditorPart.java:501)
	at org.eclipse.ui.forms.editor.FormEditor.dispose(FormEditor.java:405)
	at org.eclipse.m2e.editor.pom.MavenPomEditor.dispose(MavenPomEditor.java:777)
	at org.eclipse.ui.internal.e4.compatibility.CompatibilityPart.invalidate(CompatibilityPart.java:260)
	at org.eclipse.ui.internal.e4.compatibility.CompatibilityPart.destroy(CompatibilityPart.java:418)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:58)
	at org.eclipse.e4.core.internal.di.InjectorImpl.processAnnotated(InjectorImpl.java:1001)
	at org.eclipse.e4.core.internal.di.InjectorImpl.processAnnotated(InjectorImpl.java:966)
	at org.eclipse.e4.core.internal.di.InjectorImpl.disposed(InjectorImpl.java:462)
	at org.eclipse.e4.core.internal.di.Requestor.disposed(Requestor.java:160)
	at org.eclipse.e4.core.internal.contexts.ContextObjectSupplier$ContextInjectionListener.update(ContextObjectSupplier.java:82)
	at org.eclipse.e4.core.internal.contexts.TrackableComputationExt.update(TrackableComputationExt.java:106)
	at org.eclipse.e4.core.internal.contexts.TrackableComputationExt.handleInvalid(TrackableComputationExt.java:69)
	at org.eclipse.e4.core.internal.contexts.EclipseContext.dispose(EclipseContext.java:186)
	at org.eclipse.e4.core.internal.contexts.EclipseContext.dispose(EclipseContext.java:171)
	at org.eclipse.e4.core.internal.contexts.EclipseContext.dispose(EclipseContext.java:171)
	at org.eclipse.e4.core.internal.contexts.EclipseContext.dispose(EclipseContext.java:171)
	at org.eclipse.e4.core.internal.contexts.EclipseContext.dispose(EclipseContext.java:171)
	at org.eclipse.e4.core.internal.contexts.osgi.EclipseContextOSGi.dispose(EclipseContextOSGi.java:102)
	at org.eclipse.e4.core.internal.contexts.osgi.EclipseContextOSGi.bundleChanged(EclipseContextOSGi.java:144)
	at org.eclipse.osgi.internal.framework.BundleContextImpl.dispatchEvent(BundleContextImpl.java:973)
	at org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:234)
	at org.eclipse.osgi.framework.eventmgr.ListenerQueue.dispatchEventSynchronous(ListenerQueue.java:151)
	at org.eclipse.osgi.internal.framework.EquinoxEventPublisher.publishBundleEventPrivileged(EquinoxEventPublisher.java:234)
	at org.eclipse.osgi.internal.framework.EquinoxEventPublisher.publishBundleEvent(EquinoxEventPublisher.java:140)
	at org.eclipse.osgi.internal.framework.EquinoxEventPublisher.publishBundleEvent(EquinoxEventPublisher.java:132)
	at org.eclipse.osgi.internal.framework.EquinoxContainerAdaptor.publishModuleEvent(EquinoxContainerAdaptor.java:231)
	at org.eclipse.osgi.container.Module.publishEvent(Module.java:493)
	at org.eclipse.osgi.container.Module.doStop(Module.java:651)
	at org.eclipse.osgi.container.Module.stop(Module.java:515)
	at org.eclipse.osgi.container.SystemModule.stop(SystemModule.java:207)
	at org.eclipse.osgi.internal.framework.EquinoxBundle$SystemBundle$EquinoxSystemModule$1.run(EquinoxBundle.java:220)
	at java.lang.Thread.run(Thread.java:748)

出现该问题的原因是:由于项目没有正常关闭运行而导致"workbench.xmi"中的"persistedState"标签还保持在运行时的配置造成的。将工作空间下/.metadata/.plugins/org.eclipse.e4.workbench/workbench.xmi文件删掉,再重启Eclipse,恢复正常。 各项配置应该是还有的。

8.运行Spark项目时有警告 log4j:WARN No appenders could be found for logger

log4j:WARN No appenders could be found for logger (org.apache.hadoop.metrics2.lib.MutableMetricsFactory).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.

将文件log4j.properties放至src目录下,然后使src成为source文件夹(右键src-build path-use as source folder)

9.新建Maven项目默认jre system library 1.5–>1.8

maven项目 jre system library 1.5–>1.7,或者是任意版本,终极解决方案!!

10.磁盘满了no space left on device

今天队友说Android端提交任务没有结果,我去服务器上跑了一下发现报no space left on device的错误,也就是磁盘满了,然后用df -h命令看了下果然满了,如下:
磁盘爆满

然后想是不是项目生成的中间文件太多了,删了一部分后还是满的,不是中间文件的问题。然后去常用的/opt路径下用命令du --max-depth=1 -h查找大文件夹,直到找到spark/work文件夹,发现有很多大文件,如下:
spark/work目录下的大文件
网上查阅得知,使用spark standalone模式执行任务,每提交一次任务,在每个节点work目录下都会生成一个文件夹,该文件夹下是任务提交时,各节点从主节点下载的程序所需要的资源文件。 这些目录每次执行都会生成,且不会自动清理,每一个application的目录中都是该spark任务运行所需要的依赖包。
解决,在spark/conf/spark-env.sh文件中添加配置:

export SPARK_WORKER_OPTS="  
-Dspark.worker.cleanup.enabled=true  # 是否开启自动清理
-Dspark.worker.cleanup.interval=1800  # 清理周期,每隔多长时间清理一次,单位秒
-Dspark.worker.cleanup.appDataTtl=3600"  # 保留最近多长时间的数据

11.别人写的常见错误

常见错误

 
 

备忘一下Eclipse菜单栏的几个功能

  • 在控制台Console开启cmd:Run - External Tools - cmd(自己填的名称)
  • 一键添加set、get方法:Source - Generate Getters and Setters
  • 下部窗口视图:Window - Show View - Other
  • 打jar包(不用Maven):File- Export -Runnable Jar file

新建工作空间workspace后常用的一些配置

  • 更换Eclipse主题、关掉每次进入时的tips
  • 设置Maven本地仓库的路径
  • 在控制台Console开启cmd

 
 

参考文章:
HDFS客户端的权限错误:Permission denied
Mapreduce:解决Output directory already exists错误
乐意黎原创
[乐意黎原创] Eclipse 提示 @Override must override a superclass method 问题解决

Spark安装步骤及第一次启动failed to launch: nice -n 0错误
hadoop FileSystem 连接hdfs报错:Connection refused
Eclipse(Scala IDE) 在loading workbench时闪退并提示查看.log
java远程调用linux的命令或者脚本
ssh 登录远程执行出现java_home not set
CentOS系统:no space left on device错误
“no space left on device”(磁盘空间不足)问题解决
Spark下的Work目录定时清理

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值