3

EMPLOYEEなどの単一のエンティティで約28,000の「行」を保持しようとしています

基本的に、私の目標は、30 秒を超える PUT を使用して終了/タイムアウトを回避することです。これは、サーブレットに送信された doPost() 要求を呼び出して 28,000 PUT を実行した場合に発生する可能性があることです。

そこで、Google App Engine のドキュメントに記載されているタスクを使用することを考えています。

基本的に、28,000 人の「従業員」を含む war ディレクトリに csv ファイルをアップロードしたいと考えています。次に、これらの 28,000 の従業員行を EMPLOYEE エンティティに非同期 PUT するタスクを作成します。

  • Q1: これは実行可能な解決策ですか、それとももっと良い方法がありますか? 繰り返しますが、目標は PUT を実行して、30 秒の制限による終了を回避することです。

  • Q2: また、これらの PUT をできるだけ速く実行できるようにするには、どの queue.xml 構成を使用すればよいですか?

  • Q3: 今、ブログ エントリと同様に試してみました: http://gaejexperiments.wordpress.com/2009/11/24/episode-10-using-the-task-queue-service/しかし、私は取得しています23 秒ほど後に次のエラーが表示されます。

    SEVERE: Job default.task1 threw an unhandled Exception: 
    com.google.apphosting.api.ApiProxy$ApplicationException: ApplicationError: 5: http method POST against URL http://127.0.0.1:8888/dotaskservlet timed out.
        at com.google.appengine.api.urlfetch.dev.LocalURLFetchService.fetch(LocalURLFetchService.java:236)
        at com.google.appengine.api.taskqueue.dev.LocalTaskQueue$UrlFetchServiceLocalTaskQueueCallback.execute(LocalTaskQueue.java:471)
        at com.google.appengine.api.taskqueue.dev.UrlFetchJob.execute(UrlFetchJob.java:77)
        at org.quartz.core.JobRunShell.run(JobRunShell.java:203)
        at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:520)
    16/02/2011 12:12:55 PM org.quartz.core.ErrorLogger schedulerError
    SEVERE: Job (default.task1 threw an exception.
    org.quartz.SchedulerException: Job threw an unhandled exception. [See nested exception: com.google.apphosting.api.ApiProxy$ApplicationException: ApplicationError: 5: http method POST against URL http://127.0.0.1:8888/dotaskservlet timed out.]
        at org.quartz.core.JobRunShell.run(JobRunShell.java:214)
        at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:520)
    * Nested Exception (Underlying Cause) ---------------
    com.google.apphosting.api.ApiProxy$ApplicationException: ApplicationError: 5: http method POST against URL http://127.0.0.1:8888/dotaskservlet timed out.
        at com.google.appengine.api.urlfetch.dev.LocalURLFetchService.fetch(LocalURLFetchService.java:236)
        at com.google.appengine.api.taskqueue.dev.LocalTaskQueue$UrlFetchServiceLocalTaskQueueCallback.execute(LocalTaskQueue.java:471)
        at com.google.appengine.api.taskqueue.dev.UrlFetchJob.execute(UrlFetchJob.java:77)
        at org.quartz.core.JobRunShell.run(JobRunShell.java:203)
        at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:520)
    
  • Q4: http://localhost:8888/_ah/adminで Datastore Viewer も確認しましたが、そのエンティティには 1000 件の結果しか作成されていないようです。1000枚が限界?

  • Q5: 上記のエラーを取り除くにはどうすればよいですか?

  • Q6: タスクの最大許容時間が 10 分であることを確認できますか? それともまだ30秒ですか?私はこれに出くわしました:http://code.google.com/appengine/docs/java/taskqueue/overview.html#Task_Execution

4

3 に答える 3

2

mapreduce を使用して CSV ファイルを解析する例/チュートリアルを次に示します。これは、ニーズに似ているようです。

http://ikaisays.com/2010/08/11/using-the-app-engine-mapper-for-bulk-data-import/

于 2011-02-17T00:02:08.823 に答える
0

DeferredTaskこれは、おおよそ次のような一括保存で行います。

List<Employee> employees=...
EmployeeWriter qr = new EmployeeWriter (employees);
TaskHandle task = QueueFactory.getDefaultQueue().add(withPayload(qr));

どこ

public class EmployeeWriter implements DeferredTask {
   public EmployeeWriter () {    }
   public EmployeeWriter (List<Employee> employees) { 
          this.employees=new LinkedList(employees);  
   }

    private LinkedList<Employee> employees;

    @Override
    public void run() {
      Stopwatch sw = Stopwatch.createStarted();
      try {
        do {
           List employeesTosave=Pull100EmployeesFromLinkedList(employees)
           ofy().save(employeesTosave).now();

        } while (sw.elapsed(TimeUnit.MINUTES) < 9);
     finally {
        sw.stop();
        if (!employees.isEmpty()) {
            QueueFactory.getDefaultQueue().add(withPayload(this));
        }
    }

}
于 2013-10-31T20:12:57.107 に答える
0

あなたの目標が大量のデータを自分でアップロードすることだけであり、ユーザーにアップロードを許可しない場合は、一括アップローダーがより簡単なツールになると思います. 要求の制限と障害回復を処理する Python プログラムをローカル マシンから実行するだけで済みます。

http://ikaisays.com/2010/06/10/using-the-bulkloader-with-java-app-engine/

于 2011-02-16T14:08:20.437 に答える