Utilisation d'Apache Avro
Apache Avro fournit des services de sérialisation et d'échange de données pour Apache Hadoop.
Problèmes d'incompatibilité
Données/Schéma
Si le schéma a une valeur par défaut telle que "null" (avec guillemets) au lieu de null (sans guillemets), la validation du schéma échoue.
Nous recommandons de corriger le schéma pour utiliser nul (sans guillemets). Pour plus de renseignements, consultez la page https://issues.apache.org/jira/browse/AVRO-2509.
Incompatibilité API
Tous les accès aux champs sont effectués par des méthodes setter/getter. Le code généré par Avro à partir des paramètres de schéma est différent dans Avro 1.8.2/1.9 par rapport à Avro 1.11.3. Par exemple, counters.groups par rapport à counters.getGroups.
Pour convertir les objets sérialisables, les paquets dans lesquels ils se trouvent doivent être déclarés dans la propriété de système org.apache.avro.SERIALIZABLE_PACKAGE
.
Modifiez le code d'application en recompilant avant d'utiliser Avro 1.11.3 et identifiez tous les ensembles qui doivent être répertoriés dans
org.apache.avro.SERIALIZABLE_PACKAGE
.Pour utiliser une version Avro spécifique : Lien vers le dossier d'exploitation
- Placez la version Avro personnalisée dans un dossier distinct et utilisez le même dossier lors de la candidature.
Utiliser des versions Avro personnalisées dans les composants
MR Hadoop
Étapes d'utilisation d'une version Avro personnalisée
Les fichiers JAR AVRO doivent être présents à la fois dans HADOOP_CLASSPATH
et avec le fichier JAR -libjars
.
Exemple :
export HADOOP_CLASSPATH="$(hadoop classpath):/path/to/avro-1.8.2.jar:/path/to/avro-mapred-1.8.2.jar
hadoop jar avro2.jar AvroTest -libjars /path/to/avro-1.8.2.jar:/path/to/avro-ipc-1.8.2.jar:/path/to/avro-mapred-1.8.2-hadoop2.jar <args>
Sqoop
Étapes d'utilisation d'une version Avro personnalisée
Les fichiers JAR AVRO doivent être présents à la fois dans HADOOP_CLASSPATH
et avec le fichier JAR -libjars
.
Exemple :
Oozie
- Sqoop ne prend pas en charge la transmission dynamique des fichiers JAR lors de l'exécution.
- Vous devez placer explicitement les fichiers JAR
avro-1.8.2
dans la bibliothèque Sqoop (/usr/lib/sqoop/lib
).
Spark
Étapes d'utilisation d'une version Avro personnalisée
Vous devez ajouter le chemin des fichiers JAR Avro à mapreduce.application.classpath
.
Exemple :
mapreduce.application.classpath = $PWD/mr-framework/hadoop/share/hadoop/mapreduce/*:...:/path/to/avro-1.8.2.jar:/path/to/avro-ipc-1.8.2.jar:/path/to/avro-mapred-1.8.2-hadoop2.jar
Spark
Étapes d'utilisation d'une version Avro personnalisée
Vous devez ajouter le chemin des fichiers JAR Avro au moyen de --jars
et --files
.
Exemple :
spark-submit \
--class AvroWordCount \
--master yarn \
--deploy-mode client \
--name "WordCount Avro Java Example" \
--conf spark.executor.memory=2g \
--conf spark.executor.cores=2 \
--conf spark.executor.instances=2 \
--conf spark.driver.memory=1g \
--jars /path/to/avro-1.8.2.jar:/path/to/avro-ipc-1.8.2.jar:/path/to/avro-mapred-1.8.2-hadoop2.jar \
avro-test.jar \
--files /path/to/avro-1.8.2.jar:/path/to/avro-ipc-1.8.2.jar:/path/to/avro-mapred-1.8.2-hadoop2.jar \
hdfs:///user/ambari-qa/input/sample.avro \
hdfs:///user/ambari-qa/output25
Hive
Étapes d'utilisation d'une version Avro personnalisée
- Hive ne prend pas en charge la transmission dynamique de fichiers JAR lors de l'exécution.
- Doit explicitement placer les fichiers JAR
avro-1.8.2
dans la bibliothèque Hive(/usr/lib/hive/lib
).
Exemple :
CREATE TABLE users_from_avro_schema STORED AS AVRO TBLPROPERTIES ('avro.schema.url'='hdfs://rpavro1nha-mn0.bdsdnstest.bdsclitest.oraclevcn.com:8020/user/yarn/text_schema.avsc');
LOAD DATA INPATH '/user/yarn/sample.avro' INTO TABLE users_from_avro_schema;
Flume
Étapes d'utilisation d'une version Avro personnalisée
Vous devez spécifier les anciens fichiers JAR Avro dans HADOOP_CLASSPATH
.
Exemple :
> export HADOOP_CLASSPATH="/usr/lib/flume/lib/path/to/avro-1.10.2.jar*:$(hadoop classpath)"
> flume-ng agent -n MY_AGENT -f flume.conf -Dflume.root.logger=INFO,console
#list hdfs sources
MY_AGENT.sources = my-source
MY_AGENT.channels = my-channel
MY_AGENT.sinks = my-sink
#source
MY_AGENT.sources.my-source.type = org.apache.flume.source.kafka.KafkaSource
MY_AGENT.sources.my-source.channels = my-channel
MY_AGENT.sources.my-source.batchSize = 10000
MY_AGENT.sources.my-source.batchDurationMillis = 5000
MY_AGENT.sources.my-source.kafka.bootstrap.servers = rpavro2nha-wn1.bdsdnstest.bdsclitest.oraclevcn.com:6667
MY_AGENT.sources.my-source.kafka.topics = truck_events_stream
MY_AGENT.sources.my-source.kafka.consumer.group.id = truck_events_streamgrp_1
MY_AGENT.sources.my-source.kafka.consumer.client.id = truck_events_stream_clnt_1
MY_AGENT.sources.my-source.kafka.auto.commit.enable = true
MY_AGENT.sources.my-source.kafka.consumer.session.timeout.ms=100000
MY_AGENT.sources.my-source.kafka.consumer.request.timeout.ms=120000
MY_AGENT.sources.my-source.kafka.consumer.auto.offset.reset=earliest
#channel
MY_AGENT.channels.my-channel.type = memory
MY_AGENT.channels.my-channel.capacity = 100000000
MY_AGENT.channels.my-channel.transactionCapacity = 100000
MY_AGENT.channels.my-channel.parseAsFlumeEvent = false
#Sink
MY_AGENT.sinks.my-sink.type = hdfs
MY_AGENT.sinks.my-sink.channel = my-channel
MY_AGENT.sinks.my-sink.hdfs.writeFormat= Text
MY_AGENT.sinks.my-sink.hdfs.fileType = DataStream
MY_AGENT.sinks.my-sink.hdfs.useLocalTimeStamp = true
MY_AGENT.sinks.my-sink.hdfs.path = hdfs://rpavro2nha/user/flume/flume-output
MY_AGENT.sinks.my-sink.hdfs.rollCount=0
MY_AGENT.sinks.my-sink.hdfs.rollSize=0
MY_AGENT.sinks.my-sink.hdfs.batchSize=100000
MY_AGENT.sinks.my-sink.hdfs.maxOpenFiles=2000
MY_AGENT.sinks.my-sink.hdfs.callTimeout=50000
MY_AGENT.sinks.my-sink.hdfs.fileSuffix=.avro
MY_AGENT.sinks.my-sink.serializer = org.apache.flume.sink.hdfs.AvroEventSerializer$Builder
MY_AGENT.sinks.my-sink.serializer.schemaURL = hdfs:///user/flume/truck_events.avsc
> /usr/lib/kafka/bin/kafka-console-producer.sh \ --bootstrap-server hostname:6667 \
--topic truck_events_stream
> {"driverId": 1001, "truckId": 101, "eventTime": "2025-04-01T12:35:00", "eventType": "NORMAL", "latitude": 37.7749, "longitude": -122.4194, "eventKey": "NORM-1001-101", "correlationId": "c1001", "driverName": "John Smith", "routeId": 5001, "routeName": "Bay Area Express", "eventDate": "2025-04-01", "miles": 125}