タグ付けされた質問 「apache-spark」

Apache SparkはScalaで記述されたオープンソースの分散データ処理エンジンであり、統一されたAPIと分散データセットをユーザーに提供します。Apache Sparkの使用例は、多くの場合、機械/深層学習、グラフ処理に関連しています。


5
道路の平均速度を計算する[終了]
休業。この質問には、より焦点を当てる必要があります。現在、回答を受け付けていません。 この質問を改善してみませんか?質問を更新して、この投稿を編集するだけで1つの問題に焦点を当てます。 4日前休業。 データエンジニアの面接に行ってきました。インタビュアーから質問がありました。彼は私にいくつかの状況を与え、そのシステムのデータフローを設計するように頼みました。私はそれを解決しましたが、彼は私の解決策を嫌い、失敗しました。その課題を解決するためのより良いアイデアがあるかどうか知りたいのですが。 問題は: 私たちのシステムは4つのデータストリームを受信します。データには、車両ID、速度、地理位置情報の調整が含まれています。すべての車両が1分に1回データを送信します。特定の小川と特定の道路や車両などには何の関係もありません。コーディネートを受け付けて道路区間名を返す機能があります。5分あたりの道路セクションごとの平均速度を知る必要があります。最後に、結果をKafkaに書き込みます。 だから私の解決策は: 最初に、すべてのデータをカフカクラスターに1つのトピックに書き込み、緯度の最初の5〜6桁を経度の最初の5〜6桁に連結して分割します。次に、Structured Streamingによってデータを読み取り、調整ごとに道路セクション名を行ごとに追加し(そのための事前定義されたudfがあります)、道路セクション名によってデータをまとめます。 Kafkaのデータを調整の最初の5桁から6桁で分割するため、調整をセクション名に変換した後、大量のデータを正しいパーティションに転送する必要がないため、colesce()操作を利用できます。それは完全なシャッフルを引き起こしません。 次に、エグゼキューターごとの平均速度を計算します。 プロセス全体は5分ごとに発生し、追加モードでデータを最後のKafkaシンクに書き込みます。 そのため、面接担当者は私の解決策を好まなかった。誰かがそれを改善する方法や完全に異なるより良いアイデアを提案できますか?

2
多くのスパークジョブが同時にスケジュールされる場合のデッドロック
YARNクラスターモードで実行されているSpark 2.4.4をSpark FIFOスケジューラーと共に使用する。 可変数のスレッドを持つスレッドプールエグゼキューターを使用して、複数のsparkデータフレーム操作(つまり、S3へのデータの書き込み)を送信しています。これは、スレッド数が10以下の場合は問題なく機能しますが、数百のスレッドを使用すると、デッドロックが発生し、Spark UIに従ってジョブがスケジュールされないように見えます。 同時にスケジュールできるジョブの数を制御する要因は何ですか?ドライバーリソース(メモリ/コアなど)?他のスパーク構成設定? 編集: これが私のコードの簡単な概要です ExecutorService pool = Executors.newFixedThreadPool(nThreads); ExecutorCompletionService<Void> ecs = new ExecutorCompletionService<>(pool); Dataset<Row> aHugeDf = spark.read.json(hundredsOfPaths); List<Future<Void>> futures = listOfSeveralHundredThings .stream() .map(aThing -> ecs.submit(() -> { df .filter(col("some_column").equalTo(aThing)) .write() .format("org.apache.hudi") .options(writeOptions) .save(outputPathFor(aThing)); return null; })) .collect(Collectors.toList()); IntStream.range(0, futures.size()).forEach(i -> ecs.poll(30, TimeUnit.MINUTES)); exec.shutdownNow(); ある時点でnThreads、sparkが増加するにつれて、次のことからもわかるように、sparkがジョブをスケジュールしなくなったように見えます。 ecs.poll(...) 最終的にタイムアウトする …

