寻找Spark理解......
我正在将大量数据从MySQL加载到Spark中,并且它一直在死: - (
org.apache.spark.SparkException: Job aborted.
at org.apache.spark.sql.execution.datasources.InsertIntoHadoopFsRelation$$anonfun$run$1.apply$mcV$sp(InsertIntoHadoopFsRelation.scala:156)
at org.apache.spark.sql.execution.datasources.InsertIntoHadoopFsRelation$$anonfun$run$1.apply(InsertIntoHadoopFsRelation.scala:108)
at org.apache.spark.sql.execution.datasources.InsertIntoHadoopFsRelation$$anonfun$run$1.apply(InsertIntoHadoopFsRelation.scala:108)
at org.apache.spark.sql.execution.SQLExecution$.withNewExecutionId(SQLExecution.scala:56)
at org.apache.spark.sql.execution.datasources.InsertIntoHadoopFsRelation.run(InsertIntoHadoopFsRelation.scala:108)
这是我的代码
val query =
s"""
(
select
mod(act.AccountID, ${parts}) part,
p.Value name, event.EventTime eventTime, act.AccountID accountID, act.UserGoal goalID,event.ActivityID activityID, id.CountryID countryID, arr.ConsumerID consumerID
from DimIdentity as id
join FactArrival as arr on arr.IdentityID=id.IdentityID
join FactActivityEvent as event on event.ArrivalID=arr.ArrivalID
join DimAccount as act on act.AccountID=event.AccountID
join DimAccountRoleTypeMatch as role on role.AccountID=act.AccountID
join DimDateTime as d on event.DateTimeID=d.DateTimeID
join DimProperty as p on p.PropertyID=event.EventTypeID
where
id.Botness=0 and
d.DayOfYear>=${from} and d.DayOfYear<${to} and d.Year=${year} and
(role.AccountRoleTypeID=1 or role.AccountRoleTypeID=2)
) a
""".stripMargin
val events = sqlContext.read.format("jdbc").
option("url", sqlURL).
option("driver", "com.mysql.jdbc.Driver").
option("useUnicode", "true").
option("zeroDateTimeBehavior", "round").
option("continueBatchOnError", "true").
option("useSSL", "false").
option("dbtable", query).
option("user", sqlUser).
option("password", sqlPassword).
option("partitionColumn", "part").
option("lowerBound", "0").
option("upperBound", s"${parts - 1}").
option("numPartitions", s"${parts}").
load().as[Activity].toDF
请注意,我正在使用其他答案中建议的partitionColumn,lowerBound,upperBound,numPartitions
我尝试将分区设置为4到512,但它总是会死掉。从文件或Mongo读取相同数量的数据没有问题。这是MySQL连接器的问题吗?有解决方案吗?
请注意,我发现一个答案表明我避免使用Spark,并将查询读入HDFS中的文件,然后加载文件
Multiple Partitions in Spark RDD
这真的是最好的方式吗?
答案 0 :(得分:1)
这是我得到的答案......
对我来说,答案是避免Spark的mysql连接:-(我发现很难避免分区造成的崩溃.Myql连接需要手动调整分区,并且不会产生任何增加编写非Spark代码,将数据读入大文本文件,以及在文本文件上调用Spark,更容易。对于大多数数据源,Spark非常好,但不是mysql ...至少还没有
答案 1 :(得分:0)
您可以尝试增加获取大小而不使用动态分区进行读取。
sqlContext.read.options(options).jdbc(
url=sqlURL, table=query, columnName="part",
fetchSize=1000000,connectionProperties=new java.util.Properties())
答案 2 :(得分:0)
您可以通过更改具有限制偏移量的 sql 查询来读取数据。然后使用 shell 脚本使用 for 循环自动执行任务。这对我有用