Почему Hive не использует MapReduce в некоторых случаях, когда это ожидается? - PullRequest
0 голосов
/ 25 сентября 2018

Я создал кластер AWS EMR, подключил его по SSH к главному узлу, запустил Hive, а затем создал внешнюю таблицу из данных в корзине AWS S3.Но по некоторым запросам, которые, я ожидаю, должны быть выполнены некоторые задания мапперов или редукторов, он этого не делает.Например, для следующего запроса я ожидаю выполнения некоторого задания картографирования, поскольку мы фильтруем по двум столбцам:

 SELECT item, store FROM tt3 LIMIT 10;

Но это не так, и результаты быстро возвращаются.Команда explain подтверждает, что:

Stage-0   Fetch Operator
    limit:10
    Limit [LIM_2]
      Number of rows:10
      Select Operator [SEL_1]
        Output:["_col0","_col1"]
        TableScan [TS_0]
          Output:["item","store"]

Работает, как и ожидалось, для запроса select count(*) from tt3; и сначала запускает задания MapReduce.

Вывод EXPLAIN COUNT(*) FROM tt3;

Vertex dependency in root stage
Reducer 2 <- Map 1 (CUSTOM_SIMPLE_EDGE)

Stage-0
  Fetch Operator
    limit:-1
    Stage-1
      Reducer 2
      File Output Operator [FS_6]
        Group By Operator [GBY_4] (rows=1 width=8)
          Output:["_col0"],aggregations:["count(VALUE._col0)"]
        <-Map 1 [CUSTOM_SIMPLE_EDGE]
          PARTITION_ONLY_SHUFFLE [RS_3]
            Group By Operator [GBY_2] (rows=1 width=8)
              Output:["_col0"],aggregations:["count()"]
              Select Operator [SEL_1] (rows=1 width=211312928)
                TableScan [TS_0] (rows=1 width=211312928)
                  default@tt3,tt3,Tbl:COMPLETE,Col:COMPLETE

1 Ответ

0 голосов
/ 26 сентября 2018

Это ожидаемое поведение от Hive.

в улье, если вы выполните простой запрос, такой как select * from table, не будет выполнено задание по уменьшению карты, поскольку мы просто сбрасываем данные из HDFS.

Hive# select * from foo;
+---------+-----------+----------+--+
| foo.id  | foo.name  | foo.age  |
+---------+-----------+----------+--+
| 1       | a         | 10       |
| 2       | a         | 10       |
| 3       | b         | 10       |
| 4       | c         | 20       |
+---------+-----------+----------+--+
4 rows selected (0.116 seconds)

Когда вы выполняете агрегации , тогда фаза reducer будет выполняться вместе с фазой map.

Hive# select count(*) from table group by name;
INFO  : Map 1: 0/1      Reducer 2: 0/2
INFO  : Map 1: 0(+1)/1  Reducer 2: 0/2
INFO  : Map 1: 0(+1)/1  Reducer 2: 0/2
INFO  : Map 1: 0(+1)/1  Reducer 2: 0/2
INFO  : Map 1: 0(+1)/1  Reducer 2: 0/2
INFO  : Map 1: 1/1      Reducer 2: 0/1
INFO  : Map 1: 1/1      Reducer 2: 0(+1)/1
INFO  : Map 1: 1/1      Reducer 2: 1/1
+------+--+
| _c0  |
+------+--+
| 2    |
| 1    |
| 1    |
+------+--+
3 rows selected (13.709 seconds)

Мы можем добавить еще одну фазу редукторак вышеуказанному запросу, добавив к нему порядок по пунктам

Hive# select count(*) cnt from foo group by name order by cnt;
INFO  : Map 1: 0/1      Reducer 2: 0/2  Reducer 3: 0/1
INFO  : Map 1: 0(+1)/1  Reducer 2: 0/2  Reducer 3: 0/1
INFO  : Map 1: 1/1      Reducer 2: 0/1  Reducer 3: 0/1
INFO  : Map 1: 1/1      Reducer 2: 0(+1)/1      Reducer 3: 0/1
INFO  : Map 1: 1/1      Reducer 2: 1/1  Reducer 3: 0(+1)/1
INFO  : Map 1: 1/1      Reducer 2: 1/1  Reducer 3: 1/1
+------+--+
| cnt  |
+------+--+
| 1    |
| 1    |
| 2    |
+------+--+

Вы можете увидеть, что 2 этапа редуктора выполнены, потому что после агрегирования мы упорядочиваем результаты

Map1 phase:- Loads the data from HDFS.

Reduer2:- Will does aggregation

Reducer 3:- after aggregation it will order the results to ascending order.

, если вы объясните по вышеуказанному запросу

Hive# explain select count(*) cnt from foo group by name order by cnt;
 Vertex dependency in root stage     
 Reducer 2 <- Map 1 (SIMPLE_EDGE)    
 Reducer 3 <- Reducer 2 (SIMPLE_EDGE)

Обратитесь к этой ссылке, чтобы ознакомиться с тем, когда Hive использует Map / Reduce побочные задания.

...