0

bdutil を使用して Hadoop (2.6) クラスターに yarn-client を使用して Spark (1.3.1) をデプロイしました。デフォルトでは、インスタンスはエフェメラル外部 IP で作成され、これまでのところ Spark は正常に動作しています。いくつかのセキュリティ上の懸念があり、クラスターが内部アクセスのみであると仮定して、インスタンスから外部 IP を削除しました。その後、spark-shell は実行されず、Yarn/Hadoop と通信できないように見え、無期限にスタックしました。外部 IP を追加して初めて、spark-shell が適切に機能し始めます。

私の質問は、spark over yarn を実行するためにノードの外部 ips が必要ですか? またその理由は? はいの場合、セキュリティなどに関する懸念はありますか? ありがとう!

4

1 に答える 1

1

簡潔な答え

GCS にアクセスするには外部 IP アドレスが必要です。デフォルトの bdutil 設定では、GCS を制御ファイルを含むデフォルトの Hadoop ファイルシステムとして設定します。./bdutil -F hdfs ... deploy代わりに HDFS をデフォルトとして使用するために使用します。

GCE ネットワーク構成のファイアウォール ルールに許容ルールを追加しすぎない限り、外部 IP アドレスを使用する場合にセキュリティを気にする必要はありません。

編集: 現時点ではspark.eventLog.dir、default_fs が hdfs であっても GCS パスに設定するというバグがあるようです。これを追跡するためにhttps://github.com/GoogleCloudPlatform/bdutil/issues/35を提出しました。それまでの間、マスターを手動で編集し (編集権限/home/hadoop/spark-install/conf/spark-defaults.confが必要な場合があります) 、HDFS で何かを設定し、実行して動作させます。sudo -u hadoop vim.tiny /home/hadoop/spark-install/conf/spark-defaults.confspark.eventLog.dirhdfs:///spark-eventlog-basehadoop fs -mkdir -p hdfs:///spark-eventlog-base

長い答え

デフォルトでは、bdutil は Google Cloud Storage を「デフォルトの Hadoop ファイルシステム」としても構成します。これは、Spark と YARN で使用される制御ファイルが Google Cloud Storage にアクセスする必要があることを意味します。さらに、Google Cloud Storage にアクセスするには、外部 IP が必要です。

ネットワーク内 SSH を手動で構成した後、あなたのケースを部分的に再現することができました。起動時に、実際に次のように表示されます。

