Lielu failu lejupielāde no HDFS
Es saņēmu lielu failu (apmēram 2 GB) DataInputStream no HDFS klienta, un man tas ir jāsaglabā kā fails savā resursdatorā.
Es domāju izmantot apache parastos IOUtils un darīt kaut ko līdzīgu......
Es meklēju citus risinājumus, kas ir labāki par šo. Galvenās bažas ir buferizācijas izmantošana ievadē un IOUtils.copy.
Failiem, kas lielāki par 2 GB, ieteicams izmantot IOUtils.copyLarge() (ja mēs runājam par to pašu IOUtils: org.apache.commons.io.IOUtils)
IOUtils replika izmanto noklusējuma bufera lielumu 4Kb (lai gan kā parametru var norādīt citu bufera lielumu).
Atšķirība starp copy() un copyLarge() ir tāda, ka tā atgriež rezultātu.
Tā kā copy(), ja straume ir lielāka par 2 GB, jūs veiksmīgi izmantosiet kopiju, bet rezultāts ir -1.
CopyLarge() rezultāts ir pilnībā kopēto baitu skaits.
Skatīt vairāk dokumentācijā šeit:
Hipersaites pieteikšanās ir redzama.
Kā pārbaudīt, vai fails ir pilnībā lejupielādēts, izmantojot Spring Rest API
Es izveidoju vienkāršu REST API, lai apkalpotu failus no hdfs (faili ir lieli, un es nevēlos tos kopēt lokāli).
Es vēlos reģistrēt informāciju, ka faila lejupielāde ir veiksmīgi pabeigta, t.i. izlasīt visu straumi, bet es nezinu, kā. Es varu ierakstīt tikai informāciju, ka sākās faila lejupielāde.
Jebkura palīdzība būtu ļoti pateicīga.
Jūs varat mēģināt izveidot iesaiņojumu InputStream un aktivizēt dažus karodziņus straumē close(close()).
Piemēram, par pamatu var izmantot ProxyInputStream:
|