복붙노트

[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. ==============================

    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)
    
  2. from https://stackoverflow.com/questions/30661478/unable-to-correctly-load-twitter-avro-data-into-hive-table by cc-by-sa and MIT license