Как я могу использовать графические фреймы с pyspark в AWS EMR? - PullRequest
1 голос
/ 04 июня 2019

Я пытаюсь использовать пакет graphframes в pyspark в Jupyter Notebook (используя Sagemaker и sparkmagic) в AWS EMR.Я попытался добавить параметр конфигурации при создании кластера EMR в консоли AWS:

[{"classification":"spark-defaults", "properties":{"spark.jars.packages":"graphframes:graphframes:0.7.0-spark2.4-s_2.11"}, "configurations":[]}]

Но я все еще получал сообщение об ошибке при попытке использовать пакет graphframes в своем коде pyspark в блокноте jupyter.

Вот мой код (это из примера графических фреймов):

# Create a Vertex DataFrame with unique ID column "id"
v = spark.createDataFrame([
  ("a", "Alice", 34),
  ("b", "Bob", 36),
  ("c", "Charlie", 30),
], ["id", "name", "age"])
# Create an Edge DataFrame with "src" and "dst" columns
e = spark.createDataFrame([
  ("a", "b", "friend"),
  ("b", "c", "follow"),
  ("c", "b", "follow"),
], ["src", "dst", "relationship"])
# Create a GraphFrame
from graphframes import *
g = GraphFrame(v, e)

# Query: Get in-degree of each vertex.
g.inDegrees.show()

# Query: Count the number of "follow" connections in the graph.
g.edges.filter("relationship = 'follow'").count()

# Run PageRank algorithm, and show results.
results = g.pageRank(resetProbability=0.01, maxIter=20)
results.vertices.select("id", "pagerank").show()

А вот вывод / ошибка:

ImportError: No module named graphframes

Я прочитал этот поток git но все возможные обходные пути кажутся очень сложными и требуют подключения к главному узлу кластера EMR.

1 Ответ

2 голосов
/ 04 июня 2019

Я наконец-то понял, что есть пакет PyPi для графических фреймов . Я использовал это для создания действия по начальной загрузке, как подробно здесь , хотя я немного изменил.

Вот что я сделал, чтобы графические рамки работали на EMR:

  1. Сначала я создал сценарий оболочки и сохранил его с именем s3 "install_jupyter_libraries_emr.sh":
#!/bin/bash

sudo pip install graphframes
  1. Затем я прошел процесс создания EMR расширенных опций в консоли AWS.
    • На шаге 1 я добавил в maven координаты пакета graphframes в текстовое поле редактирования настроек программного обеспечения:
    [{"classification":"spark-defaults","properties":{"spark.jars.packages":"graphframes:graphframes:0.7.0-spark2.4-s_2.11"}}]
    
    • Во время шага 3: Общие настройки кластера я перешел в раздел действий начальной загрузки
    • В разделе действий начальной загрузки я добавил новое настраиваемое действие Boostrap с:
      • произвольное имя
      • S3-расположение моего сценария "install_jupyter_libraries_emr.sh"
      • необязательные аргументы
    • Затем я приступил к созданию кластера
  2. Как только мой кластер заработал, я вошел в Jupyter и запустил свой код:
# Create a Vertex DataFrame with unique ID column "id"
v = spark.createDataFrame([
  ("a", "Alice", 34),
  ("b", "Bob", 36),
  ("c", "Charlie", 30),
], ["id", "name", "age"])
# Create an Edge DataFrame with "src" and "dst" columns
e = spark.createDataFrame([
  ("a", "b", "friend"),
  ("b", "c", "follow"),
  ("c", "b", "follow"),
], ["src", "dst", "relationship"])
# Create a GraphFrame
from graphframes import *
g = GraphFrame(v, e)

# Query: Get in-degree of each vertex.
g.inDegrees.show()

# Query: Count the number of "follow" connections in the graph.
g.edges.filter("relationship = 'follow'").count()

# Run PageRank algorithm, and show results.
results = g.pageRank(resetProbability=0.01, maxIter=20)
results.vertices.select("id", "pagerank").show()

И на этот раз, наконец, я получил правильный вывод:

+---+--------+
| id|inDegree|
+---+--------+
|  c|       1|
|  b|       2|
+---+--------+

+---+------------------+
| id|          pagerank|
+---+------------------+
|  b|1.0905890109440908|
|  a|              0.01|
|  c|1.8994109890559092|
+---+------------------+
...