Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.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
Apache spark 使用Spark作业将文件/数据从共享/NFS装载位置放入HDFS,会出现间歇性问题_Apache Spark_Spark Streaming_Hadoop2_Nfs_Hadoop Plugins - Fatal编程技术网

Apache spark 使用Spark作业将文件/数据从共享/NFS装载位置放入HDFS,会出现间歇性问题

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文

我有一个三节点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(参数:数组[字符串]){

当我尝试使用以下命令执行此代码时:

./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,那么也请分享

问候,, 布比什

  • 最好在不使用spark的情况下将输入文件上载到hdfs,只需使用hdfs dfs-copyFromLocal将其上载到hdfs,或者您可以尝试使用hdfs客户端库将其上载,但不使用spark的api进行单线程上载。通常假设输入数据已经存在于分布式文件系统中(s3、hdfs等)所以从设计的角度来看,有一部分管道将数据放入s3/hdfs,只有到那时spark的并行处理才开始
  • 是的,如果您一遍又一遍地运行同一个作业,您应该清理输出目录,我认为有spark配置允许您禁用此验证,但是最好将应用程序设计为每次写入新路径
  • Q1、Q2)您提到nfs已将目录从本地的/data/nfsshare装载到HDFS的/nfsshare。如果您已成功完成此操作,并且已验证它是否正常工作,为什么不将其用作输入路径

    当您尝试使用本地文件系统时,在“纱线”模式下,事情会变得有点棘手。如果您使用的是分布式计算,最好将输入保存在HDFS中。因此,您的spark submit命令变为

    ./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 => { } }