[HADOOP] Hadoop 2.9.2, Spark 2.4.0 AWS s3a 버킷 액세스
HADOOPHadoop 2.9.2, Spark 2.4.0 AWS s3a 버킷 액세스
며칠이 지났지 만 Spark를 사용하여 공개 Amazon Bucket에서 다운로드 할 수는 없었습니다. (
다음은 spark-shell 명령입니다.
spark-shell --master yarn
-v
--jars file:/usr/local/hadoop/share/hadoop/tools/lib/hadoop-aws-2.9.2.jar,file:/usr/local/hadoop/share/hadoop/tools/lib/aws-java-sdk-bundle-1.11.199.jar
--driver-class-path=/usr/local/hadoop/share/hadoop/tools/lib/hadoop-aws-2.9.2.jar:/usr/local/hadoop/share/hadoop/tools/lib/aws-java-sdk-bundle-1.11.199.jar
응용 프로그램 시작 및 프롬프트 대기중인 쉘 :
____ __
/ __/__ ___ _____/ /__
_\ \/ _ \/ _ `/ __/ '_/
/___/ .__/\_,_/_/ /_/\_\ version 2.4.0
/_/
Using Scala version 2.11.12 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_191)
Type in expressions to have them evaluated.
Type :help for more information.
scala> val data1 = sc.textFile("s3a://my-bucket-name/README.md")
18/12/25 13:06:40 INFO MemoryStore: Block broadcast_0 stored as values in memory (estimated size 242.1 KB, free 246.7 MB)
18/12/25 13:06:40 INFO MemoryStore: Block broadcast_0_piece0 stored as bytes in memory (estimated size 24.2 KB, free 246.6 MB)
18/12/25 13:06:40 INFO BlockManagerInfo: Added broadcast_0_piece0 in memory on hadoop-edge01:3545 (size: 24.2 KB, free: 246.9 MB)
18/12/25 13:06:40 INFO SparkContext: Created broadcast 0 from textFile at <console>:24
data1: org.apache.spark.rdd.RDD[String] = s3a://my-bucket-name/README.md MapPartitionsRDD[1] at textFile at <console>:24
scala> data1.count()
java.lang.NoClassDefFoundError: org/apache/hadoop/fs/StorageStatistics
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:348)
at org.apache.hadoop.conf.Configuration.getClassByNameOrNull(Configuration.java:2134)
at org.apache.hadoop.conf.Configuration.getClassByName(Configuration.java:2099)
at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:2193)
at org.apache.hadoop.fs.FileSystem.getFileSystemClass(FileSystem.java:2654)
at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:2667)
at org.apache.hadoop.fs.FileSystem.access$200(FileSystem.java:94)
at org.apache.hadoop.fs.FileSystem$Cache.getInternal(FileSystem.java:2703)
at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:2685)
at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:373)
at org.apache.hadoop.fs.Path.getFileSystem(Path.java:295)
at org.apache.hadoop.mapreduce.security.TokenCache.obtainTokensForNamenodesInternal(TokenCache.java:97)
at org.apache.hadoop.mapreduce.security.TokenCache.obtainTokensForNamenodes(TokenCache.java:80)
at org.apache.hadoop.mapred.FileInputFormat.listStatus(FileInputFormat.java:206)
at org.apache.hadoop.mapred.FileInputFormat.getSplits(FileInputFormat.java:315)
at org.apache.spark.rdd.HadoopRDD.getPartitions(HadoopRDD.scala:204)
at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:253)
at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:251)
at scala.Option.getOrElse(Option.scala:121)
at org.apache.spark.rdd.RDD.partitions(RDD.scala:251)
at org.apache.spark.rdd.MapPartitionsRDD.getPartitions(MapPartitionsRDD.scala:49)
at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:253)
at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:251)
at scala.Option.getOrElse(Option.scala:121)
at org.apache.spark.rdd.RDD.partitions(RDD.scala:251)
at org.apache.spark.SparkContext.runJob(SparkContext.scala:2126)
at org.apache.spark.rdd.RDD.count(RDD.scala:1168)
... 49 elided
Caused by: java.lang.ClassNotFoundException:
org.apache.hadoop.fs.StorageStatistics
at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 77 more
scala>
어떻게해야합니까? 다른 항아리를 추가하는 것을 잊었습니까? hadoop-aws와 aws-java-sdk-bundle의 정확한 설정은 무엇입니까? 버전?
해결법
-
==============================
1.음 .... 마침내 문제가 발견되었습니다.
음 .... 마침내 문제가 발견되었습니다.
가장 큰 문제는 내가 가지고있는 Spark가 Hadoop에 사전 설치되어 있다는 것입니다. 그것은 '하둡 2.7 이상을위한 v2.4.0 사전 빌드'입니다. 당신이 위의 그것으로 나의 투쟁을 볼 때 이것은 오해하기 쉬운 타이틀의 비트입니다. 실제로 스파크는 다른 버전의 hadoop 항아리와 함께 선적되었습니다. 다음 목록은 / usr / local / spark / jars /에 다음 항목이 있음을 보여줍니다.
단지 누락 된 : hadoop-aws 및 aws-java-sdk. Maven 저장소에서 조금 파고 : hadoop-aws-v2.7.3 및 종속성 : aws-java-sdk-v1.7.4 및 voila! 그 병을 다운로드하여 Spark에 매개 변수로 보냅니다. 이렇게 :
그 일을 했나요 !!!
나는 왜 Hadoop의 모든 항아리가 (그리고 jars와 --driver-class-path에 대한 매개 변수로 모든 것을 전송하는지) 왜 따라 잡지 못했는지 궁금 할뿐입니다. 스파크 어떻게 든 자동으로 항아리를 선택하고 내가 무엇을 보내지 않습니다
-
==============================
2.나는 네가 한 일을하지 말라고 충고한다. 당신은 hadoop 2.9.2에서 hadoop 2.7.2 jars로 미리 빌드 된 스파크를 실행 중입니다. 클래스 경로에 더 많은 항아리를 추가하여 hadoop 2.7.3 버전에서 s3로 작업하여 문제를 해결했습니다.
나는 네가 한 일을하지 말라고 충고한다. 당신은 hadoop 2.9.2에서 hadoop 2.7.2 jars로 미리 빌드 된 스파크를 실행 중입니다. 클래스 경로에 더 많은 항아리를 추가하여 hadoop 2.7.3 버전에서 s3로 작업하여 문제를 해결했습니다.
당신이해야 할 일은 "hadoop free"스파크 버전으로 작업하고 다음과 같은 링크에서 볼 수있는 것처럼 설정에 따라 hadoop 파일을 제공합니다 : https://spark.apache.org/docs/2.4.0/hadoop-provided.html
주요 부분 :
conf / spark-env.sh에서
'hadoop'바이너리가 PATH에 있다면 export SPARK_DIST_CLASSPATH = $ (hadoop classpath)
'hadoop'바이너리에 대한 명시 경로 export SPARK_DIST_CLASSPATH = $ (/ path / to / hadoop / bin / hadoop classpath)
Hadoop 설정 디렉토리 전달하기 export SPARK_DIST_CLASSPATH = $ (hadoop --config / path / to / configs 클래스 패스)
from https://stackoverflow.com/questions/53922709/hadoop-2-9-2-spark-2-4-0-access-aws-s3a-bucket by cc-by-sa and MIT license
'HADOOP' 카테고리의 다른 글
[HADOOP] Pyhive를 사용하여 원격 하이브에 액세스하는 방법 (0) | 2019.07.29 |
---|---|
[HADOOP] hdfs에서 파일을 읽는 방법 [duplicate] (0) | 2019.07.29 |
[HADOOP] Spark를 사용하여 병렬로 데이터 집합 캐시 및 쿼리 (0) | 2019.07.29 |
[HADOOP] 스파크의 HiveContext가 내부적으로 어떻게 작동합니까? (0) | 2019.07.29 |
[HADOOP] Hadoop으로 여러 입력 형식 축소 (0) | 2019.07.29 |