The row format is used to append data to part files record by record. When you implement Encoder interface, you can decide how to serialise record into bytes and write the bytes into the OutputStream of current part file. At the moment I do not see any facility classes in Flink code base which would implement Encoder interface for writing Avro records but I think it can be implemented using standard Avro utilities.
The bulk format is used to serialise and append a batch of records to part files. When you implement BulkWriter.Factory and BulkWriter interface, you can decide what to do with each record, when to finish the batch and write it into the OutputStream of current part file. Premature writing of buffered records should happen if BulkWriter.flush method is called, e.g. when part file is finished. Flink already comes with BulkWriters to write Avro records in parquet format provided by ParquetAvroWriters class.
Feel free to ask more specific questions. I will also cc Kostas who might give more implementation details.