15/06/26 17:23:05 INFO yarn.Client: Preparing resources for our AM container
15/06/26 17:23:05 INFO gcs.GoogleHadoopFileSystemBase: GHFS version: 1.4.0-hadoop2
15/06/26 17:23:26 WARN http.HttpTransport: exception thrown while executing request
java.net.SocketTimeoutException: connect timed out
  at java.net.PlainSocketImpl.socketConnect(Native Method)
  at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)
  at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
  at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
  at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
  at java.net.Socket.connect(Socket.java:579)
  at sun.security.ssl.SSLSocketImpl.connect(SSLSocketImpl.java:625)
  at sun.net.NetworkClient.doConnect(NetworkClient.java:175)
  at sun.net.www.http.HttpClient.openServer(HttpClient.java:432)
  at sun.net.www.http.HttpClient.openServer(HttpClient.java:527)
  at sun.net.www.protocol.https.HttpsClient.<init>(HttpsClient.java:275)
  at sun.net.www.protocol.https.HttpsClient.New(HttpsClient.java:371)
  at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.getNewHttpClient(AbstractDelegateHttpsURLConnection.java:191)
  at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:933)
  at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:177)
  at sun.net.www.protocol.https.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java:153)
  at com.google.api.client.http.javanet.NetHttpRequest.execute(NetHttpRequest.java:93)
  at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:965)
  at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:410)
  at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:343)
  at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:460)
  at com.google.cloud.hadoop.gcsio.GoogleCloudStorageImpl.getBucket(GoogleCloudStorageImpl.java:1557)
  at com.google.cloud.hadoop.gcsio.GoogleCloudStorageImpl.getItemInfo(GoogleCloudStorageImpl.java:1512)
  at com.google.cloud.hadoop.gcsio.CacheSupplementedGoogleCloudStorage.getItemInfo(CacheSupplementedGoogleCloudStorage.java:516)
  at com.google.cloud.hadoop.gcsio.GoogleCloudStorageFileSystem.getFileInfo(GoogleCloudStorageFileSystem.java:1016)
  at com.google.cloud.hadoop.gcsio.GoogleCloudStorageFileSystem.exists(GoogleCloudStorageFileSystem.java:382)
  at com.google.cloud.hadoop.fs.gcs.GoogleHadoopFileSystemBase.configureBuckets(GoogleHadoopFileSystemBase.java:1639)
  at com.google.cloud.hadoop.fs.gcs.GoogleHadoopFileSystem.configureBuckets(GoogleHadoopFileSystem.java:71)
  at com.google.cloud.hadoop.fs.gcs.GoogleHadoopFileSystemBase.configure(GoogleHadoopFileSystemBase.java:1587)
  at com.google.cloud.hadoop.fs.gcs.GoogleHadoopFileSystemBase.initialize(GoogleHadoopFileSystemBase.java:776)
  at com.google.cloud.hadoop.fs.gcs.GoogleHadoopFileSystemBase.initialize(GoogleHadoopFileSystemBase.java:739)
  at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:2596)
  at org.apache.hadoop.fs.FileSystem.access$200(FileSystem.java:91)
  at org.apache.hadoop.fs.FileSystem$Cache.getInternal(FileSystem.java:2630)
  at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:2612)
  at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:370)
  at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:169)
  at org.apache.spark.deploy.yarn.Client.prepareLocalResources(Client.scala:216)
  at org.apache.spark.deploy.yarn.Client.createContainerLaunchContext(Client.scala:384)
  at org.apache.spark.deploy.yarn.Client.submitApplication(Client.scala:102)
  at org.apache.spark.scheduler.cluster.YarnClientSchedulerBackend.start(YarnClientSchedulerBackend.scala:58)
  at org.apache.spark.scheduler.TaskSchedulerImpl.start(TaskSchedulerImpl.scala:141)
  at org.apache.spark.SparkContext.<init>(SparkContext.scala:381)
  at org.apache.spark.repl.SparkILoop.createSparkContext(SparkILoop.scala:1016)
  at $line3.$read$$iwC$$iwC.<init>(<console>:9)
  at $line3.$read$$iwC.<init>(<console>:18)
  at $line3.$read.<init>(<console>:20)
  at $line3.$read$.<init>(<console>:24)
  at $line3.$read$.<clinit>(<console>)
  at $line3.$eval$.<init>(<console>:7)
  at $line3.$eval$.<clinit>(<console>)
  at $line3.$eval.$print(<console>)
  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  at java.lang.reflect.Method.invoke(Method.java:606)
  at org.apache.spark.repl.SparkIMain$ReadEvalPrint.call(SparkIMain.scala:1065)
  at org.apache.spark.repl.SparkIMain$Request.loadAndRun(SparkIMain.scala:1338)
  at org.apache.spark.repl.SparkIMain.loadAndRunReq$1(SparkIMain.scala:840)
  at org.apache.spark.repl.SparkIMain.interpret(SparkIMain.scala:871)
  at org.apache.spark.repl.SparkIMain.interpret(SparkIMain.scala:819)
  at org.apache.spark.repl.SparkILoop.reallyInterpret$1(SparkILoop.scala:856)
  at org.apache.spark.repl.SparkILoop.interpretStartingWith(SparkILoop.scala:901)
  at org.apache.spark.repl.SparkILoop.command(SparkILoop.scala:813)
  at org.apache.spark.repl.SparkILoopInit$$anonfun$initializeSpark$1.apply(SparkILoopInit.scala:123)
  at org.apache.spark.repl.SparkILoopInit$$anonfun$initializeSpark$1.apply(SparkILoopInit.scala:122)
  at org.apache.spark.repl.SparkIMain.beQuietDuring(SparkIMain.scala:324)
  at org.apache.spark.repl.SparkILoopInit$class.initializeSpark(SparkILoopInit.scala:122)
  at org.apache.spark.repl.SparkILoop.initializeSpark(SparkILoop.scala:64)
  at org.apache.spark.repl.SparkILoop$$anonfun$org$apache$spark$repl$SparkILoop$$process$1$$anonfun$apply$mcZ$sp$5.apply$mcV$sp(SparkILoop.scala:973)
  at org.apache.spark.repl.SparkILoopInit$class.runThunks(SparkILoopInit.scala:157)
  at org.apache.spark.repl.SparkILoop.runThunks(SparkILoop.scala:64)
  at org.apache.spark.repl.SparkILoopInit$class.postInitialization(SparkILoopInit.scala:106)
  at org.apache.spark.repl.SparkILoop.postInitialization(SparkILoop.scala:64)
  at org.apache.spark.repl.SparkILoop$$anonfun$org$apache$spark$repl$SparkILoop$$process$1.apply$mcZ$sp(SparkILoop.scala:990)
  at org.apache.spark.repl.SparkILoop$$anonfun$org$apache$spark$repl$SparkILoop$$process$1.apply(SparkILoop.scala:944)
  at org.apache.spark.repl.SparkILoop$$anonfun$org$apache$spark$repl$SparkILoop$$process$1.apply(SparkILoop.scala:944)
  at scala.tools.nsc.util.ScalaClassLoader$.savingContextLoader(ScalaClassLoader.scala:135)
  at org.apache.spark.repl.SparkILoop.org$apache$spark$repl$SparkILoop$$process(SparkILoop.scala:944)
  at org.apache.spark.repl.SparkILoop.process(SparkILoop.scala:1058)
  at org.apache.spark.repl.Main$.main(Main.scala:31)
  at org.apache.spark.repl.Main.main(Main.scala)
  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  at java.lang.reflect.Method.invoke(Method.java:606)
  at org.apache.spark.deploy.SparkSubmit$.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:569)
  at org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:166)
  at org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:189)
  at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:110)
  at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)

予想どおり、呼び出すだけでorg.apache.spark.scheduler.cluster.YarnClientSchedulerBackend.startGoogle Cloud Storage に接続しようとしますが、外部 IP なしでは GCS アクセスがないため失敗します。

これを回避するには-F hdfs、クラスターを作成するときに HDFS をデフォルトのファイルシステムとして使用するだけです。その場合、外部 IP アドレスがなくてもすべてがクラスター内で機能するはずです。gs://bucket/objectそのモードでは、Hadoop 引数としてフル パスを指定することにより、外部 IP アドレスが割り当てられている場合はいつでも、引き続き GCS を使用することもできます。ただし、その場合、外部 IP アドレスを削除している限り、プロキシ サーバーを構成し、プロキシを介してすべてのデータを転送しない限り、GCS を使用できないことに注意してください。そのための GCS 構成はfs.gs.proxy.address.

一般に、Google Compute Engine の「デフォルト」ネットワーク ファイアウォール ルールで新しい許容ルールを設定していない限り、外部 IP アドレスがあるという理由だけでセキュリティを心配する必要はありません。

于 2015-06-26T17:31:43.377 に答える