Linux
根目录视图主要目录树
基础命令
1关闭Linux:
halt, shutdown -h now , poweroff
2重启linux:
reboot , shutdown -r now
3查看当前登录用户 whoami
切换用户: su tian
4修改用户密码
useradd [username] 添加用户
passwd [username]
5创建文件夹 : mkdir
6 查看目录内容 : ls
7 查看当前路径: pwd
8创建文件 : touch
9 vi 编辑文件
10查看文件 cat
11 追加 “aaa” : echo "aaa" >>文件
12cp -r /文件 拷贝
13移动文件 mv/
14 删除 rm
15
过滤出/root/article.txt中带‘中国’的行。
方法一:grep '中国' /root/article.txt
方法二:sed -n '/中国/p' /root/article.txt
方法三:awk '/中国/ {print }' /root/article.txt
高级命令
1 grep [参数] '匹配关键字' fileName
2 sed
sed [参数] [动作]
参数
-n:使用安静模式。在一般 sed 的用法中,所有来自stdin的数据一般都会被列出到终端上。但如果加上 -n 参数后,则只有经过sed特殊处理的那一行或者动作.才会被列出来。
-e:直接在命令列模式上进行 sed 的动作编辑。
-f:直接将 sed 的动作写在一个文件内,-f file 则可以运行 file内的 sed 动作。
-r:sed 动作支持的是延伸型正则表达式的语法。
-i:直接修改读取的文件内容,而不是输出到终端。
动作
a:新增,a的后面可以接字符串,而这些字符串会在新的一行出现目前的下一行.
c:取代,c的后面可以接字符串,这些字符串可以取代n1,n2之间的行
d:删除,d后面通常不接任何字符串
i:插入,i的后面可以接字符串,而这些字符串会在新的一行出现目前的上一行.
p:将某个选择的数据印出。通常p会与参数 sed -n 一起运行
s:取代,可以直接进行取代的工作。通常这个s的动作可以搭配正则表达式。例如:1,20s/old/new/g
3awk
awk '{pattern + action}' {filenames}
awk 内置变量
awk有许多内置变量用来设置环境信息,这些变量可以被改变,下面给出了最常用的一些变量。
ARGC :命令行参数个数
ARGV :命令行参数排列
ENVIRON :支持队列中系统环境变量的使用
FILENAME:awk浏览的文件名
FNR :浏览文件的记录数
FS :设置输入域分隔符,等价于命令行 -F选项,默认分隔符是\tab
NF :浏览记录的域的个数
NR :已读的记录数
OFS :输出域分隔符
ORS :输出记录分隔符
RS :控制记录分隔符
$0 :整条记录
$1 :表示当前行的第一个域
5.awk编程
5.1 变量和赋值
除了awk的内置变量,awk还可以自定义变量。
<1> 下面统计/etc/passwd的账户人数
命令 awk '{count++;print $0;} END{print "user count is ",count}' /etc/passwd
说明:count是自定义变量。之前的action{}里都是只有一个print,其实print只是一个语句,而action{}可以有多个语句,以;号隔开。
<2> 上例中没有初始化count变量的值,妥当起见,还是先赋值
命令 awk 'BEGIN {count=0;print "[start]user count is ",count} {count++;print $0;} END{print "user count is ",count}'
<3> 统计某个文件夹下的文件占用的字节数
命令 ls -l|awk 'BEGIN {size=0;} {size+=$5;} END{print "[end]size is ",size}'
说明:统计不包括文件夹的子目录
5.2 条件语句
声明方式:
if表达式. {语句;}
if表达式1. {语句;} else if表达式2. {语句;}
if表达式. {语句;} else {语句;}
<1> 统计某个文件夹下的文件占用的字节数,过滤4096大小的文件一般都是文件夹.
命令 ls -l | awk 'BEGIN {size=0;print "[start]size is ",size} {if($5!=4096) {size+=$5;}} END{print "[end]size is ",size/1024/1024,"M"}'
5.3 循环语句
声明方式:
while、do/while、for、break、continue
seq
1. 命令格式
seq [选项] 尾数
seq [选项] 首数 尾数
seq [选项] 首数 增量 尾数
2. 选项
-f:--format,格式
-s:--separator,字符串,使用指定的字符串分割数字默认使用个"\n"分割.
-w:--sequal-width,在列前添加0,使得宽度相同
sort
1. 命令格式
sort选项.参数.
2.选项
-b:忽略每行前面开始出的空格字符;
-c:检查文件是否已经按照顺序排序;
-d:排序时,处理英文字母、数字及空格字符外,忽略其他的字符;
-f:排序时,将小写字母视为大写字母;
-i:排序时,除了040至176之间的ASCII字符外,忽略其他的字符;
-m:将几个排序号的文件进行合并;
-M:将前面3个字母依照月份的缩写进行排序;
-n:依照数值的大小排序;
-o<输出文件>:将排序后的结果存入制定的文件;
-r:以相反的顺序来排序;
-t<分隔字符>:指定排序时所用的栏位分隔字符;
-k 指定排序的列
+<起始栏位>-<结束栏位>:以指定的栏位来排序,范围由起始栏位到结束栏位的前一栏位
如果排序完成了,将重复的行仅显示一次。注意,若文件未排序,该命令失效。
uniq
1.命令格式 uniq [-ic] filename
2.参数 -i:忽略大小写 -c:统计每行重复的次数 -d或--repeated:仅显示重复出现的行列;
wc命令
统计文件中有多少行,多少字,多少字符
1.命令格式
wc [-lwm] filename
2.参数
-l:仅显示行数
-w:仅显示字数英文单词个数.
-m:字符数
Linux 安装
1源码安装
2bin 二进制
3rpm安装
4yum包安装
解压命令: tar -zxvf 包
Linux扩展技能
1SSH
SSH全称Secure Shell,用来取代传统telnet和R系列命令(rlogin,rsh,rexec等)远程登陆和远程执行命令的工具。
SSH是一种加密协议,不仅在登陆过程中对密码进行加密传送,而且对登陆后执行的命令的数据也进行加密,即使别人在网络上监听并截获了你的数据包,并看不到其中的内容。
1 chmod:更改文件、文件夹权限。权限设置分2种,分别可以使用数字和符号。
语法:chmod [-R] 权限 文件/目
2 chown:更改文件所有者。此命令是change owner的简称,不过要被改变的用户要在/etc/passwd文件内存在才行,否则会报错,一般为root用户调用较多。
语法:chown [-R] 用户 文件/目录 或者 chown [-R] 用户:组名 文件/目录
3 chgrp:更改文件所属用户组。此命令是change group的简称,要求被改变的组名要在/etc/group文件内存在才行,否则会报错。
语法:chgrp [-R] 用户组 文件/目录
Hadoop
1Hadoop生态圈
1HDFS特点
a高容错和高可用性
b流式数据访问
c弹性存储,支持大规模数据群
d简单一致性模型
e移动计算而非移动数据
f协议和接口多样性
h多样的数据管理功能
2HDFS
Hadoop分布式文件系统
3HDFS组件角色
NameNode(NN) 元数据管理者,管理NameSpace
DataNode(DN)文件系统的工作节点
Client 客户端
4读文件流程
1 Cilent 向NameNode发送请求,寻找数据对应的数据库的位置信息
2NameNode 返回文件对应的数据快元数据信息
3由 Cilent 与DataNode直接通信,读取各个Block
5 写文件流程
1Client向NameNode发送写数据请求,寻找可以写入的block
2Cilent找到对应的block 数据库所处的DataNode位置后开始写入操作
3待所有的数据库block 数据块写入后,Client接收到去全部写完ack答复, 报告新增的block
6HDFS 高可用性措施
a冗余备份
b 跨机架副本存放
c心跳检测
d数据完整性检测
f安全模式
e核心文件备份
f空间回收
7 HDFS 常用命令
查看文件夹 : hdfs dfs -ls
创建目录: hdfs dfs -mkdir
删除目录: hdfs dfs -rm -r
下载文件岛到本地: hdfs dfs -copyToLocal
- 从本地当前目录下,上传之前的index.html文件到hdfs的/tmp/tianliangedu目录中:
- hdfs dfs -copyFromLocal index.html /tmp/tianliangedu
查看文件大小: hdfs dfs -du -h
读文件JAVA
public static void main(String[] args) throws IOException {
// 1. 定义读取文件的路径
String filePath = args[0];
// 2. 创建hdfs配置
Configuration conf = new Configuration();
// 3. 打开创建FileSystem,对hdfs的抽象
FileSystem fs = FileSystem.newInstance(conf);
// 4. 创建一个Path。 对文件的引用
Path path = new Path(filePath);
// 5. FileSystem 打开输入流
FSDataInputStream inputStream = fs.open(path);
// 6. 将输入流的字节数组都读取出来
byte[] bytes = new byte[1024];
int len = 0;
ByteArrayOutputStream bos = new ByteArrayOutputStream();
while ((len = inputStream.read(bytes)) > 0) {
bos.write(bytes, 0, len);
}
byte[] byteArray = bos.toByteArray();
// 7. 将字节数组抓化成字符串输出
String result = new String(byteArray, "utf8");
System.out.println(result);
}
分布式计算框架Map/Reduce
1MapReduce
MapReduce是一种编程模型,是面向大数据并行处理的计算模型、框架和平台。
2MapReduce 基本特点
a分不可靠
b封装了实现细节
c提供跨语音编程能力
3MapReduce主要功能
1)数据划分和计算任务调度
2)掌握/代码互相定位
3)系统优化
4)出错检测和恢复
4MapReduce运行流程
1 PreMap阶段: 将数据源进行切片
2Map阶段: 将数据整理成 K -V键值对形式, Partation 进行分区, sort 排序,
本地规约: Combiner(可选)
Map和Reduce中间有一个Shuffle: 进行合并 ,排序
3Reduce阶段:运行相关任务
代码实现:
package com.tledu.mapReudce;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import java.io.IOException;
import java.util.StringTokenizer;
public class MapReduce {
public static class WordCountMapper extends Mapper<Object, Text,Text, IntWritable>{
@Override
protected void map(Object key, Text value, Context context) throws IOException, InterruptedException {
//map 数据处理,将输入的kv 转换成输出的kv
//词频统计,输出的kv 是word freq的类型数据,
//输入的value是不是一行数据,多个单词用空格分割
//1将单词提取出来
StringTokenizer str = new StringTokenizer(value.toString(),",");
while (str.hasMoreTokens()){
//获取到了每个单词
String wordStr =str.nextToken();
//输出kv形式,k就是这个单词,value是个数
Text word = new Text(wordStr);
IntWritable one = new IntWritable(1);
//将数据输出
context.write(word,one);
}
}
}
public static class WordCountReduce extends Reducer<Text, IntWritable, Text,IntWritable>{
@Override
protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
//key 聚合过来的key
//values 是key的多有的值
//求频率,计数
int sum = 0;
for (IntWritable val : values){
sum +=val.get();
}
//求出了综合
context.write(key,new IntWritable(sum));
}
}
public static void main(String[] args) throws IOException, InterruptedException, ClassNotFoundException {
//dirver是驱动,将整个流程打通
//创建配置
Configuration conf = new Configuration();
//创建任务
Job job = Job.getInstance(conf,"job021-tianbiao-wordcount");
//运行的主类 mapper, combine, reducer
job.setJarByClass(MapReduce.class);
job.setMapperClass(WordCountMapper.class);
job.setCombinerClass(WordCountReduce.class);
job.setReducerClass(WordCountReduce.class);
//配置输出的 kv形式
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
//指定输入和输出目录
FileInputFormat.addInputPath(job,new Path(args[0]));
FileOutputFormat.setOutputPath(job,new Path(args[1]));
//开启任务。等待执行
System.exit(job.waitForCompletion(true) ? 0 :1);
}
}
MapReduce进阶
1文件格式
面向行/列 | 类型名称 | 是否可切分 | 优点 | 缺点 |
面向行 | 文本文件格式(.txt) | 是 | 查看方便编辑简单 | 无压缩占空间大、传输压力大、数据解析开销大 |
面向行 | sequenceFile序列文件格式(.seq) | 是 | 原生支持、二进制kv存储、支持行和块压缩 | 本地查看不方便:小文件合并成kv结构后不易查看内部数据 |
面向列 | rcfile文件格式(.rc) | 是 | 数据加载快、查询快、空间利用率高、高负载能力 | 每一项都不是最高 |
面向列 | orcfile文件格式(.orc) | 是 | 兼具了rcfile优点,进一步提高了读取、存储效率、新数据类型的支持 | 每一项都不是最高 |
2压缩格式
压缩格式按其可切分计算性,分为可切分计算和不可切分计算两种。
可切分性 | 类型名称 | 是否原生 | 优点 | 缺点 | 适用场景 |
可切分 | lzo(.lzo) | 否 | 压缩/解压速度快,合理的压缩率 | 压缩率比gzip低,非原生、需要native安装 | 单个文件越大,lzo优点越明显,压缩完成后>=200M为宜 |
可切分 | bzip2(.bz2) | 是 | 高压缩率超过gzip,原生支持、不需要native安装,用linux bzip可解压操作 | 压缩/解压速率慢 | 处理速度要求不高、压缩率要求高的情况 |
不可切分 | gzip(.gz) | 是 | 压缩/解压速度快,原生/native都支持,使用方便 | 不可切分,对cpu要求较高 | 压缩完成后<=128M的文件适宜 |
不可切分 | snappy(.snappy) | 否 | 高压缩/解压速度,合理的压缩率 | 压缩率比gzip低,非原生、需要native安装 | 适合作为map->reduce或是job数据流中间的数据传输格式 |
先安装lzo
安装lzo命令:
yum -y install lzo lzo-devel hadooplzo hadooplzo-native
再安装lzop
安装lzop命令:
yum install lzop
分布式资源管理与任务调度框架Yarn
1Yarn 是什么
- Apache Hadoop YARN (Yet Another Resource Negotiator,另一种资源协调者)
- 一种新的Hadoop资源管理器,一个通用资源管理系统
- 为上层提供统一的资源管理与任务调度及监控,提高了集群管理效率、资源使用率、数据共享效率
2 MRV1存在的主要问题
- JobTracker单点故障,如果它挂掉,整个系统无法运转
- JobTracker负载过重,限制了集群扩展,随着节点规模的增大,成为集群的瓶颈
- 仅支持MR计算框架,适合批处理、基于磁盘的计算
资源与计算没有很好的解耦设计,一个集群只能使用一个计算框架,如Hadoop&MapReduce集群、Spark集群、Tez集群等
3 Yarn 特点
- 资源管理与计算框架解耦设计,一个集群资源共享给上层各个计算框架,按需分配,大幅度提高资源利用率
- 运维成本显著下降,只需运维一个集群,同时运行满足多种业务需求的计算框架
- 集群内数据共享一致,数据不再需要集群间拷贝转移,达到共享互用
- 避免单点故障、集群资源扩展得到合理解决
4 运行流程
1用用户向发出指令, RescourceManager 收到后 调度NodeManager
2 NodeManager 创建Contriner 同时启动Applicaiton
3 ApplicationMaster 向RescourceManager 注册,申请资源,
4申请到资源后 与对应的NodeManager通信 ,启动Container任务,运行Task
5Task 运行,向NodeManager,ApplicantionMaster汇报自己状态
6完成后 Application Master 向ResourceManager申请注销并关闭自己
5Yarn调度策略
调度名称 | 特点 |
FIFO Scheduler(先进先出) | 默认的队列内部调度器,只有一个队列,所有用户共享 ,简单好理解,无法控制用户的资源使用,造成集群的可用性很差。一般不在生产环境使用。 |
Capacity Scheduler(容器调度器) | 多用户、分队列、ACL控制、不支持抢占式,队列内部依然是FIFO,也可以采用Fair |
Fair Scheduler(公平调度器)) | 多用户、分队列、ACL控制、支持抢占式,队列内部不是FIFO,而是公平分配的方式 |
Hive基础
1数据仓
a英文名称为Data Warehouse,可简写为DW
b为企业所有级别的决策制定过程,提供所有类型数据支持的战略集合
c单个数据存储,出于分析性报告和决策支持目的而创建
d为需要业务智能的企业,提供指导业务流程改进、监视时间、成本、质量以及控制
通俗解释:
a面向分析的存储系统
b一个面向主题的,集成的,不可修改的,反应历史变化的数据集合,用于数据分析,辅助管理决策。
面向主题:指数据仓库中的数据按照一定的主题域进行组织
集成:指对原有分散的数据库经过系统加工,整理得到的消除元数据中的不一致性
不可修改:指一旦某个数据进入仓库以后只需要定期的加载,刷新,不会更改
反映历史变化:指通过这些信息,对企业的发展历程和未来趋势做出定量分析预测
- 数据仓库和数据库对比分析
- 主要联系
- 两者均是用来存储数据的,即均为数据的存储载体。
- 数据仓库也是数据库,是数据库的一种衍生、延深应用。
- 数库仓库和数据库之间存在数据交互,即你中有我、我中有你。
- 数据库中的在线数据推送到离线的数据仓库用于分析处理
- 数据仓库中分析处理的结果数据也通常推送到关系数据库中,便于前台应用的可视化展现应用。
- 数据仓库的出现,并不是要取代数据库,且当下大部分数据仓库还是用关系数据库管理系统来管理的,即数据库、数据仓库相辅相成、各有千秋。
- 主要区别
- 数据库是面向事务的设计,数据仓库是面向主题设计的。
- 数据库一般存储在线交易数据,实时性强存储空间有限,数据仓库存储的一般是历史数据,实时性弱但存储空间庞大。
- 数据库设计是尽量避免冗余,数据仓库在设计是有意引入冗余。
- 数据库是为捕获数据而设计,即实时性强吞吐量弱,数据仓库是为分析数据而设计,即吞吐量强实时性弱。
- 主要联系
Hive基本使用
1 切换hive 用户: su hive
2常用命令查看: show databases
3查看数据库: show databases;
4创建数据库:create database 库名
5选择数据库 use 库名
6 查看数据库中的表: show tables;
7 创建表: create table 表名(列名 类型,列名 类型)
8向表中插入数据: insert into
9查询数据表中的数据: select * from 表名称
10删除一个表:drop table 表名称
Hive 运行流程
数值类型
类型 | 说明 |
TINYINT | 1-byte signed integer from -128 to 127 |
SMALLINT | 2-byte signed integer from -32,768 to 32,767 |
INT INTEGER | 4-byte signed integer from -2,147,483,648 to 2,147,483,647 |
BIGINT | 8-byte signed integer from -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807 |
FLOAT | 4-byte single precision floating point number |
DOUBLE | 8-byte double precision floating point number PRECISION |
DECIMAL | Decimal datatype was introduced in Hive0.11.0 (HIVE-2693) and revised in Hive 0.13.0 (HIVE-3976) |
2.2 日期类型
类型 | 说明 |
TIMESTAMP | UNIX时间戳和可选的纳秒精度 |
DATE | 描述特定的年/月/日,格式为YYYY-MM-DD |
2.3 字符串
类型 | 说明 |
string | 最常用的字符串格式,等同于java String |
varchar | 变长字符串,hive用的较多,最长为65535 |
char | 定长字符串,比varchar更多一些,一般不要超过255个字符 |
2.4 布尔类型
类型 | 说明 |
boolean | 等同于java的boolean用的很少 |
2.5 字节数组
类型 | 说明 |
binary | 字节数组类型,可以存储任意类型的数据用的很少 |
2.6 复杂(集合)数据类型
数据类型 | 描述 | 字面语法示例 |
STRUCT | 和C语言中的struct或者”对象”类似,都可以通过”点”符号访问元素内容。例如,如果某个列的数据类型是STRUCT{first STRING, lastdt STRING},那么第1个元素可以通过字段名.first来引用 | struct( ‘John’, ‘Doe’) |
MAP | MAP是一组键-值对元组集合,使用数组表示法(例如[‘key’])可以访问元素。例如,如果某个列的数据类型是MAP,其中键->值对是’first’->’John’和’last’->’Doe’,那么可以通过字段名[‘last’]获取值’Doe’ | map(‘first’, ‘John’, ‘last’, ‘Doe’) |
ARRAY | 数组是一组具有相同类型的变量的集合。这些变量称为数组的元素,每个数组元素都有一个编号,编号从零开始。例如,数组值为[‘John’, ‘Doe’],那么第1个元素可以通过数组名[0]进行引用 | ARRAY( ‘John’, ‘Doe’) |
. 数据操作分类
操作分类 | 具体操作 | sql备注 |
DDL | •创建数据库 •建/删除表 •修改表结构 •创建/删除视图 •显示命令 | Create/Drop/Alter Database Create/Drop/Truncate Table Alter Table/Partition/Column Create/Drop/Alter View Create/Drop Index Create/Drop Function Show functions; Describe function; |
DML | •数据插入(insert,load) | load data...into table insert overwrite table |
DQL | •数据查询(select) | 正在上传…重新上传取消正在上传…重新上传取消 |
1 DDL
- 元数据:描述数据的数据
- 表分类:主要分内表和外表
- 内表:元数据和数据本身均被hive管理。删除表则全部删除。
- 外表:元数据被hive管理,数据本身存储在hdfs,不受hive管理。删除表则只删除元数据,数据本身不变
- 关键词解释
- external: 创建内部表还是外部表,此为内外表的唯一区分关键字。
- comment col_comment: 给字段添加注释
- comment table_comment: 给表本身添加注释
- partitioned by: 按哪些字段分区,可以是一个,也可以是多个
- clustered by col_name... into num_buckets BUCKETS:按哪几个字段做hash后分桶存储
- row format:用于设定行、列、集合的分隔符等设置
- stored as : 用于指定存储的文件类型,如text,rcfile等
- location : 设定该表存储的hdfs目录,如果不手动设定,则采用hive默认的存储路径
CREATE TABLE student(
id string comment '学号',
username string comment '姓名',
classid int comment '班级id',
classname string comment '班级名称'
)
comment '学生信息主表'
partitioned by (come_date string comment '按入学年份分区')
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\001'
LINES TERMINATED BY '\n'
STORED AS textfile;
2 DML
- 创建一个文本文件存储的表,并以"\t"作为分隔符,方便构造和上传数据
-
CREATE TABLE student( id string comment '学号', username string comment '姓名', classid int comment '班级id', classname string comment '班级名称' ) comment '学生信息主表' partitioned by (come_date string comment '按入学年份分区') ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n' STORED AS textfile;
构造与表对应的输入文件
- 将本地数据文件加载到表中
-
LOAD DATA local INPATH './student.txt' OVERWRITE INTO TABLE student PARTITION (come_date=20170903);
加载HDFS数据文件
- 将之前的本地文件上传至自己的hdfs目录中
- hdfs dfs -copyFromLocal student.txt /tmp/tianliangedu/input_student_info
DML
加载数据脚本
LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)]
- 创建一个文本文件存储的表,并以"\t"作为分隔符,方便构造和上传数据
CREATE TABLE student( id string comment '学号', username string comment '姓名', classid int comment '班级id', classname string comment '班级名称' ) comment '学生信息主表' partitioned by (come_date string comment '按入学年份分区') ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n' STORED AS textfile;
- 将本地数据文件加载到表中
LOAD DATA local INPATH './student.txt' OVERWRITE INTO TABLE student PARTITION (come_date=20170903);
. DQL
脚本模板
SELECT [DISTINCT] select_expr, select_expr, ...
FROM table_reference
[WHERE where_condition]
[GROUP BY col_list [HAVING condition]]
[ CLUSTER BY col_list
| [DISTRIBUTE BY col_list] [SORT BY| ORDER BY col_list]
]
[LIMIT number]
DISTRIBUTE BY col_list
以指定字段作为key作hash partition,保证相同的key会到同一个reduce去处理。
Sort By col_list
以指定字段作为单个reduce排序的key,保证单个reduce内的key有序排列输出。
Order By col_list
只会生成一个reduce任务,对全部排序
CLUSTER BY col_list
以指定字段作为key做hash partition,保证相同key会到同一个reduce去处理。该命令相当于distributed by col_list和sort by col_list的联合使用。