Langkah-langkah partisi jarak jauh admin batch musim semi menjalankan maksimum 8 utas meskipun konkurensi 10?

Saya menggunakan partisi jarak jauh batch pegas untuk proses batch. Saya meluncurkan pekerjaan menggunakan admin batch musim semi.

Saya memiliki langkah konkurensi konsumen gateway masuk ke 10 tetapi jumlah maksimum partisi yang berjalan secara paralel adalah 8.

Saya ingin meningkatkan konkurensi konsumen menjadi 15 nanti.

Di bawah ini adalah konfigurasi saya,

<task:executor id="taskExecutor" pool-size="50" />

<rabbit:template id="computeAmqpTemplate"
    connection-factory="rabbitConnectionFactory" routing-key="computeQueue"
    reply-timeout="${compute.partition.timeout}">
</rabbit:template>

<int:channel id="computeOutboundChannel">
    <int:dispatcher task-executor="taskExecutor" />
</int:channel>

<int:channel id="computeInboundStagingChannel" />

<amqp:outbound-gateway request-channel="computeOutboundChannel"
    reply-channel="computeInboundStagingChannel" amqp-template="computeAmqpTemplate"
    mapped-request-headers="correlationId, sequenceNumber, sequenceSize, STANDARD_REQUEST_HEADERS"
    mapped-reply-headers="correlationId, sequenceNumber, sequenceSize, STANDARD_REQUEST_HEADERS" />


<beans:bean id="computeMessagingTemplate"
    class="org.springframework.integration.core.MessagingTemplate"
    p:defaultChannel-ref="computeOutboundChannel"
    p:receiveTimeout="${compute.partition.timeout}" />


<beans:bean id="computePartitionHandler"
    class="org.springframework.batch.integration.partition.MessageChannelPartitionHandler"
    p:stepName="computeStep" p:gridSize="${compute.grid.size}"
    p:messagingOperations-ref="computeMessagingTemplate" />

<int:aggregator ref="computePartitionHandler"
    send-partial-result-on-expiry="true" send-timeout="${compute.step.timeout}"
    input-channel="computeInboundStagingChannel" />

<amqp:inbound-gateway concurrent-consumers="${compute.consumer.concurrency}"
    request-channel="computeInboundChannel" 
    reply-channel="computeOutboundStagingChannel" queue-names="computeQueue"
    connection-factory="rabbitConnectionFactory"
    mapped-request-headers="correlationId, sequenceNumber, sequenceSize, STANDARD_REQUEST_HEADERS"
    mapped-reply-headers="correlationId, sequenceNumber, sequenceSize, STANDARD_REQUEST_HEADERS" />


<int:channel id="computeInboundChannel" />

<int:service-activator ref="stepExecutionRequestHandler"
    input-channel="computeInboundChannel" output-channel="computeOutboundStagingChannel" />

<int:channel id="computeOutboundStagingChannel" />

<beans:bean id="computePartitioner"
    class="org.springframework.batch.core.partition.support.MultiResourcePartitioner"
    p:resources="file:${spring.tmp.batch.dir}/#{jobParameters[batch_id]}/shares_rics/shares_rics_*.txt"
    scope="step" />



<beans:bean id="computeFileItemReader"
    class="org.springframework.batch.item.file.FlatFileItemReader"
    p:resource="#{stepExecutionContext[fileName]}" p:lineMapper-ref="stLineMapper"
    scope="step" />

<beans:bean id="computeItemWriter"
    class="com.st.batch.foundation.writers.ComputeItemWriter"
    p:symfony-ref="symfonyStepScoped" p:timeout="${compute.item.timeout}"
    p:batchId="#{jobParameters[batch_id]}" scope="step" />


<step id="computeStep">
    <tasklet transaction-manager="transactionManager">
        <chunk reader="computeFileItemReader" writer="computeItemWriter"
            commit-interval="${compute.commit.interval}" />
    </tasklet>
</step>

<flow id="computeFlow">
    <step id="computeStep.master">
        <partition partitioner="computePartitioner"
            handler="computePartitionHandler" />
    </step>
</flow>

<job id="computeJob" restartable="true">
    <flow id="computeJob.computeFlow" parent="computeFlow" />
</job>



compute.grid.size = 112
compute.consumer.concurrency = 10

Input files are splited to 112 equal parts = compute.grid.size = total number of partitions

Number of servers = 4.

Ada 2 masalah,

i) Meskipun saya telah menyetel konkurensi ke 10, jumlah maksimum thread yang berjalan adalah 8.

ii)

ada yang lebih lambat karena proses lain berjalan di dalamnya dan ada pula yang lebih cepat jadi saya ingin memastikan langkah eksekusi didistribusikan secara adil yaitu jika server yang lebih cepat selesai dengan eksekusinya, eksekusi lain yang tersisa dalam antrian harus diberikan kepada mereka. Ini tidak boleh didistribusikan secara round robbin.

Saya tahu di Rabbitmq ada pengaturan hitungan prefetch dan mode ack untuk mendistribusikan tarif. Untuk integrasi pegas, hitungan prefetch adalah 1 default dan mode ack adalah AUTO secara default. Namun masih ada beberapa server yang tetap menjalankan lebih banyak partisi meskipun server lain sudah selesai dalam waktu lama. Idealnya tidak ada server yang menganggur.

