Avro tables that use "external" schema files stored on HDFS can cause excessive calls to FileSystem::open(), especially for queries that spawn large numbers of mappers.
This is because of the following code in AvroSerDe::initialize():
For tables using avro.schema.url, every time the SerDe is initialized (i.e. at least once per mapper), the schema file is read remotely. For queries with thousands of mappers, this leads to a stampede to the handful (3?) datanodes that host the schema-file. In the best case, this causes slowdowns.
It would be preferable to distribute the Avro-schema to all mappers as part of the job-conf. The alternatives aren't exactly appealing:
- One can't rely solely on the column.list.types stored in the Hive metastore. (HIVE-14789).
- avro.schema.literal might not always be usable, because of the size-limit on table-parameters. The typical size of the Avro-schema file is between 0.5-3MB, in my limited experience. Bumping the max table-parameter size isn't a great solution.
If the avro.schema.file were read during query-planning, and made available as part of table-properties (but not serialized into the metastore), the downstream logic will remain largely intact. I have a patch that does this.