2017-05-31 47 views
1

我在亞太地區(孟買)地區創建了一個存儲桶,並在新加坡地區創建了另一個存儲桶。我將這些鍵設置爲環境變量。然後在Spark shell中運行以下命令。301嘗試訪問AWS Mumbai S3服務器時重定向

對於新加坡:

sc.hadoopConfiguration.set("fs.s3a.endpoint","s3-ap-southeast-1.amazonaws.com") 
val testdf = sqlContext.read.csv("s3a://dev-singapore/test.csv") 

它運行得很好。

孟買:

sc.hadoopConfiguration.set("fs.s3a.endpoint","s3.ap-south-1.amazonaws.com") 
val testdf = sqlContext.read.csv("s3a://dev-mumbai/test.csv") 

但它給了我下面的錯誤

17/05/31 11:56:58 WARN DataSource: Error while looking for metadata directory. 
com.amazonaws.services.s3.model.AmazonS3Exception: Status Code: 301, AWS Service: Amazon S3, AWS Request ID: BDFC*****9C820, AWS Error Code: null, AWS Error Message: Moved Permanently 
at com.amazonaws.http.AmazonHttpClient.handleErrorResponse(AmazonHttpClient.java:798) 
at com.amazonaws.http.AmazonHttpClient.executeHelper(AmazonHttpClient.java:421) 
at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:232) 

孟買地區S3服務器只支持簽名版本4,而新加坡支持版本2和4

我使用了Docker鏡像中的Spark(2.0.0)https://hub.docker.com/r/stvdberghe/spark-s3/

回答

0

301通常表示您選擇的端點不是實際上存在的端點。

嘗試在spark-default.conf或sparkConf.set(「spark.hadoop.fs.s3a.endpoint」,...)中設置火花上下文時(而不是稍後)設置端點

+0

但端點是正確的。我更新了aws-java-sdk到1.7.4,現在它給了400.另一個端點和存儲桶工作得很好。 hadoop-aws jar版本爲2.7 –

0

經過大量的嘗試和研究,我可以找出問題所在。讓我們重溫我的旅程。

Hadoop 2.8正與孟買s3a合作。 Hadoop 2.7的Spark 2.1.1無法正常工作。 Spark依靠Hadoop aws庫連接到S3。所以,我發現Hadoop是罪魁禍首。然後我用Hadoop 2.8發行版查找Spark,但它不可用。我試圖替換Spark-2.1.1-hadoop-2.7的Hadoop庫,但它不太合適。 AWS已經改變了很多API,甚至Hadoop也改變了客戶端庫以連接到S3/AWS服務。它合併了hadoop-aws和aws-java-sdk;添加了aws-java-sdk-s3和一些更多的庫。最後,我用Hadoop 2.8構建了Spark(https://spark.apache.org/docs/2.1.0/building-spark.html#specifying-the-hadoop-version)。它終於奏效了。

雖然我得到了ClassNotFound的一些錯誤

org.apache.hadoop.fs.s3a.S3AFileSystem 

所以我下載了以下從MVN庫網站

對於確切的版本,我看着在Hadoop的2.8庫($ HADOOP_HOME /股/ Hadoop的/ tools/lib目錄/)文件夾中。在此之後,我得到了喬達類

org/joda/time/format/DateTimeFormat 

沒有發現錯誤,我從MVN庫網站下載喬達時間-2.8.2 jar文件解決。

+0

好的,聽起來像你已經修復它。我曾預計2.7個JAR(特別是AWS 1.7.4客戶端在joda時間最新時與孟買合作)。您可以嘗試將更新時間更新爲2.8.2並保留2.7.x JAR。否則:2017年6月發佈新的Hadoop 2.8.x二進制文件; Spark 2.3的構建配置文件「hadoop-cloud」包含了與AWS,Azure和openstack對話所需的所有內容 –

+0

@SteveLoughran感謝您的洞察力。我的Spark發行版已經包含了joda-time-2.9.3.jar。我會檢查hadoop雲。 –

+0

@SteveLoughran當我編譯Spark的最新代碼時,它沒有編譯hadoop-cloud。試圖手動構建它,但給了錯誤的配置文件丟失。這裏有什麼需要考慮的嗎? –