2
Spark:私のユースケースでPythonがScalaを大幅に上回っているのはなぜですか?
PythonとScalaを使用しているときのSparkのパフォーマンスを比較するために、両方の言語で同じジョブを作成し、ランタイムを比較しました。私は両方のジョブにほぼ同じ時間がかかると予想していましたが、Pythonのジョブだけがかかりましたが27min、Scalaのジョブはかかりました37min(ほぼ40%長くなります!)。私はJavaにも同じジョブを実装しましたが、それもかかり37minutesました。どうしてこれがPythonがそんなに速いのか 最小限の検証可能な例: Pythonジョブ: # Configuration conf = pyspark.SparkConf() conf.set("spark.hadoop.fs.s3a.aws.credentials.provider", "org.apache.hadoop.fs.s3a.AnonymousAWSCredentialsProvider") conf.set("spark.executor.instances", "4") conf.set("spark.executor.cores", "8") sc = pyspark.SparkContext(conf=conf) # 960 Files from a public dataset in 2 batches input_files = "s3a://commoncrawl/crawl-data/CC-MAIN-2019-35/segments/1566027312025.20/warc/CC-MAIN-20190817203056-20190817225056-00[0-5]*" input_files2 = "s3a://commoncrawl/crawl-data/CC-MAIN-2019-35/segments/1566027312128.3/warc/CC-MAIN-20190817102624-20190817124624-00[0-3]*" # Count occurances of a certain string logData = sc.textFile(input_files) logData2 = sc.textFile(input_files2) a = logData.filter(lambda value: …

1
Pyspark dfからPostgresSQLに5,000万以上を書き込む、最も効率的なアプローチ
数百万のレコードを挿入する最も効率的な方法は、SparkデータフレームからPostgresテーブルに5,000万を挿入することです。私もこれまで成功したバルクコピーとバッチサイズオプションを利用して、これをSparkから MSSQLまで実現しました。 Postgresのためにここにあることができる同様のものはありますか? 私が試したコードとプロセスの実行にかかった時間を追加します: def inserter(): start = timer() sql_res.write.format("jdbc").option("numPartitions","5").option("batchsize","200000")\ .option("url", "jdbc:postgresql://xyz.com:5435/abc_db") \ .option("dbtable", "public.full_load").option("user", "root").option("password", "password").save() end = timer() print(timedelta(seconds=end-start)) inserter() したがって、1000万レコードに対して上記のアプローチを実行しnumPartitions、で指定されているように5つの並列接続があり、バッチサイズを200kにしてみました。 プロセスにかかった合計時間は0:14:05.760926(14分5秒)でした。 時間を短縮する他の効率的なアプローチはありますか? 私が使用できる効率的または最適なバッチサイズは何ですか?バッチサイズを大きくすると、作業が速くなりますか?または、複数の接続を開く、つまり5を超えると、プロセスが速くなりますか? 上千万レコードの平均14分悪くないですが、ヘルプにこの質問に答える前にこれをやっているだろうそこに人を探しています。

3
Spark 2.4.4をインストールした後にpysparkを実行しようとすると「TypeError:integer is required(got type bytes)」エラーを修正する方法
OpenJDK 13.0.1、Python 3.8、Spark 2.4.4をインストールしました。インストールをテストする手順は、sparkインストールのルートから。\ bin \ pysparkを実行することです。いくつかの環境変数の設定など、sparkのインストールの手順を逃したかどうかはわかりませんが、それ以上の詳細な手順は見つかりません。 私は自分のマシンでpythonインタープリターを実行できるので、正しくインストールされ、「java -version」を実行すると期待どおりの応答が得られると確信しているので、どちらにも問題があるとは思いません。 cloudpickly.pyからエラーのスタックトレースを取得します。 Traceback (most recent call last): File "C:\software\spark-2.4.4-bin-hadoop2.7\bin\..\python\pyspark\shell.py", line 31, in <module> from pyspark import SparkConf File "C:\software\spark-2.4.4-bin-hadoop2.7\python\pyspark\__init__.py", line 51, in <module> from pyspark.context import SparkContext File "C:\software\spark-2.4.4-bin-hadoop2.7\python\pyspark\context.py", line 31, in <module> from pyspark import accumulators File "C:\software\spark-2.4.4-bin-hadoop2.7\python\pyspark\accumulators.py", line 97, in …