Pembaruan:

Satu hal lagi yang sekarang saya amati adalah, untuk beberapa langkah yang berjalan secara paralel menggunakan split (tidak didistribusikan menggunakan partisi jarak jauh) juga dijalankan maksimal 8 secara paralel. Ini terlihat seperti masalah batas kumpulan utas tetapi seperti yang Anda lihat taskExecutor memiliki ukuran kumpulan yang disetel ke 50.

Apakah ada sesuatu di spring-batch/spring-batch-admin yang membatasi jumlah langkah yang berjalan secara bersamaan?

Pembaruan ke-2:

Dan, jika ada 8 atau lebih thread yang berjalan dalam item pemrosesan paralel, admin batch pegas tidak memuat. Itu hanya hang. Jika saya mengurangi konkurensi, admin batch musim semi akan memuat. Saya bahkan mengujinya dengan mengatur konkurensi 4 di satu server dan 8 di server lain, admin batch musim semi tidak memuatnya. Saya menggunakan URL server tempat 8 utas berjalan tetapi berfungsi di server tempat 4 utas berjalan.

Manajer admin batch musim semi memiliki konfigurasi jobLauncher di bawah,

<bean id="jobLauncher" class="org.springframework.batch.core.launch.support.SimpleJobLauncher">
    <property name="jobRepository" ref="jobRepository" />
    <property name="taskExecutor" ref="jobLauncherTaskExecutor" />
</bean>

<task:executor id="jobLauncherTaskExecutor" pool-size="6" rejection-policy="ABORT" />

Ukuran kolamnya ada 6, ada hubungannya dengan masalah di atas?

Atau adakah sesuatu di Tomcat 7 yang membatasi jumlah utas yang berjalan hingga 8?


person vishal    schedule 04.07.2014    source sumber
comment
Hai Vishal, saya memiliki masalah yang sama. Apakah Anda sudah menyelesaikan masalah ini? Jika iya, bolehkah saya tahu apa solusi Anda.....   -  person The Guest    schedule 19.09.2016


Jawaban (2)


Apakah Anda menggunakan database untuk JobRepository?

Selama eksekusi, kerangka batch mempertahankan eksekusi langkah dan jumlah koneksi ke database JobRepository dapat mengganggu eksekusi langkah paralel.

Konkurensi 8 membuat saya berpikir Anda mungkin menggunakan BasicDataSource? Jika demikian, beralihlah ke sesuatu seperti DriverManagerDataSource dan lihat.

person Parag Kutarekar    schedule 24.05.2016

Bingung - Anda berkata "Saya telah menyetel konkurensi ke 10" tetapi kemudian tampilkan compute.consumer.concurrency = 8. Jadi itu berfungsi seperti yang dikonfigurasi. Tidak mungkin hanya memiliki 8 thread konsumen jika properti disetel ke 10.

Dari sudut pandang Rabbit, semua konsumen adalah sama - jika ada 10 konsumen di kotak lambat dan 10 konsumen di kotak cepat, dan Anda hanya memiliki 10 partisi, ada kemungkinan bahwa 10 partisi tersebut akan berakhir di kotak lambat.

RabbitMQ tidak mendistribusikan pekerjaan ke seluruh server, ia mendistribusikan pekerjaan ke seluruh konsumen saja.

Anda mungkin mendapatkan distribusi yang lebih baik dengan mengurangi konkurensi. Anda juga harus mengatur konkurensi lebih rendah pada kotak yang lebih lambat.

person Gary Russell    schedule 04.07.2014
comment
maaf atas kesalahan ketik pada pertanyaan. Nilai dalam konfigurasi saya sebenarnya adalah 10. - person vishal; 04.07.2014
comment
Ya, saya menetapkan konkurensi lebih rendah. Namun idealnya, jika konsumen di server yang lebih lambat sedang sibuk, pesan harus diambil oleh konsumen di server lain, sepertinya konsumen di server yang lebih lambat tetap menerima pesan meskipun konsumen di server yang lebih cepat sedang duduk diam. - person vishal; 04.07.2014
comment
pertanyaan yang diperbarui dengan info lebih lanjut, masalah spring-batch/spring-batch-admin - person vishal; 04.07.2014
comment
Jika concurrent-consumers adalah 10 maka akan ada 10 thread. Periode. Tidak ada apa pun di SI/SB yang membatasinya hingga 8. Seperti yang saya katakan, Rabbit tidak tahu apakah konsumen berikutnya berada di server sibuk atau menganggur. Sepertinya Anda memiliki terlalu banyak konsumen yang memenuhi kebutuhan Anda. Jika beberapa pekerjaan batch memerlukan lebih banyak partisi dibandingkan yang lain, pertimbangkan untuk menggunakan konfigurasi yang berbeda. - person Gary Russell; 05.07.2014
comment
Idealnya, ini harus berjalan 10 tetapi tidak. Saya menambahkan satu pengamatan lagi. - person vishal; 07.07.2014