gpt4 book ai didi

scala - 从 scala 脚本中执行 hdfs 命令

转载 作者:可可西里 更新时间:2023-11-01 15:43:06 24 4
gpt4 key购买 nike

我正在尝试从集群模式下由 Spark 执行的 Scala 脚本内部执行一个 HDFS 特定命令。命令下方:

val cmd = Seq("hdfs","dfs","-copyToLocal","/tmp/file.dat","/path/to/local")
val result = cmd.!!

作业在此阶段失败,错误如下:

java.io.FileNotFoundException: /var/run/cloudera-scm-agent/process/2087791-yarn-NODEMANAGER/log4j.properties (Permission denied)
at java.io.FileInputStream.open0(Native Method)
at java.io.FileInputStream.open(FileInputStream.java:195)
at java.io.FileInputStream.<init>(FileInputStream.java:138)
at java.io.FileInputStream.<init>(FileInputStream.java:93)
at sun.net.www.protocol.file.FileURLConnection.connect(FileURLConnection.java:90)
at sun.net.www.protocol.file.FileURLConnection.getInputStream(FileURLConnection.java:188)
at org.apache.log4j.PropertyConfigurator.doConfigure(PropertyConfigurator.java:557)
at org.apache.log4j.helpers.OptionConverter.selectAndConfigure(OptionConverter.java:526)
at org.apache.log4j.LogManager.<clinit>(LogManager.java:127)
at org.apache.log4j.Logger.getLogger(Logger.java:104)
at org.apache.commons.logging.impl.Log4JLogger.getLogger(Log4JLogger.java:262)
at org.apache.commons.logging.impl.Log4JLogger.<init>(Log4JLogger.java:108)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)

但是,当我在 Spark shell 中单独运行相同的命令时,它执行得很好并且文件也被复制了。

scala> val cmd = Seq("hdfs","dfs","-copyToLocal","/tmp/file_landing_area/file.dat","/tmp/local_file_area")
cmd: Seq[String] = List(hdfs, dfs, -copyToLocal, /tmp/file_landing_area/file.dat, /tmp/local_file_area)

scala> val result = cmd.!!
result: String = ""

我不明白权限被拒绝的错误。尽管它显示为 FileNotFoundException。完全令人困惑。

有什么想法吗?

最佳答案

根据错误,它正在将 hdfs 数据检查到 var 文件夹中,我怀疑这是配置问题,或者它没有指向正确的文件夹。使用 seq 和执行 HDFS 命令不是好的做法。它仅对 spark shell 有用。不建议在代码中使用相同的方法。而不是尝试使用下面的 Scala 文件系统 API 将数据从 HDFS 移动或移动到 HDFS。请查看以下示例代码,仅供引用,可能对您有所帮助。

import org.apache.hadoop.fs
import org.apache.hadoop.fs._
val conf = new Configuration()

val fs = path.getFileSystem(conf)

val hdfspath = new Path("hdfs:///user/nikhil/test.csv")
val localpath = new Path("file:///home/cloudera/test/")

fs.copyToLocalFile(hdfspath,localpath)

请使用以下链接获取有关 Scala 文件系统 API 的更多引用信息。

https://hadoop.apache.org/docs/r2.9.0/api/org/apache/hadoop/fs/FileSystem.html#copyFromLocalFile(boolean,%20boolean,%20org.apache.hadoop.fs.Path,%20org.apache.hadoop.fs.Path)

关于scala - 从 scala 脚本中执行 hdfs 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56420928/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com