Я нашел источник проблемы, он связан с Docker и как он обрабатывает свое имя хоста в контейнере. У меня также есть неудовлетворительный обходной путь.
Предположим, что я wget
отредактировал тарбол Spark и распаковал его
https://www.apache.org/dyn/closer.lua/spark/spark-2.4.2/spark-2.4.2-bin-hadoop2.7.tgz
Зайдя в его каталог, я могу попробовать альтернативный пример сценария, который уже предоставлен
./bin/run-example SparkPi 10
Я продолжаю сталкиваться с этой ошибкой:
rmarkbio@linuxkit-025000000001:~/project/spark-2.4.2-bin-hadoop2.7$ ./bin/run-example SparkPi 10
Exception in thread "main" java.lang.ExceptionInInitializerError
at org.apache.spark.SparkConf$.<init>(SparkConf.scala:716)
at org.apache.spark.SparkConf$.<clinit>(SparkConf.scala)
at org.apache.spark.SparkConf.$anonfun$getOption$1(SparkConf.scala:389)
at scala.Option.orElse(Option.scala:306)
at org.apache.spark.SparkConf.getOption(SparkConf.scala:389)
at org.apache.spark.SparkConf.get(SparkConf.scala:251)
at org.apache.spark.deploy.SparkHadoopUtil$.org$apache$spark$deploy$SparkHadoopUtil$$appendS3AndSparkHadoopConfigurations(SparkHadoopUtil.scala:463)
at org.apache.spark.deploy.SparkHadoopUtil$.newConfiguration(SparkHadoopUtil.scala:436)
at org.apache.spark.deploy.SparkSubmit.$anonfun$prepareSubmitEnvironment$3(SparkSubmit.scala:334)
at scala.Option.getOrElse(Option.scala:138)
at org.apache.spark.deploy.SparkSubmit.prepareSubmitEnvironment(SparkSubmit.scala:334)
at org.apache.spark.deploy.SparkSubmit.submit(SparkSubmit.scala:143)
at org.apache.spark.deploy.SparkSubmit.doSubmit(SparkSubmit.scala:86)
at org.apache.spark.deploy.SparkSubmit$$anon$2.doSubmit(SparkSubmit.scala:924)
at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:933)
at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)
Caused by: java.net.UnknownHostException: linuxkit-025000000001: linuxkit-025000000001: Name or service not known
at java.net.InetAddress.getLocalHost(InetAddress.java:1506)
at org.apache.spark.util.Utils$.findLocalInetAddress(Utils.scala:946)
at org.apache.spark.util.Utils$.localIpAddress$lzycompute(Utils.scala:939)
at org.apache.spark.util.Utils$.localIpAddress(Utils.scala:939)
at org.apache.spark.util.Utils$.$anonfun$localCanonicalHostName$1(Utils.scala:996)
at scala.Option.getOrElse(Option.scala:138)
at org.apache.spark.util.Utils$.localCanonicalHostName(Utils.scala:996)
at org.apache.spark.internal.config.package$.<init>(package.scala:302)
at org.apache.spark.internal.config.package$.<clinit>(package.scala)
... 16 more
Caused by: java.net.UnknownHostException: linuxkit-025000000001: Name or service not known
at java.net.Inet6AddressImpl.lookupAllHostAddr(Native Method)
at java.net.InetAddress$2.lookupAllHostAddr(InetAddress.java:929)
at java.net.InetAddress.getAddressesFromNameService(InetAddress.java:1324)
at java.net.InetAddress.getLocalHost(InetAddress.java:1501)
... 24 more
Но потом я обнаружил предположение, что часть ошибки гласит
Caused by: java.net.UnknownHostException: linuxkit-025000000001: Name or service not known
означает, что имя хоста, которое здесь "linuxkit-025000000001
", не находится в /etc/hosts
. Действительно, это так. Я должен зайти в этот файл и изменить
127.0.0.1 localhost
до
127.0.0.1 linuxkit-025000000001 localhost
и это похоже на работу (насколько я могу судить по громоздкому выводу, что я воздержусь от публикации здесь).
Для двойной проверки давайте попробуем запустить pyspark
исполняемый файл
rmarkbio@linuxkit-025000000001:~/project/spark-2.4.2-bin-hadoop2.7$ ./bin/pyspark
Python 3.5.3+ (default, Nov 29 2017, 08:55:08)
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
19/05/07 18:49:58 WARN Utils: Your hostname, linuxkit-025000000001 resolves to a loopback address: 127.0.0.1; using 192.168.65.3 instead (on interface eth0)
19/05/07 18:49:58 WARN Utils: Set SPARK_LOCAL_IP if you need to bind to another address
19/05/07 18:49:58 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Using Spark's default log4j profile: org/apache/spark/log4j-defaults.properties
Setting default log level to "WARN".
To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).
Welcome to
____ __
/ __/__ ___ _____/ /__
_\ \/ _ \/ _ `/ __/ '_/
/__ / .__/\_,_/_/ /_/\_\ version 2.4.2
/_/
Using Python version 3.5.3+ (default, Nov 29 2017 08:55:08)
SparkSession available as 'spark'.
Работает !!!
Итак, какова история linuxkit-025000000001
? Это хорошо объясняет
https://github.com/docker/for-mac/issues/2902
Я хочу, чтобы это изменение было в /etc/hosts
сразу после создания контейнера из изображения, поэтому мне нужно Dockerfile
, чтобы сделать это. К сожалению, это не представляется возможным.
Пока что я не могу найти способ сделать это из Dockerfile
; Похоже, что Docker настроен на предотвращение доступа к /etc/hosts
до тех пор, пока контейнер не будет создан. Вместо этого я должен согласиться с этим сценарием инициализации, который я вызываю просто init.sh
#!/bin/bash
cp /etc/hosts /home/rmarkbio/project/hosts.new
sed -i "s/127.0.0.1 localhost/127.0.0.1 linuxkit-025000000001 localhost/" /home/rmarkbio/project/hosts.new
echo "somepassword" | sudo -S cp -f /home/rmarkbio/project/hosts.new /etc/hosts
rm /home/rmarkbio/project/hosts.new
echo ''