我在使用Google云端存储连接器的Google Compute Engine群集上使用Spark(而不是HDFS,如recommended),并获得了很多"速率限制"错误,如下:
java.io.IOException: Error inserting: bucket: *****, object: *****
at com.google.cloud.hadoop.gcsio.GoogleCloudStorageImpl.wrapException(GoogleCloudStorageImpl.java:1600)
at com.google.cloud.hadoop.gcsio.GoogleCloudStorageImpl$3.run(GoogleCloudStorageImpl.java:475)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)
Caused by: com.google.api.client.googleapis.json.GoogleJsonResponseException: 429 Too Many Requests
{
"code" : 429,
"errors" : [ {
"domain" : "usageLimits",
"message" : "The total number of changes to the object ***** exceeds the rate limit. Please reduce the rate of create, update, and delete requests.",
"reason" : "rateLimitExceeded"
} ],
"message" : "The total number of changes to the object ***** exceeds the rate limit. Please reduce the rate of create, update, and delete requests."
}
at com.google.api.client.googleapis.json.GoogleJsonResponseException.from(GoogleJsonResponseException.java:145)
at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:113)
at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:40)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:432)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:352)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:469)
at com.google.cloud.hadoop.gcsio.GoogleCloudStorageImpl$3.run(GoogleCloudStorageImpl.java:472)
... 3 more
任何人都知道有任何解决方案吗?
有没有办法控制Spark的读/写速率?
有没有办法提高我的Google项目的费率限制?
有没有办法将本地硬盘用于不具备的临时文件 与其他奴隶分享?
谢谢!
答案 0 :(得分:3)
不幸的是,当设置为DEFAULT_FS时,GCS的使用会弹出高速率的目录对象创建,无论是将其用于中间目录还是用于最终输入/输出目录。特别是对于使用GCS作为最终输出目录,很难应用任何Spark端解决方法来降低冗余目录创建请求的速率。
好消息是,大多数这些目录请求确实是多余的,只是因为系统习惯于能够基本上" mkdir -p",并且如果目录已经存在则廉价地返回true。在我们的例子中,可以通过捕获这些错误然后检查目录是否确实是由竞争条件下的其他工作人员创建来在GCS连接器端修复它。
修复此问题要测试,只需运行:
git clone https://github.com/GoogleCloudPlatform/bigdata-interop.git
cd bigdata-interop
mvn -P hadoop1 package
# Or or Hadoop 2
mvn -P hadoop2 package
你应该找到文件&#34; gcs / target / gcs-connector - * - shaded.jar&#34;可供使用。要将其插入bdutil,只需gsutil cp gcs/target/gcs-connector-*shaded.jar gs://<your-bucket>/some-path/
,然后为Hadoop 1或bdutil/bdutil_env.sh
修改bdutil/hadoop2_env.sh
即可更改:
GCS_CONNECTOR_JAR='https://storage.googleapis.com/hadoop-lib/gcs/gcs-connector-1.4.1-hadoop2.jar'
改为指向gs://<your-bucket>/some-path/
路径; bdutil会自动检测到您使用的是gs://
前缀URI,并会在部署过程中做正确的事情。
请告诉我们是否能解决问题!
答案 1 :(得分:0)
您是否尝试过设置spark.local.dir配置参数并将该tmp空间的磁盘(首选SSD)附加到Google Compute Engine实例?
https://spark.apache.org/docs/1.2.0/configuration.html
您无法更改项目的速率限制,一旦达到限制,您必须使用的是退避算法。由于您提到大多数读/写都是针对tmp文件的,因此请尝试将Spark配置为使用本地磁盘。