Apache spark 使用Spark作业将文件/数据从共享/NFS装载位置放入HDFS,会出现间歇性问题
我有一个三节点Spark集群,使用Thread作为集群管理器[在三节点hadoop集群上运行] 考虑一下,我的Hadoop集群有三个节点[Master、Slave1和Slave2],Resourcemanager在Master上运行,NodeManager在Slave1和Slave2上运行。Spark Cluster也存在于三个节点上 在主节点,我创建了一个文件夹/data/nfsshare,并将其作为/nfsshare挂载在Slave1和Slave2上。现在,我在/data/nfsshare文件夹中保存了一个文件abc.txt,它在/nfsshare位置对slave1和slave2都可见 我创建了一个小spark作业,用于将abc.txt从/data/nfsshare位置复制到HDFS,还可以执行字数计算并将结果保存在HDFS中 def write2HDFS(参数:数组[字符串]){ 当我尝试使用以下命令执行此代码时:Apache spark 使用Spark作业将文件/数据从共享/NFS装载位置放入HDFS,会出现间歇性问题,apache-spark,spark-streaming,hadoop2,nfs,hadoop-plugins,Apache Spark,Spark Streaming,Hadoop2,Nfs,Hadoop Plugins,我有一个三节点Spark集群,使用Thread作为集群管理器[在三节点hadoop集群上运行] 考虑一下,我的Hadoop集群有三个节点[Master、Slave1和Slave2],Resourcemanager在Master上运行,NodeManager在Slave1和Slave2上运行。Spark Cluster也存在于三个节点上 在主节点,我创建了一个文件夹/data/nfsshare,并将其作为/nfsshare挂载在Slave1和Slave2上。现在,我在/data/nfsshare文
./bin/spark-submit --class <MyClassName> --master yarn --deploy-mode cluster --verbose --executor-cores 9 --num-executors 3 --executor-memory 3G --driver-memory 1g /data/<JarName>.jar file:///data/nfsshare/abc.txt hdfs://<HDFS HOST IP>:8020/user/hduser/hdfsWrite1MB hdfs://<HDFS HOST IP>:8020/user/hduser/hdfsWriteP1MB
/bin/spark submit--class--master warn--deploy mode cluster--verbose--executor cores 9--num executors 3--executor memory 3G--driver memory 1g/data/.jarfile:///data/nfsshare/abc.txt hdfs://:8020/user/hduser/hdfsWrite1MB hdfs://:8020/user/hduser/hdfsWrite1MB
我遇到以下间歇性问题:
1) InputPath不存在:文件:/data/nfsshare/abc.txt,在此作业的某些运行期间间歇性出现[而文件存在于共享位置/装载路径]
2) 有时/间歇性作业状态显示为失败,但正在使用所需数据创建输出目录
3) 输出目录已存在:有时HDFS输出目录存在问题-->通过增加执行器和驱动程序内存解决了此问题
-->我尝试在集群和客户端部署模式下运行此作业,但在这两种情况下都遇到了相同的问题
我不确定共享位置路径作为/data/nfsshare在主服务器上和/nfsshare在从服务器上是否有任何区别?因为在命令行中,我将/data/nfsshare作为文件路径位置传递,因此在从服务器上运行的任何执行器查找/data/nfsshare时都会失败
我尝试在所有三个节点上运行此作业,但这些间歇性问题仍然存在
如有任何专家建议,将不胜感激
如果有任何其他更好的方法可以将文件从任何暂存区域/装入位置放入HDFS,那么也请分享
问候,,
布比什
./bin/spark-submit --class <MyClassName> --master yarn --deploy-mode cluster --verbose --executor-cores 9 --num-executors 3 --executor-memory 3G --driver-memory 1g /data/<JarName>.jar /nfsshare/path /user/hduser/hdfsWrite1MB /user/hduser/hdfsWriteP1MB
或者,如果您不想一次又一次地删除内容,您可以简单地将当前时间戳附加到输出路径。只有在处理RDD时,Dataframe API才能覆盖现有路径
PS:您的Q1将输入路径显示为文件:/data/nfsshare/test-1MB
,而spark submit
命令中的输入显示file:///data/nfsshare/abc.txt
。abc.txt
是目录吗
让我知道这是否有帮助。干杯。事实上,我面临的是InputPath不存在:文件:/data/nfsshare/abc.txt由于装载的文件夹名称而间歇性出现。一旦我在所有节点上保持相同的名称[/data/nfsshare]。这个问题就消失了 我假设当我在集群模式下运行spark作业时,Thread决定在何处运行驱动程序和执行器,因此,如果所有执行器都在主节点上运行[从何处/data/nfsshare]可见,作业工作正常,而对于此路径作为/nfsshare出现的其他执行器,此抛出路径相关问题。解决路径问题后,所有执行器都可以将文件路径视为/data/nfsshare
另外,对于已经存在的输出目录,Chitral Verma的代码片段也有帮助。感谢您宝贵的输入Chitral Verma。我想我无法正确解释NFS装载部分。事实上,我有三个节点Master、Slave1和Slave2。我在Master上创建了一个文件夹/data/nfsshare,它是用Slave1装载的和Slave2,在那里显示为/nfsshare而不是/data/nfsshare。
./bin/spark-submit --class <MyClassName> --master yarn --deploy-mode cluster --verbose --executor-cores 9 --num-executors 3 --executor-memory 3G --driver-memory 1g /data/<JarName>.jar /nfsshare/path /user/hduser/hdfsWrite1MB /user/hduser/hdfsWriteP1MB
val hadoopConf = new org.apache.hadoop.conf.Configuration()
val hdfs = org.apache.hadoop.fs.FileSystem.get(new java.net.URI("hdfs://host:port/"), hadoopConf)
try { hdfs.delete(new org.apache.hadoop.fs.Path(/path/to/output), true) }
catch { case _ : Throwable => { } }