Apache spark 在单个计算机上使用pyspark设置任务插槽

Apache spark 在单个计算机上使用pyspark设置任务插槽,apache-spark,pyspark,hyperopt,Apache Spark,Pyspark,Hyperopt,我正在尝试使用hyperopt库中的SparkTrials运行ML模型的优化。我在一台有16个内核的机器上运行这个,但是当我运行下面的代码将内核数设置为8时,我得到一个警告,似乎表明只使用了一个内核 接受作为参数spark\u session,理论上,这是我设置核心数的地方 有人能帮我吗 谢谢 import os, shutil, tempfile from hyperopt import fmin, tpe, hp, SparkTrials, STATUS_OK import numpy as

我正在尝试使用
hyperopt
库中的
SparkTrials
运行ML模型的优化。我在一台有16个内核的机器上运行这个,但是当我运行下面的代码将内核数设置为8时,我得到一个警告,似乎表明只使用了一个内核

接受作为参数
spark\u session
,理论上,这是我设置核心数的地方

有人能帮我吗

谢谢

import os, shutil, tempfile
from hyperopt import fmin, tpe, hp, SparkTrials, STATUS_OK
import numpy as np
from sklearn import linear_model, datasets, model_selection
import pyspark
from pyspark.sql import SparkSession

spark = SparkSession.builder.master("local").config('spark.local.dir', './').config("spark.executor.cores", 8).getOrCreate()

def gen_data(bytes):
  """
  Generates train/test data with target total bytes for a random regression problem.
  Returns (X_train, X_test, y_train, y_test).
  """
  n_features = 100
  n_samples = int(1.0 * bytes / (n_features + 1) / 8)
  X, y = datasets.make_regression(n_samples=n_samples, n_features=n_features, random_state=0)
  return model_selection.train_test_split(X, y, test_size=0.2, random_state=1)

def train_and_eval(data, alpha):
  """
  Trains a LASSO model using training data with the input alpha and evaluates it using test data.
  """
  X_train, X_test, y_train, y_test = data  
  model = linear_model.Lasso(alpha=alpha)
  model.fit(X_train, y_train)
  loss = model.score(X_test, y_test)
  return {"loss": loss, "status": STATUS_OK}

def tune_alpha(objective):
  """
  Uses Hyperopt's SparkTrials to tune the input objective, which takes alpha as input and returns loss.
  Returns the best alpha found.
  """
  best = fmin(
    fn=objective,
    space=hp.uniform("alpha", 0.0, 10.0),
    algo=tpe.suggest,
    max_evals=8,
    trials=SparkTrials(parallelism=8,spark_session=spark))
  return best["alpha"]

data_small = gen_data(10 * 1024 * 1024)  # ~10MB

def objective_small(alpha):
  # For small data, you might reference it directly.
  return train_and_eval(data_small, alpha)

tune_alpha(objective_small)
并行度(8)大于当前Spark任务插槽的总数 (1). 如果启用了动态分配,您可能会看到更多的执行者 分配的


如果您在集群中:Spark术语中的内核与CPU中的物理内核无关,这里使用
Spark.executor.cores
指定了每个执行器的最大线程数(=任务)(这里有一个)如果要增加执行器的数量,则必须在命令行中使用
--num executors
,或在代码中使用
spark.executor.instances
配置属性,则“can run”为8

我建议,如果你是在一个纱线集群中,试试这种配置

spark.conf.set("spark.dynamicAllocation.enabled", "true")
spark.conf.set("spark.executor.cores", 4)
spark.conf.set("spark.dynamicAllocation.minExecutors","2")
spark.conf.set("spark.dynamicAllocation.maxExecutors","10")

<强>请考虑以上选项在本地模式< /强>

中不可用
local:在本地模式下,您只有一个执行器,如果您想更改其工作线程的数量(默认情况下为一个),则必须将主线程设置为如下
local[*]
local[16]

如果您在集群中:Spark术语中的内核与CPU中的物理内核无关,使用
Spark.executor.cores
您指定了每个执行器的最大线程数(=任务)(此处有一个)如果要增加执行器的数量,则必须在命令行中使用
--num executors
,或在代码中使用
spark.executor.instances
配置属性,则“can run”为8

我建议,如果你是在一个纱线集群中,试试这种配置

spark.conf.set("spark.dynamicAllocation.enabled", "true")
spark.conf.set("spark.executor.cores", 4)
spark.conf.set("spark.dynamicAllocation.minExecutors","2")
spark.conf.set("spark.dynamicAllocation.maxExecutors","10")

<强>请考虑以上选项在本地模式< /强>

中不可用 local:在本地模式下,您只有一个执行器,如果您想更改其工作线程的数量(默认情况下为一个),则必须按照以下方式设置主线程
local[*]
local[16]