[HADOOP] 트위터 avro 데이터를 하이브 테이블에 올바르게로드 할 수 없습니다.
HADOOP트위터 avro 데이터를 하이브 테이블에 올바르게로드 할 수 없습니다.
너의 도움이 필요해!
트위터에서 데이터를 가져 와서 분석을 위해 하이브에로드하는 간단한 작업을 시도하고 있습니다. flume을 사용하여 HDFS로 데이터를 가져올 수 있지만 (트위터 1 % 파이어 호스 소스 사용) 또한 하이브 테이블에 데이터를로드 할 수 있습니다.
그러나 user_location, user_description, user_friends_count, user_description, user_statuses_count와 같은 트위터 데이터에있을 것으로 예상되는 모든 열을 볼 수 없습니다. Avro에서 파생 된 스키마에는 header와 body라는 두 개의 열만 포함됩니다.
다음은 내가 수행 한 단계입니다.
1) 아래 conf와 함께 flume agent를 생성하십시오 :
a1.sources = r1
a1.sinks = k1
a1.channels = c1
# Describe/configure the source
a1.sources.r1.type =org.apache.flume.source.twitter.TwitterSource
#a1.sources.r1.type = com.cloudera.flume.source.TwitterSource
a1.sources.r1.consumerKey =XXXXXXXXXXXXXXXXXXXXXXXXXXXX
a1.sources.r1.consumerSecret =XXXXXXXXXXXXXXXXXXXXXXXXXXXX
a1.sources.r1.accessToken =XXXXXXXXXXXXXXXXXXXXXXXXXXXX
a1.sources.r1.accessTokenSecret =XXXXXXXXXXXXXXXXXXXXXXXXXXXX
a1.sources.r1.keywords = bigdata, healthcare, oozie
# Describe the sink
a1.sinks.k1.type = hdfs
a1.sinks.k1.hdfs.path = hdfs://192.168.192.128:8020/hdp/apps/2.2.0.0-2041/flume/twitter
a1.sinks.k1.hdfs.fileType = DataStream
a1.sinks.k1.hdfs.writeFormat = Text
a1.sinks.k1.hdfs.inUsePrefix = _
a1.sinks.k1.hdfs.fileSuffix = .avro
# added for invalid block size error
a1.sinks.k1.serializer = avro_event
#a1.sinks.k1.deserializer.schemaType = LITERAL
# added for exception java.io.IOException:org.apache.avro.AvroTypeException: Found Event, expecting Doc
#a1.sinks.k1.serializer.compressionCodec = snappy
a1.sinks.k1.hdfs.batchSize = 1000
a1.sinks.k1.hdfs.rollSize = 67108864
a1.sinks.k1.hdfs.rollCount = 0
a1.sinks.k1.hdfs.rollInterval = 30
# Use a channel which buffers events in memory
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 1000
# Bind the source and sink to the channel
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1
2) avro 데이터 파일에서 스키마를 파생 시켰습니다. 왜 avro 데이터 파일에서 파생 된 스키마에는 머리글과 본문의 두 열만 있는지 알 수 없습니다.
java -jar avro-tools-1.7.7.jar getschema FlumeData.14315982 30978.avro
{
"type" : "record",
"name" : "Event",
"fields" : [ {
"name" : "headers",
"type" : {
"type" : "map",
"values" : "string"
}
}, {
"name" : "body",
"type" : "bytes"
} ]
}
3) 위의 에이전트를 실행하고 HDFS에서 데이터를 가져 와서 avro 데이터의 스키마를 찾아 다음과 같이 하이브 테이블을 만듭니다.
CREATE EXTERNAL TABLE TwitterData
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.avro.AvroSerDe'
WITH SERDEPROPERTIES ('avro.schema.literal'='
{
"type" : "record",
"name" : "Event",
"fields" : [ {
"name" : "headers",
"type" : {
"type" : "map",
"values" : "string"
}
}, {
"name" : "body",
"type" : "bytes"
} ]
}
')
STORED AS
INPUTFORMAT 'org.apache.hadoop.hive.ql.io.avro.AvroContainerInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.avro.AvroContainerOutputFormat'
LOCATION 'hdfs://192.168.192.128:8020/hdp/apps/2.2.0.0-2041/flume/twitter'
;
4) 하이브 테이블 설명 :
hive> describe twitterdata;
OK
headers map<string,string> from deserializer
body binary from deserializer
Time taken: 0.472 seconds, Fetched: 2 row(s)
5) 테이블 쿼리 : 내가 테이블을 쿼리하면 'body'컬럼의 바이너리 데이터와 'header'컬럼의 실제 스키마 정보를 볼 수있다.
select * from twitterdata limit 1;
OK
{"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"]},{"name":"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"]}]}�1|$���)]'��G�$598792495703543808�Bあいたぁぁぁぁぁぁぁ!�~�ゆっけ0725Yukken(2015-05-14T10:10:30Z<ん?なんか意味違うわ�<a href="http://twitter.com/download/iphone" rel="nofollow">Twitter for iPhone</a>�1|$���)]'��
Time taken: 2.24 seconds, Fetched: 1 row(s)
'header'열에 표시된 것처럼 실제 스키마의 모든 열이 포함 된 하이브 테이블을 만드는 방법은 무엇입니까? user_location, user_description, user_friends_count, user_description, user_statuses_count와 같은 모든 열을 의미합니까?
avro 데이터 파일에서 파생 된 스키마가 더 많은 열을 포함해야합니까?
flume agent (org.apache.flume.source.twitter.TwitterSource)에 사용 된 flume-avro 소스에 문제가 있습니까?
읽어 주셔서 감사합니다 ..
고맙습니다 Farrukh, 내가 그 실수를 구성 'a1.sinks.k1.serializer = avro_event', 내가 이것을 'a1.sinks.k1.serializer = text'로 변경했고 하이브에 데이터를로드 할 수있었습니다. . 하지만 이제 문제는 하이브에서 데이터를 검색하는 것입니다. 이렇게하는 동안 아래와 같은 오류가 나타납니다.
hive> describe twitterdata_09062015;
OK
id string from deserializer
user_friends_count int from deserializer
user_location string from deserializer
user_description string from deserializer
user_statuses_count int from deserializer
user_followers_count int from deserializer
user_name string from deserializer
user_screen_name string from deserializer
created_at string from deserializer
text string from deserializer
retweet_count bigint from deserializer
retweeted boolean from deserializer
in_reply_to_user_id bigint from deserializer
source string from deserializer
in_reply_to_status_id bigint from deserializer
media_url_https string from deserializer
expanded_url string from deserializer
select count(1) as num_rows from TwitterData_09062015;
Query ID = root_20150609130404_10ef21db-705a-4e94-92b7-eaa58226ee2e
Total jobs = 1
Launching Job 1 out of 1
Number of reduce tasks determined at compile time: 1
In order to change the average load for a reducer (in bytes):
set hive.exec.reducers.bytes.per.reducer=<number>
In order to limit the maximum number of reducers:
set hive.exec.reducers.max=<number>
In order to set a constant number of reducers:
set mapreduce.job.reduces=<number>
Starting Job = job_1433857038961_0003, Tracking URL = http://sandbox.hortonworks.com:8088/proxy/application_14338570 38961_0003/
Kill Command = /usr/hdp/2.2.0.0-2041/hadoop/bin/hadoop job -kill job_1433857038961_0003
Hadoop job information for Stage-1: number of mappers: 1; number of reducers: 1
* 13:04:36,856 Stage-1 map = 0%, reduce = 0%
* 13:05:09,576 Stage-1 map = 100%, reduce = 100%
Ended Job = job_1433857038961_0003 with errors
Error during job, obtaining debugging information...
Examining task ID: task_1433857038961_0003_m_000000 (and more) from job job_1433857038961_0003
Task with the most failures(4):
Task ID:
task_1433857038961_0003_m_000000
URL:
http://sandbox.hortonworks.com:8088/taskdetails.jsp?jobid=job_1433857038961_0003&tipid=task_1433857038961_0003_m_0 00000
Diagnostic Messages for this Task:
Error: java.io.IOException: java.io.IOException: org.apache.avro.AvroRuntimeException: java.io.IOException: Block si ze invalid or too large for this implementation: -40
at org.apache.hadoop.hive.io.HiveIOExceptionHandlerChain.handleRecordReaderNextException(HiveIOExceptionHand lerChain.java:121)
해결법
-
==============================
1.다음은 트윗을 다운로드하여 하이브에로드하는 단계별 프로세스입니다.
다음은 트윗을 다운로드하여 하이브에로드하는 단계별 프로세스입니다.
용제
##TwitterAgent for collecting Twitter data to Hadoop HDFS ##### TwitterAgent.sources = Twitter TwitterAgent.channels = FileChannel TwitterAgent.sinks = HDFS TwitterAgent.sources.Twitter.type = org.apache.flume.source.twitter.TwitterSource TwitterAgent.sources.Twitter.channels = FileChannel TwitterAgent.sources.Twitter.consumerKey = ************* TwitterAgent.sources.Twitter.consumerSecret = ********** TwitterAgent.sources.Twitter.accessToken = ************ TwitterAgent.sources.Twitter.accessTokenSecret = *********** TwitterAgent.sources.Twitter.maxBatchSize = 50000 TwitterAgent.sources.Twitter.maxBatchDurationMillis = 100000 TwitterAgent.sources.Twitter.keywords = Apache, Hadoop, Mapreduce, hadooptutorial, Hive, Hbase, MySql TwitterAgent.sinks.HDFS.channel = FileChannel TwitterAgent.sinks.HDFS.type = hdfs TwitterAgent.sinks.HDFS.hdfs.path = hdfs://nn1.itbeams.com:9000/user/flume/tweets/avrotweets TwitterAgent.sinks.HDFS.hdfs.fileType = DataStream # you do not need to mentioned avro format here. just mention Text TwitterAgent.sinks.HDFS.hdfs.writeFormat = Text TwitterAgent.sinks.HDFS.hdfs.batchSize = 200000 TwitterAgent.sinks.HDFS.hdfs.rollSize = 0 TwitterAgent.sinks.HDFS.hdfs.rollCount = 2000000 TwitterAgent.channels.FileChannel.type = file TwitterAgent.channels.FileChannel.checkpointDir = /var/log/flume/checkpoint/ TwitterAgent.channels.FileChannel.dataDirs = /var/log/flume/data/
avsc 파일에서 avro 스키마를 만들었습니다. 일단 생성하면 / user / youruser /와 같은 사용자 폴더에 대해이 파일을 hadoop에 저장하십시오.
{"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"]}, {"name":"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"]}
하이브 테이블에 트윗을로드했습니다. hql 파일에 코드를 저장하면 멋질 것입니다.
CREATE TABLE tweetsavro ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.avro.AvroSerDe' STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.avro.AvroContainerInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.avro.AvroContainerOutputFormat' TBLPROPERTIES ('avro.schema.url'='hdfs:///user/youruser/examples/schema/twitteravroschema.avsc') ; LOAD DATA INPATH '/user/flume/tweets/avrotweets/FlumeData.*' OVERWRITE INTO TABLE tweetsavro;
하이브에있는 tweetsavro 테이블
hive> describe tweetsavro; OK id string from deserializer user_friends_count int from deserializer user_location string from deserializer user_description string from deserializer user_statuses_count int from deserializer user_followers_count int from deserializer user_name string from deserializer user_screen_name string from deserializer created_at string from deserializer text string from deserializer retweet_count bigint from deserializer retweeted boolean from deserializer in_reply_to_user_id bigint from deserializer source string from deserializer in_reply_to_status_id bigint from deserializer media_url_https string from deserializer expanded_url string from deserializer Time taken: 0.6 seconds, Fetched: 17 row(s)
from https://stackoverflow.com/questions/30661478/unable-to-correctly-load-twitter-avro-data-into-hive-table by cc-by-sa and MIT license
'HADOOP' 카테고리의 다른 글
[HADOOP] 처리 오류 : 발견 된 인터페이스 org.apache.hadoop.mapreduce.TaskAttemptContext,하지만 클래스가 예상됩니다. (0) | 2019.06.05 |
---|---|
[HADOOP] Cygwin없이 Windows의 로컬 모드에서 Hadoop 작업 (WordCount 샘플과 같은)을 실행할 수 있습니까? (0) | 2019.06.04 |
[HADOOP] HDFS 홈 디렉토리 (0) | 2019.06.04 |
[HADOOP] 하이브가 테이블을 보여주지 않습니다. (0) | 2019.06.04 |
[HADOOP] 아파치 스파크 오류 : akka.tcp에 연결할 수 없습니다 : // sparkMaster @ (0) | 2019.06.04 |