sparkが初めてです。質問があります。最初のステップでSUCCESS.txtファイルをHDFSの場所に書き込む2段階のプロセスがあります。2番目のステップは= sparkジョブは、データの処理を開始する前に、SUCCESS.txtファイルが存在するかどうかを確認する必要があります。
spark APIをチェックしましたが、ファイルが存在するかどうかをチェックするメソッドが見つかりませんでした。これを処理する方法はありますか?
私が見つけた唯一のメソッドはsc.textFile(hdfs:///SUCCESS.txt).count()で、ファイルが存在しない場合に例外をスローします。その例外をキャッチし、それに応じてプログラムを作成する必要があります。私はこのアプローチが本当に好きではありませんでした。より良い代替案を見つけることを望んでいます。
HDFSのファイルの場合、 hadoop を使用してこれを実行できます。
val conf = sc.hadoopConfiguration
val fs = org.Apache.hadoop.fs.FileSystem.get(conf)
val exists = fs.exists(new org.Apache.hadoop.fs.Path("/path/on/hdfs/to/SUCCESS.txt"))
Pysparkの場合、次のようなものを使用してサブプロセスを呼び出すことなくこれを実現できます。
fs = sc._jvm.org.Apache.hadoop.fs.FileSystem.get(sc._jsc.hadoopConfiguration())
fs.exists(sc._jvm.org.Apache.hadoop.fs.Path("path/to/SUCCESS.txt"))
これを、従来のhadoopファイルチェックでファイルの存在を内部的にチェックする関数を介して呼び出す最良の方法と言います。
object OutputDirCheck {
def dirExists(hdfsDirectory: String): Boolean = {
val hadoopConf = new org.Apache.hadoop.conf.Configuration()
val fs = org.Apache.hadoop.fs.FileSystem.get(hadoopConf)
fs.exists(new org.Apache.hadoop.fs.Path(hdfsDirectory))
}
}
Java coders;
SparkConf sparkConf = new SparkConf().setAppName("myClassname");
SparkContext sparky = new SparkContext(sparkConf);
JavaSparkContext context = new JavaSparkContext(sparky);
FileSystem hdfs = org.Apache.hadoop.fs.FileSystem.get(context.hadoopConfiguration());
Path path = new Path(sparkConf.get(path_to_File));
if (!hdfs.exists(path)) {
//Path does not exist.
}
else{
//Path exist.
}
Pyspark pythonユーザーの場合:
pythonまたはpysparkで何も見つからなかったので、pythonコードからhdfsコマンドを実行する必要があります。これは私にとってはうまくいきました。
フォルダーが存在する場合に取得するhdfsコマンド:trueの場合は0を返します
hdfs dfs -test -d /folder-path
ファイルが存在するかどうかを取得するhdfsコマンド:trueの場合は0を返します
hdfs dfs -test -d /folder-path
これをpython code iに入れるには、コード行の下に続きます。
import subprocess
def run_cmd(args_list):
proc = subprocess.Popen(args_list, stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
proc.communicate()
return proc.returncode
cmd = ['hdfs', 'dfs', '-test', '-d', "/folder-path"]
code = run_cmd(cmd)
if code == 0:
print('folder exist')
print(code)
フォルダーが存在する場合の出力:
フォルダーが存在する0
PySparkの場合:
from py4j.protocol import Py4JJavaError
def path_exist(path):
try:
rdd = sc.textFile(path)
rdd.take(1)
return True
except Py4JJavaError as e:
return False