Análise de sentimento com Flume e Twitter
PRIMEIRA PARTE
Link da documentação oficial do Hadoop:
http://hadoop.apache.org/
Link do meu Github:
https://github.com/toticavalcanti
AVISO:
As 3 aulas a seguir referentes a Análise de sentimento com Flume e Twitter, infelizmente não funciona mais na prática, a máquina cloudera usada na aula ficou desatualizada e foi descontinuada pela empresa.
Mantenho essas aulas na playlist como documentação da experiência realizada.
CONFIGURAÇÃO APP TWITTER
Acessar o endereço abaixo e criar uma App:
https://apps.twitter.com/
Criar login, senha e logar
Criar uma nova App clicando em Create New App
Definir os detalhes da aplicação: nome, descrição, website, etc
Clicar em Create my acess token para gerar as chaves da App para usar na configuração do Flume
Adicionar a linha abaixo em /etc/hosts da máquina Cloudera:
199.59.148.138 stream.twitter.com
No diretório da máquina CLOUDERA /etc/flume-ng/conf/ criar o arquivo flume_twitter.conf e inserir o conteúdo a seguir:
# Naming the components on the current agent.
TwitterAgent.sources = Twitter
TwitterAgent.channels = MemChannel
TwitterAgent.sinks = HDFS
# Describing/Configuring the source
TwitterAgent.sources.Twitter.type = com.cloudera.flume.source.TwitterSource
#TwitterAgent.sources.Twitter.type=org.apache.flume.source.twitter.TwitterSource
TwitterAgent.sources.Twitter.consumerKey = your consumerKey
TwitterAgent.sources.Twitter.consumerSecret = your consumerSecret
TwitterAgent.sources.Twitter.accessToken = your acsessToken
TwitterAgent.sources.Twitter.accessTokenSecret = your accessTokenSecret
TwitterAgent.sources.Twitter.keywords = @LuizInacioLuladaSilva, @lula, @luladasilva, @luizinácioluladasilva, @lula2018, @JairBolsonaro, @JoãoDoria, @CiroGomes, @AlvaroDias, @ÁlvaroDias, @MarinaSilva, @GeraldoAlckmin, @JoãoDoria, @JoaoDoria, @GuilhermeBoulos, @guilhermeboulos, @JoãoAmoêdo, @JoaoAmoedo,@RodrigoMaia, #eleições2018, #eleição2018, #eleicao2018, #eleicoes2018, #GeraldoAlckmin, #alvarodias, #AlvaroDias, #CiroGomes, #Bolsonaro, #MarinaSilva, #LuizInacioLuladaSilva,#eleicoes, #eleicoes2018, #eleicao2018, #eleicoes2018, #eleicao2018, #GeraldoAlckmin, #alvarodias, #AlvaroDias, #CiroGomes,#Lula, #JoãoDoria, #luladasilva, #GuilhermeBoulos, #guilhermeboulospsol,#joaodoria, #joãodoria, #JoãoAmoêdo, #JoaoAmoedo, #RodrigoMaia
# Describing/Configuring the sink
TwitterAgent.sinks.HDFS.type = hdfs
TwitterAgent.sinks.HDFS.hdfs.path = /twitteranalytics/incremental
TwitterAgent.sinks.HDFS.hdfs.fileType = DataStream
TwitterAgent.sinks.HDFS.hdfs.writeFormat = Text
TwitterAgent.sinks.HDFS.hdfs.filePrefix = twitter-
TwitterAgent.sinks.HDFS.hdfs.rollInterval = 0
TwitterAgent.sinks.HDFS.hdfs.rollSize = 524288
TwitterAgent.sinks.HDFS.hdfs.rollCount = 0
TwitterAgent.sinks.HDFS.hdfs.idleTimeout = 0
TwitterAgent.sinks.HDFS.hdfs.batchSize = 100
TwitterAgent.sinks.HDFS.hdfs.threadsPoolSize = 2
TwitterAgent.sinks.HDFS.hdfs.round = true
TwitterAgent.sinks.HDFS.hdfs.roundUnit = hour
# Describing/Configuring the channel
TwitterAgent.channels.MemChannel.type = memory
TwitterAgent.channels.MemChannel.capacity = 10000
TwitterAgent.channels.MemChannel.transactionCapacity = 100
# Binding the source and sink to the channel
TwitterAgent.sources.Twitter.channels = MemChannel
TwitterAgent.sinks.HDFS.channel = MemChannel
ESSE ARQUIVO PODE SER BAIXADO EM:
Download do arquivo flume_twitter.conf
COLOQUE O ARQUIVO flume_twitter.conf em /etc/flume-ng/conf/
PELO TERMINAL, USE O COMANDO ABAIXO:
cp flume_twitter.conf /etc/flume-ng/conf/
OU SE PREFERIR, USE O WINSCP PARA FAZER ISSO.
PROBLEMA ENCONTRADO DURANTE A EXECUÇÃO DO PROJETO
USANDO org.apache.flume.source.twitter.TwitterSource NA CONFIGURAÇÃO DO AGENTE, O ARQUIVO GERADO É TOTALMENTE ILEGÍVEL.
Objavro.schemaä
{“type”:”record”,”name”:”Doc”,”doc”:”adoc”,”fields”:[{“name”:”id”,”type”:”string”},{“name”:”user_friends_count”,”type”:[“int”,”null”]},{“name”:”user_location”,”type”:[“string”,”null”]},{“name”:”user_description”,”type”:[“string”,”null”]},{“name”:”user_statuses_count”,”type”:[“int”,”null”]},{“name”:”user_followers_count”,”type”:[“int”,”null”]},{“name”:”user_name”,”type”:[“string”,”null”]},{“name”:”user_screen_name”,”type”:[“string”,”null”]},{“name”:”created_at”,”type”:[“string”,”null”]},{“nme”:”text”,”type”:[“string”,”null”]},{“name”:”retweet_count”,”type”:[“long”,”null”]},{“name”:”retweeted”,”type”:[“boolean”,”null”]},{“name”:”in_reply_to_user_id”,”type”:[“long”,”null”]},{“name”:”source”,”type”:[“string”,”null”]},{“name”:”in_reply_to_status_id”,”type”:[“long”,”null”]},{“name”:”media_url_https”,”type”:[“string”,”null”]},{“name”:”expanded_url”,”type”:[“string”,”null”]}]} øa >‡Ùó°‚¢ì¢Àß,¤Œ$967438715848200192 ì †¿ ¦ Dani👑 Danimarquez21 (2018-02-24T16:38:58Z @💙💙 https://t.co/I1X88sku4T ˆ<a href=”https://mobile.twitter.com” rel=”nofollow”>Twitter Lite</a> ^https://pbs.twimg.com/media/DW0H2moWsAEKuXv.jpg †https://twitter.com/Danimarquez21/status/967438715848200192/photo/1$967438720071819267 ì Mic4mundo òý’€¦ š<a href=”http://www.twitter.com” rel=”nofollow”>Twitter for Windows Phone</a> $967438720067661825 ¶ v ABCD ABCDABCD98 (2018-02-24T16:38:59Z òRT @AwatefMM: ياØبي للكويت ÙˆØبي لاهلها ياجعلي ان شاءالله اسكن Ùيها يارب ¤<
IMPOSSÍVEL A DESSERIALIZAÇÃO DESSES ARQUIVOS!
ERRO:
OK
Failed with exception java.io.IOException:org.apache.avro.AvroRuntimeException: java.io.IOException: Block size invalid or too large for this implementation: -40
Time taken: 0.156 seconds
PARA CONTORNAR O PROBLEMA FOI USADO:
TwitterAgent.sources.Twitter.type = com.cloudera.flume.source.TwitterSource
AO INVÉS DE:
TwitterAgent.sources.Twitter.type = org.apache.flume.source.twitter.TwitterSource
MAS, PARA USAR com.cloudera.flume.source.TwitterSource SÃO NECESSÁRIOS DOIS ARQUIVOS:
flume-sources-1.0-SNAPSHOT.jar
hive-serdes-1.0-SNAPSHOT.jar
EU FIZ O BUILD DESSES DOIS ARQUIVOS COMO MOSTRADO EM:
https://github.com/cloudera/cdh-twitter-example
MAS, PARA FACILITAR, OS ARQUIVOS JÁ ESTÃO PRONTOS NO MEU GITHUB, É SÓ FAZER O DOWNLOAD NOS LINKS ABAIXO:
MAS, SÓ IREMOS PRECISAR DELES NA PRÓXIMA AULA.
AGORA CRIE A PASTA /twitteranalytics/ NO HDFS COM O COMANDO:
hadoop fs -mkdir -p /twitteranalytics/
SE PREFERIR UTILIZE A INTERFACE WEB PARA CRIAR A PASTA NO HDFS, COMO FOI MOSTRADO NO VÍDEO, EU PARTICULARMENTE PREFIRO USAR O TERMINAL.
EM ALGUNS CASOS É NECESSÁRIO ATUALIZAR O DATETIME DA MÁQUINA ANTES DE RODAR O AGENTE, PARA ISSO, USE O COMANDO ABAIXO:
sudo ntpdate ntp.ubuntu.com
AGORA DIGITE O COMANDO ABAIXO PARA INICIAR O AGENTE FLUME:
flume-ng agent -n TwitterAgent -c conf -f /etc/flume-ng/conf/flume_twitter.conf -Dflume.root.logger=debug,console -n TwitterAgent
PARA PARAR O AGENTE USE:
ctrl c
Olá professor! Estou seguindo sua aula, porém não funcionou o agent. O IP 199.59.148.138 stream.twitter.com não responde e se coloco um nameserver no resolv.conf a cada momento retorna um ip diferente.
No console aparece esse erro:
19/08/19 18:06:39 INFO twitter4j.TwitterStreamImpl: Establishing connection.
19/08/19 18:06:41 INFO twitter4j.TwitterStreamImpl: Connection reset
19/08/19 18:06:41 INFO twitter4j.TwitterStreamImpl: Waiting for 250 milliseconds
19/08/19 18:06:41 INFO twitter4j.TwitterStreamImpl: Establishing connection.
19/08/19 18:06:41 INFO twitter4j.TwitterStreamImpl: Connection reset
19/08/19 18:06:41 INFO twitter4j.TwitterStreamImpl: Waiting for 500 milliseconds
19/08/19 18:06:42 INFO twitter4j.TwitterStreamImpl: Establishing connection.
19/08/19 18:06:42 INFO twitter4j.TwitterStreamImpl: Connection reset
Não sei como resolver isso.
Obrigado
Olá Marcos, algumas pessoas relataram o mesmo problema, não sei o que tá ocorrendo, talvez tenha mudado alguma coisa na app do twitter, ainda não tive tempo de investigar isso.
Você é a terceira pessoa a relatar isso.
Quando eu tiver um tempinho vou dá uma olhada pra tentar descobrir.
Abraço. 🙂