2017-08-08 5 views
0

私はクラスタAWS EMR上で動作するスパークアプリケーションを持っています。スパークSQLにhdfsファイルが表示されない

私はHDFSにファイルを追加しました:

javaSparkContext.addFile(filePath, recursive); 

ファイル(ログが利用可能:ファイルは読み取り/ executeble /書き込み可能です)HDFS上に存在しますが、私は、スパークのSQL APIを使用して、このファイルから情報を読み取ることができません:

LOGGER.info("Spark working directory: " + path); 
File file = new File(path + "/test.avro"); 
LOGGER.info("SPARK PATH:" + file); 
LOGGER.info("read:" + file.canRead()); 
LOGGER.info("execute:" + file.canExecute()); 
LOGGER.info("write:" + file.canWrite()); 
Dataset<Row> load = getSparkSession() 
         .read() 
         .format(AVRO_DATA_BRICKS_LIBRARY) 
         .load(file.getAbsolutePath()); 

ログがあります:あなたがでそのファイルを持っていない場合

17/08/07 15:03:25 INFO SparkContext: Added file /mnt/yarn/usercache/hadoop/appcache/application_1502118042722_0001/container_1502118042722_0001_01_000001/test.avro at spark://HOST:PORT/files/test.avro with timestamp 1502118205059 
17/08/07 15:03:25 INFO Utils: Copying /mnt/yarn/usercache/hadoop/appcache/application_1502118042722_0001/container_1502118042722_0001_01_000001/test.avro to /mnt/yarn/usercache/hadoop/appcache/application_1502118042722_0001/spark-d5b494fc-2613-426f-80fc-ca66279c2194/userFiles-44aad2e8-04f4-420b-9b5e-a1ccde5db9ec/test.avro 
17/08/07 15:03:25 INFO AbstractS3Calculator: Spark working directory: /mnt/yarn/usercache/hadoop/appcache/application_1502118042722_0001/spark-d5b494fc-2613-426f-80fc-ca66279c2194/userFiles-44aad2e8-04f4-420b-9b5e-a1ccde5db9ec 
17/08/07 15:03:25 INFO AbstractS3Calculator: SPARK PATH:/mnt/yarn/usercache/hadoop/appcache/application_1502118042722_0001/spark-d5b494fc-2613-426f-80fc-ca66279c2194/userFiles-44aad2e8-04f4-420b-9b5e-a1ccde5db9ec/test.avro 
17/08/07 15:03:25 INFO AbstractS3Calculator: read:true 
17/08/07 15:03:25 INFO AbstractS3Calculator: execute:true 
17/08/07 15:03:25 INFO AbstractS3Calculator: write:true 

org.apache.spark.sql.AnalysisException: Path does not exist: hdfs://HOST:PORT/mnt/yarn/usercache/hadoop/appcache/application_1502118042722_0001/spark-d5b494fc-2613-426f-80fc-ca66279c2194/userFiles-44aad2e8-04f4-420b-9b5e-a1ccde5db9ec/test.avro; 
at org.apache.spark.sql.execution.datasources.DataSource$$anonfun$14.apply(DataSource.scala:382) 
    at org.apache.spark.sql.execution.datasources.DataSource$$anonfun$14.apply(DataSource.scala:370) 
    at scala.collection.TraversableLike$$anonfun$flatMap$1.apply(TraversableLike.scala:241) 
    at scala.collection.TraversableLike$$anonfun$flatMap$1.apply(TraversableLike.scala:241) 
    at scala.collection.immutable.List.foreach(List.scala:381) 
    at scala.collection.TraversableLike$class.flatMap(TraversableLike.scala:241) 
    at scala.collection.immutable.List.flatMap(List.scala:344) 
    at org.apache.spark.sql.execution.datasources.DataSource.resolveRelation(DataSource.scala:370) 
    at org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:152) 
    at org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:135) 
    at odh.spark.services.algorithms.calculators.RiskEngineS3Calculator.getInputMembers(RiskEngineS3Calculator.java:76) 
    at odh.spark.services.algorithms.calculators.RiskEngineS3Calculator.getMembersDataSets(RiskEngineS3Calculator.java:124) 
    at odh.spark.services.algorithms.calculators.AbstractS3Calculator.calculate(AbstractS3Calculator.java:50) 
    at odh.spark.services.ProgressSupport.start(ProgressSupport.java:47) 
    at odh.spark.services.Engine.startCalculations(Engine.java:102) 
    at odh.spark.services.Engine.startCalculations(Engine.java:135) 
    at odh.spark.SparkApplication.main(SparkApplication.java:19) 
    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.apache.spark.deploy.yarn.ApplicationMaster$$anon$2.run(ApplicationMaster.scala:637) 
+0

あなたはパスの値を表示することができますか? –

+0

パスはログのスパーク作業ディレクトリです – yazabara

+0

rootとしてアプリケーションを実行してみてください。 – Mahdi

答えて

1

チェックが:

hadoop fs -ls /home/spark/#や作業ディレクトリの代わりに/ホーム/火花

あなたはHDFS上のファイルを持っている場合は、それだけの説明では、命令に従うか、あなたのSparkバージョンを更新し、スパークの側にthe problemのように見えます最新版

0

デフォルトでは、すべてのファイルはHDFSの/user/hadoop/フォルダに保存されています。 HDFSにアップロードし、このファイルを使用するには

- (絶対パスを使用する必要があなたはこの知識を使用して、この定数、より良いで読み込むことができます) - 私は絶対パスを使用しました:

new Configuration().get("fs.defaultFS")//get HDFS root 
.... 
FileSystem hdfs = getHdfsFileSystem(); 
hdfs.copyFromLocalFile(true, true, new Path(srcLocalPath), new Path(destHdfsPath)); 

どこdestHdfsPath - 絶対パス(のような'hdfs://...../test.avro'

そして、あなたは利用可能HDFSからこの情報をロードします

return getSparkSession() 
       .read() 
       .format(AVRO_DATA_BRICKS_LIBRARY) 
       .load(absoluteFilePath); 

:meybeは、いくつかの権限を追加する必要があります。FileUtil.chmod(hdfsDest, "u+rw,g+rw,o+rw");

関連する問題