1
pandasUDFおよびpyarrow 0.15.0
最近pyspark、EMRクラスターで実行されている多数のジョブで多数のエラーが発生し始めました。エラーは java.lang.IllegalArgumentException at java.nio.ByteBuffer.allocate(ByteBuffer.java:334) at org.apache.arrow.vector.ipc.message.MessageSerializer.readMessage(MessageSerializer.java:543) at org.apache.arrow.vector.ipc.message.MessageChannelReader.readNext(MessageChannelReader.java:58) at org.apache.arrow.vector.ipc.ArrowStreamReader.readSchema(ArrowStreamReader.java:132) at org.apache.arrow.vector.ipc.ArrowReader.initialize(ArrowReader.java:181) at org.apache.arrow.vector.ipc.ArrowReader.ensureInitialized(ArrowReader.java:172) at org.apache.arrow.vector.ipc.ArrowReader.getVectorSchemaRoot(ArrowReader.java:65) at org.apache.spark.sql.execution.python.ArrowPythonRunner$$anon$1.read(ArrowPythonRunner.scala:162) at org.apache.spark.sql.execution.python.ArrowPythonRunner$$anon$1.read(ArrowPythonRunner.scala:122) at org.apache.spark.api.python.BasePythonRunner$ReaderIterator.hasNext(PythonRunner.scala:406) at org.apache.spark.InterruptibleIterator.hasNext(InterruptibleIterator.scala:37) at org.apache.spark.sql.execution.python.ArrowEvalPythonExec$$anon$2.<init>(ArrowEvalPythonExec.scala:98) at org.apache.spark.sql.execution.python.ArrowEvalPythonExec.evaluate(ArrowEvalPythonExec.scala:96) at org.apache.spark.sql.execution.python.EvalPythonExec$$anonfun$doExecute$1.apply(EvalPythonExec.scala:127)... それらはすべてapplyパンダシリーズの機能で発生するようです。私が見つけた唯一の変更は、pyarrow土曜日(05/10/2019)に更新されたものです。テストは0.14.1で動作するようです だから私の質問は、これが新しく更新されたpyarrowのバグであるかどうか、またはpandasUDFを将来使用しにくくする重要な変更があるかどうかを誰かが知っているかどうかです。

1
Apache Spark:結合に対する再パーティション化、並べ替え、キャッシュの影響
テーブルをそれ自体に結合するときのSparkの動作を調査しています。Databricksを使用しています。 私のダミーのシナリオは: 外部テーブルをデータフレームAとして読み取ります(基礎となるファイルはデルタ形式です) 特定の列のみが選択されたデータフレームBをデータフレームAとして定義する column1とcolumn2のデータフレームAとBを結合する (はい、あまり意味がありません。Sparkの基礎となるメカニズムを理解するために実験しているだけです) a = spark.read.table("table") \ .select("column1", "column2", "column3", "column4") \ .withColumn("columnA", lower((concat(col("column4"), lit("_"), col("column5"))))) b = a.select("column1", "column2", "columnA") c= a.join(b, how="left", on = ["column1", "column2"]) 私の最初の試みは、コードをそのまま実行することでした(試行1)。次に、パーティションの分割とキャッシュを試みました(2回試行)。 a = spark.read.table("table") \ .select("column1", "column2", "column3", "column4") \ .withColumn("columnA", lower((concat(col("column4"), lit("_"), col("column5"))))) .repartition(col("column1"), col("column2")).cache() 最後に、パーティションを分割し、並べ替え、キャッシュしました a = …

3
Pandasでグループ化されたDataFrameにPython関数を適用する-計算を高速化するための最も効率的なアプローチは何ですか?
私は非常に大きなPandas DataFrameを処理しています-私のデータセットは次のdf設定に似ています: import pandas as pd import numpy as np #--------------------------------------------- SIZING PARAMETERS : R1 = 20 # .repeat( repeats = R1 ) R2 = 10 # .repeat( repeats = R2 ) R3 = 541680 # .repeat( repeats = [ R3, R4 ] ) R4 = 576720 # .repeat( repeats …

1
Spark:UDFが何度も実行された
次のコードのデータフレームがあります。 def test(lat: Double, lon: Double) = { println(s"testing ${lat / lon}") Map("one" -> "one", "two" -> "two") } val testUDF = udf(test _) df.withColumn("test", testUDF(col("lat"), col("lon"))) .withColumn("test1", col("test.one")) .withColumn("test2", col("test.two")) ログを確認したところ、行ごとにUDFが3回実行されていることがわかりました。「test.three」列から「test3」を追加すると、UDFがもう一度実行されます。 なぜ誰かが私に理由を説明できますか? これは適切に回避できますか?
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.