我有一个在 EMR 中运行的 Spark 集群。我还有一个在第二台 EC2 机器上运行的 jupyter 笔记本。我想通过 jupyter 在我的 EC2 实例上使用 Spark。我正在寻找有关如何配置 Spark 以从 EC2 访问 EMR 集群的参考。搜索只为我提供了如何在 EMR 或 EC2 上设置 Spark 的指南,但没有提供如何从另一个访问其中之一的指南。
我在这里看到了类似的问题:
从 EC2 上运行的 Jupyter/IPython 向 EMR 集群发送命令
但是,那里的设置使用引导操作来设置 zeppelin,并且我不确定如何在 EC2 上编辑我的 hadoop 配置。
这已经很晚了,但会帮助人们在未来寻找解决方案。
这里的解决方案是将 hadoop、spark 和 hive 配置文件从 EMR 集群节点复制到 EC2 机器,并将它们放置在每个节点相应的配置位置(示例配置文件应该已经存在于类似于 /etc/hadoop/conf 的位置) 。现在,您的 ec2 机器将开始使用 EMR 节点作为所有作业的主节点。
如果您遇到任何 DNS 识别问题,请将所有出现的主节点 DNS 名称替换为实际 IP,或在 /etc/hosts 文件中添加一个条目,使其可被 ec2 机器识别。
sudo scp -i sample.pem /etc/hadoop/conf/ ec2-user@some_ip:/home/ec2-user/spark/hadoop/conf
sudo scp -i sample.pem /etc/hive/conf/ ec2-user@some_ip:/home/ec2-user/spark/hive/conf
sudo scp -i sample.pem /etc/spark/conf/ ec2-user@some_ip:/home/ec2-user/spark/spark/conf
现在使用 sudo copy 命令将它们放在相应的位置
正确的方法是在主节点(分配为主节点的 EC2 实例)中运行 Jupyter 并在那里提交 Spark 应用程序。
您可以使用 EMR 笔记本来满足您的需求。它位于集群外部,您可以连接到您选择的任何 EMR 集群。
更多详细信息请参见:https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-management-notebooks.html
您还可以从笔记本中添加 Pyspark 作业所需的任何 Python 依赖项。这些将在 EMR 集群上可用,并在您自己的笔记本会话中隔离。
要在 EC2 Jupyter Notebook 中配置 SparkSession 以与 EMR (6.x.x) Spark master 连接,请执行以下操作
# The version assumed here is 3.5.0
sudo /usr/lib/spark/sbin/start-connect-server.sh --packages org.apache.spark:spark-connect_2.12:3.5.0
# OR
sudo /usr/lib/spark/sbin/start-connect-server.sh --packages org.apache.spark:spark-connect_2.12:3.5.0 --conf spark.sql.catalogImplementation=hive ----conf spark.hadoop.hive.metastore.uris=thrift://<EMR-MASTER-NODE-PRIVATE-IP>:9083
# Replace <EMR-MASTER-NODE-PRIVATE-IP> with your EMR master node's private IP address
# Check pyspark version in EMR (Login into EMR server as hadoop user.)
pyspark --version
# The same version will be referred in the next steps
在带有 Jupyter Notebook 的 EC2 实例上:
/opt/spark
或适当的目录export SPARK_HOME=/opt/spark
export PATH=$SPARK_HOME/bin:$PATH
export PATH=$SPARK_HOME/sbin:$PATH
pip3 install pyspark==3.5.0
在 EC2 Jupyter Notebook 中,使用以下代码进行连接:
from pyspark.sql import SparkSession
spark = SparkSession.builder \
.remote("sc://<EMR-MASTER-NODE-PRIVATE-IP>:15002") \
.config("spark.sql.catalogImplementation", "hive") \
.config("spark.hadoop.fs.s3.impl", "com.amazon.ws.emr.hadoop.fs.EmrFileSystem") \
.config("spark.sql.session.localRelationCacheThreshold", "1000") \
.getOrCreate()
```
# Replace <EMR-MASTER-NODE-PRIVATE-IP> with the EMR master node's private IP address.
print("spark master - ",spark.conf.get("spark.master"))
print("spark executer memory - ",spark.conf.get("spark.executor.memory"))
print("spark driver memory - ",spark.conf.get("spark.driver.memory"))
print("spark no of cores - ",spark.conf.get("spark.executor.cores"))