我正在設置火花流光與kinesis和紅移。我每10秒鐘從kinesis讀取數據,處理它,並使用spark-redshift lib將它寫入紅移。火花紅移花費很多時間寫紅移
問題是它只花了很多時間只寫了300行。
這就是它顯示我在控制檯
[Stage 56:====================================================> (193 + 1)/200]
看我的日誌df.write.format是這樣做的。
我在帶有4GB內存和2個核心的亞馬遜EC2的機器上運行spark-setup,使用--master local [*]模式運行。
這是我如何創建流
kinesisStream = KinesisUtils.createStream(ssc, APPLICATION_NAME, STREAM_NAME, ENDPOINT, REGION_NAME, INITIAL_POS, CHECKPOINT_INTERVAL, awsAccessKeyId =AWSACCESSID, awsSecretKey=AWSSECRETKEY, storageLevel=STORAGE_LEVEL)
CHECKPOINT_INTERVAL = 60
storageLevel = memory
kinesisStream.foreachRDD(writeTotable)
def WriteToTable(df, type):
if type in REDSHIFT_PAGEVIEW_TBL:
df = df.groupby([COL_STARTTIME, COL_ENDTIME, COL_CUSTOMERID, COL_PROJECTID, COL_FONTTYPE, COL_DOMAINNAME, COL_USERAGENT]).count()
df = df.withColumnRenamed('count', COL_PAGEVIEWCOUNT)
# Write back to a table
url = ("jdbc:redshift://" + REDSHIFT_HOSTNAME + ":" + REDSHIFT_PORT + "/" + REDSHIFT_DATABASE + "?user=" + REDSHIFT_USERNAME + "&password="+ REDSHIFT_PASSWORD)
s3Dir = 's3n://' + AWSACCESSID + ':' + AWSSECRETKEY + '@' + BUCKET + '/' + FOLDER
print 'Start writing to redshift'
df.write.format("com.databricks.spark.redshift").option("url", url).option("dbtable", REDSHIFT_PAGEVIEW_TBL).option('tempdir', s3Dir).mode('Append').save()
print 'Finished writing to redshift'
請讓我知道採取這一多時間
不要只寫3行的東西需要4分鐘左右的時間很多。此外,即使我有5000行寫,仍然4分鐘是很多時間 – Nipun
哇,我沒有意識到它花了那麼長時間。在這種情況下,可能發生的情況是分區太多(從上面的輸出中可以看出這種情況)。這可能會導致從機器寫入S3的瓶頸。我不確定這是否適用於流媒體,但對於常規的spark工作,如df.coalesce(1).write.format(「com.databricks.spark.redshift」)。option(「url」,url)。選項(「dbtable」,REDSHIFT_PAGEVIEW_TBL)。選項('tempdir',s3Dir).mode('Append')。save()會起作用。你可以玩分區的數量來合併。 – DemetriKots
我嘗試過,使用coalesce(4)和緩存,但它花費了相同的時間。這很奇怪,但是4分鐘就像寫了10條記錄或1000條記錄一樣。我嘗試聯繫AWS,但它也沒有幫助。嘗試從s3直接加載csv到紅移使用命令,看看是否需要時間,但這也是幾秒鐘。 – Nipun