`

使用Apache Pig时应该注意/避免的操作或事项

    博客分类:
  • pig
 
阅读更多

Apache Pig是用来处理大规模数据的高级查询语言,配合Hadoop使用,可以在处理海量数据时达到事半功倍的效果,比使用Java,C++等语言编写大规模数据处理程序的难度要小N倍,实现同样的效果的代码量也小N倍。

本文基于以下环境:
pig 0.8.1
文章来源:http://www.codelast.com/
(1)CROSS操作
由于求交叉积可能会导致结果数据量暴增,因此,CROSS操作是一个“昂贵”的操作,可能会耗费Hadoop集群较多的资源,使用的时候需要评估一下数据量的大小。

(2)JOIN操作的顺序
如教程《Apache Pig中文教程(进阶)》中的第(6)条所写,当JOIN的各数据集分布严重不均时,你最好考虑一下JOIN的顺序,可以对你的job效率提升有帮助。

(3)FLATTEN一个空的bag将得不会输出任何结果

FLATTEN操作本来会将嵌套展开,生成更多行的结果,但如果被展开的bag是空的,则一行记录也不会生成,这与你想像的可能有点不同:至少也应该生成一行结果吧?不会的,就是一行也不会生成。
在这里我用一个实例来说明。假设有数据文件 1.txt:
1
2
3
4
[root@localhost ~]$ cat 1.txt
1 2 {(a,b),(c,d)}
77  88  {(p,q),(r,s)}
123 555 {(u,w),(q,t)}

有三列,它们之间是以TAB分隔的。
以下代码:

1
2
3
A = LOAD '1.txt' AS (col1: int, col2: int, col3: bag{t: (first: chararray, second: chararray)});
B = FOREACH A GENERATE col1, col2, FLATTEN(col3);
DUMP B;

得到的结果是显而易见的:

1
2
3
4
5
6
(1,2,a,b)
(1,2,c,d)
(77,88,p,q)
(77,88,r,s)
(123,555,u,w)
(123,555,q,t)

可见记录被解嵌套了。
但是,如果第三列的bag是空的:

1
2
3
4
[root@localhost ~]$ cat 1.txt
1 2 {}
77  88  {}
123 555 {}

那么,与上面同样的代码将什么也不会输出(你可以自己试验一下)。
这一点需要特别注意,所以一般来说,你在FLATTEN一个bag之前,需要判断一下它是否是空的(IsEmpty),如果你需要在FLATTEN的结果中标记空的那些bag,那么你就需要自己在FLATTEN之前将空的bag替换为自己指定的内容。

(4)SAMPLE的结果数量是不确定的
SAMPLE操作符可以对一个关系(relation)进行取样,得到其一定百分比的数据(例如随机取其中10%的数据),但是,这并不保证对同一个 relation进行同样比例的SAMPLE,得到的tuple的数量就是相同的。例如,对一个有千万行的数据集,SAMPLE 0.1的结果,可能第一次会得到100万行,重做一次却得到了101万行(这里只是举一个例子,具体的数字是未知的)。
我的试验结果可以肯定地告诉大家:我拿一个含上亿条记录的数据集SAMPLE 0.1两次的结果相差了4万多条记录(指的是数据条数)。

(5)输出几个简单数据的job,没必要单独跑,使用UNION整合在一个Pig脚本中即可
假设有几个Pig job,它们输出的都是一行数据(当然,一行可能有多列),那么没必要单独跑几个job再得到所有结果,你可以用UNION把它们整合放在一个Pig脚本中,例如:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
A1 = LOAD '1.txt' AS (col: chararray);
A2 = LOAD 'a.txt' AS (col: chararray);
A2 = LOAD 'P.txt' AS (col: chararray);
 
B1 = GROUP A1 ALL;
C1 = FOREACH B1 GENERATE COUNT(A1);
 
B2 = GROUP A2 ALL;
C2 = FOREACH B2 GENERATE COUNT(A2);
 
B3 = GROUP A3 ALL;
C3 = FOREACH B3 GENERATE COUNT(A3);
 
U = UNION C1, C2, C3;
 
STORE U INTO 'res';

有人说,为什么不把A1,A2,A3使用通配符一起加载?答:这里我假设了一种非常简单的情况:三个数据文件都只有一列,而实际中,可能三个文件完全有不同的格式,而且后面的处理针对每个job也是不同的(在这里为简单起见才写成相同的),因此,单独加载有时候是必要的。
这样做之后,会输出3个文件,每个文件中有一个数。比跑3个Pig job方便。
文章来源:http://www.codelast.com/
(6)用ORDER排序时,Pig并不遵守“相同的key的记录会被发送到同一个partition”的惯例
处理海量数据时,我们常常会遇到这样一种情况:某些key的数据远远多于其他key的数据。例如,我们要分析用户的web访问日志,会发现用户访问Google的次数远远多于其他网站的次数。
所以,如果我们要按“访问的网站”这个字段来GROUP或者ORDER的话,就会造成落入某些reducer的数据远远多于其他 reducer(GROUP、ORDER都会触发reduce过程)——注意,这里说“某些reducer”,是因为在这个例子中,不仅访问Google 是个大户,可能还有其他的网站访问大户。
由于这些reducer需要处理的数据量特别大,也就会导致所需的时间特别长,从而整个job所需的总时间特别长。为了解决这一弊端,Pig使用了一种聪 明的方法:先对需要ORDER的数据进行采样,获知其key分布情况,然后根据此分布构造一个可以均衡全体数据的partitioner,从而将数据比较 均匀地送到N个reducer上。Pig的这种算法是很有效的,它使得各个reducer之间的执行时间相差不大。
正因为Pig做了这样的工作,所以,前面例子中所说的对Google的访问记录可能会被送到多个reducer中,它们有相同的key,却没有被送到同一 reducer中,这没有遵守MapReduce的惯例。如果你的数据处理流程需要遵守此惯例,那么就不能用Pig的ORDER来排序。
同时,正因为Pig在ORDER时需要对输入数据进行采样,所以,ORDER的时候Pig会为你的数据流程添加一个额外的轻量job来完成采样工作——从Pig在控制台输出的信息中,你可以看到一个Feature为“SAMPLER”的job,这个job就是采样用的。

(7)关系操作符(Relational Operator)只能对关系(relation)进行操作,而不能对表达式(expression)进行操作吗?
有人说,从这一句的陈述来看,它根本就是废话——关系操作符当然是操作关系的啊!
不过,答案是:不一定。例如,DISTINCT 是一个关系操作符,但是它却可以对表达式进行操作!
我拿一个例子来说明这个问题。有以下数据文件:

1
2
3
4
5
6
[root@localhost ~]$ cat 1.txt
1 2 3
2 5 3
2 6 7
8 6 3
1 5 7

有以下Pig代码(没什么计算上的意义,就是为了演示用):

1
2
3
4
5
6
7
A = LOAD '1.txt' AS (col1: int, col2: int, col3: int);
B = GROUP A BY col3;
C = FOREACH B {
  E = DISTINCT A.col3;
  GENERATE group, COUNT(E);
};
DUMP C;

完全可以成功执行,结果为:

(3,1)
(7,1)
从这段代码能看出什么?首先,A.col3 是一个表达式(expression),而不是一个关系(relation),但是,DISTINCT 这个操作符却应用在了它上面,这说明,关系操作符完全是有可能应用在表达式上的。
某些书/资料上有一种说法是,上面的代码是有语法错误的,你必须用以下的代码来替代:
1
2
3
4
5
6
7
8
A = LOAD '1.txt' AS (col1: int, col2: int, col3: int);
B = GROUP A BY col3;
C = FOREACH B {
  D = A.col3;
  E = DISTINCT D;
  GENERATE group, COUNT(E);
};
DUMP C;

这段代码确实没有错误,它先通过 A.col3 这个表达式,生成了一个关系(relation) D,再将 DISTINCT 关系操作符应用于其上,这样就避开了所谓的“关系操作符只能操作关系”的限制。但事实上,我们完全没有必要这样做,正如上面的代码的试验结果,你完全可以 直接用 DISTINCT A.col3,并不会出错。
所以说,书本也有坑爹的时候,不可全信。

(8)嵌套的 FOREACH 中的代码是串行执行的
嵌套的 FOREACH 语句可以完成复杂的操作,例如在嵌套的 FOREACH 中对bag进行排序等。FOREACH会被并行执行,但是对嵌套在其中的子语句来说,它们却是串行执行的。

(9)PARALLEL只对强制产生reduce过程的操作符有效
通过PARALLEL,你可以控制Pig程序的并行度(说白了就是控制reducer的数量)。PARALLEL可以附加在任何关系操作符上,但是它只对 reduce端的并行度起控制作用,因为MapReduce不允许用户自己控制map端的并行度,它只允许用户控制reduce端的并行度,所以,这就是 PARALLEL只对强制产生reduce过程的操作符有效的原因了。
另外,在本地模式(pig -x local)下,PARALLEL是不起任何作用的(被忽略),因为在本地模式下所有操作都是串行执行的。

分享到:
评论

相关推荐

    Apache Pig用法总结

    Apache Pig是一个开源的平台,它为用户提供了一种高级查询语言,即Pig Latin,用于处理大规模数据集。Pig Latin抽象了MapReduce编程模型,从而使得数据分析师能够轻松地编写数据转换脚本,而无需深入Java编程。Pig...

    Apache的sqoop项目

    在使用Sqoop时,用户需要注意以下几个关键点: - 确保Hadoop集群的配置正确,包括HDFS的路径设置、JDBC驱动的安装等。 - 在执行大型数据迁移时,需监控Hadoop集群的资源使用情况,以避免对其他作业造成影响。 - ...

    phoenix.zip

    **标题:“phoenix.zip”** **描述:**“phoenix 5.0 是与HBase 2.0兼容的一个...以上是对"phoenix.zip"中可能包含的内容的详细解释,涵盖了Phoenix的主要功能、版本兼容性和应用场景,以及使用时的一些注意事项。

    hadoop集群自动化安装手册

    - **注意事项**: 安装过程中仅需选择Basic Server选项,避免安装OpenJDK和PostgreSQL数据库。 - **磁盘配置**: - 集群主节点: RAID1+0 或 RAID0+1。 - 数据节点: JBOD模式,直接挂载至根目录。 - **文件系统**: ...

    大数据平台技术框架选型.pdf

    五、大数据平台技术框架选型的注意事项 在选择大数据平台技术框架时,需要注意以下几点: * 评估需求:评估平台的核心功能需求,避免选择不合适的解决方案。 * 了解技术组件:了解技术组件的特点、优缺点和使用...

    HADOOP集成组件CDH安装部署详细教程

    3. **读写文件**:在处理配置文件或日志时,注意文件的读写操作,避免数据丢失或冲突。 4. **权限控制**:对执行脚本的用户和权限进行控制,避免不必要的安全风险。 通过这个详细教程,你将能够掌握在Linux环境下...

    Phoenix技术与应用

    - **通过 Phoenix SQL 创建表**:在创建表时需注意加盐属性或 split key 的设置,以避免热点问题。 #### 核心能力 - **标准 SQL、join、子查询和自定义函数的支持**:使得查询更加灵活和强大。 - **二级索引**:...

    hadoop2.7.4 hadoop.dll包括winutils.exe

    6. **兼容性**:确保使用的Hadoop版本与其他依赖库(如Hive、Pig等)兼容,避免版本冲突。 总的来说,Hadoop 2.7.4的Windows版本提供了一套完整的开发和测试环境,使得开发者能够在Windows平台上进行Hadoop相关的...

    MapReduce的小应用

    - 不可同时使用`org.apache.hadoop.mapred`和`org.apache.hadoop.mapreduce`包,这可能导致不便。 - MapReduce中间结果中,不应以空格作为分隔符,因为它会被忽略。 **未来工作** 针对上述应用,可能的未来工作...

    hadoop-2.4.0-part0

    7. **最佳实践和注意事项**:如何优化Hadoop集群性能,避免常见问题,以及开发和调试MapReduce作业的技巧。 8. **文档和源码**:可能包含了Hadoop 2.4.0的官方文档或部分源码,供进一步学习和研究。 通过学习这个...

    RedHat7局域网下安装离线Ambari

    在下载过程中,需要注意文件版本的匹配问题,比如ambari-2.1.0-centos7可以换成ambari-2.6.0-centos7,但最好使用与文档中相符的版本以避免兼容性问题。 对于数据库方面,需要下载MySQL的rpm安装包和驱动包。这样,...

    zeppelin-0.8.0-bin-all.tgz

    在使用 Zeppelin 进行数据分析时,注意优化性能,如合理分配内存资源,利用缓存机制,以及避免重复加载数据。同时,利用 Zeppelin 的图表库和自定义 Markdown 功能,可以创建出专业且美观的数据报告。 总的来说,...

    史上最全的大数据面试题-大数据开发者必看.docx

    - **处理脏数据**:使用数据清洗工具,如Apache Beam或PySpark,根据业务需求定制清洗逻辑。 **3. 数据存储有哪些方式?请简要介绍每种方式的特点和适用场景。** - **关系型数据库**:适用于需要事务支持的应用。 ...

    Ambari2.7.5&HDP3.1.5.txt.zip

    在 Ambari2.7.5&HDP3.1.5.txt 文件中,通常会包含详细的安装指南、配置参数和注意事项,帮助用户顺利完成集群搭建。 总之,Ambari 2.7.5 和 HDP 3.1.5 的结合为大数据环境的管理和运维提供了一个强大的工具集,让...

    大数据平台技术框架选型资料.pdf

    值得注意的是,某些框架可能设置有数据处理费用,或者限制了对Apache Hadoop的本地支持,这可能影响到独立性和成本效益。此外,有些解决方案可能只适用于特定的大数据应用场景,如仅用于ETL或大数据分析。 在分析...

    hadoop2.7.2 window10编译后jar包

    Hadoop是Apache软件基金会开发的一个开源分布式计算框架,它允许在廉价硬件上处理大量数据,是大数据处理领域的重要工具。本资源是针对Hadoop 2.7.2版本,在Windows 10环境下编译后的jar包,对于在Windows系统上进行...

    Pro hadoop

    《PrHa.pdf》可能是这本书的主要内容,而《Read Me.txt》通常包含有关文件或资源的说明,可能包括阅读或使用《Pro Hadoop》电子版的提示和注意事项。至于《Money Online.txt》,这个文件名看起来与Hadoop主题不直接...

    hadoop-3.0.1winutils.rar

    Hadoop是Apache软件基金会开发的一个开源分布式计算框架,它允许在大规模集群中高效处理和存储大量数据。在Windows环境中配置和使用Hadoop可能会遇到一些挑战,因为Hadoop最初是为Linux设计的。"hadoop-3.0.1...

Global site tag (gtag.js) - Google Analytics