• 1. pig2、Pig 1)、Pig是一种探索大规模数据集的脚本语言。 2)、pig是在HDFS和MapReduce之上的数据流处理语言,它将数据流处理翻译成多个map和reduce函数,提供更高层次的抽象将程序员从具体的编程中解放出来。
  • 2. Pig  是一种探索大规模数据集的 脚本语言。MapReducer 的一个主要的 缺点 就是开发的 周期太长 了。我们要编写mapper和reducer,然后对代码进行编译打出 jar 包,提交到本地的 JVM 或者是 hadoop的集群 上,最后获取结果,这个周期是非常 耗时 的。
  • 3. Pig的强大之处 就是他只要 几行Pig Latin代码就能处理TB级别的数据 。Pig提供了多个命令用于 检查和处理程序中的数据结构 ,因此它能很好的支持我们写 查询 。Pig的一个很有用的特性就是它支持在输入数据中有代表性的一个 小的数据集上试运行。 所以。我们在处理大的数据集前可以用那一个小的数据集 检查 我们的程序是不是有错误的。                   Pig为大型的数据集的处理提供了更高层次的抽象。 MapReducer 能够让我们自己定义 连续执行的map和reduce函数 ,但是数据处理往往需要很多的MapReducer过程才能实现,所以将数据处理要求改写成MapReducer模式是很 复杂的 。和MapReducer相比,Pig提供了更加 丰富的数据结构 ,一般都是 多值 和 嵌套 的数据结构。Pig还提供了一套更强大的 数据交换操作 ,包括了MapReducer中被忽视的" join "操作          Pig 被设计为可以 扩展 的,处理路径上的每一个部分, 载入 , 存储 , 过滤 , 分组 , 连接 ,都是可以 定制 的,这些操作都可以使用用户定义函数(user-defined function, UDF )进行 修改 ,这些函数作用于Pig的嵌套数据模型。因此,它们可以在底层与Pig的操作集成, UDF的另外的一个好处是它们比MapReducer程序开发的库更易于重用。         但是。Pig并不适合处理所有的“数据处理”任务。和MapReducer一样,它是为数据 批处理 而设计的,如果想执行的查询只涉及一个大型数据集的一小部分数据,Pig的实现不是很好, 因为它要扫描整个数据集或其中的很大一部分。  Pig包括 两部分         1:用于描述数据流的语言,称为 Pig Latin (拉丁猪,个人翻译)         2:用于运行PigLatin程序的 执行环境 。一个是 本地 的单JVM执行环境,一个就是在 hadoop集群上 的分布式执行环境。         Pig  Latin程序是由一系列的" 操作"(operation)或"变换"(transformation)组成 。每个操作或变换对输入进行 数据处理 ,然后产生 输出的结果 。这些操作整体上描述了一个 数据流 ,Pig执行的环境把数据流翻译为可执行的内部表示,并运行它。在Pig的内部,这些变换和操作被转换成一系列的MapReducer,但是我们一般情况下并不知道这些转换是怎么进行的, 我们的主要的精力就花在数据上,而不是执行的细节上面。        在有些情况下,Pig的表现不如MapReducer程序。总结为一句就是要么话花大量的时间来优化Java MapReducer程序,要么使用Pig Latin来编写查询确实能 节约时间。
  • 4. Pig介绍 Pig包括两部分: 用于描述数据流的语言,称为Pig Latin。 用于执行Pig Latin程序的执行环境,当前有两个环境:单JVM中的本地执行环境和Hadoop集群上的分布式执行环境。  Pig内部,每个操作或变换是对输入进行数据处理,然后产生输出结果,这些变换操作被转换成一系列MapReduce作业,Pig让程序员不需要知道这些转换具体是如何进行的,这样工程师可以将精力集中在数据上,而非执行的细节上。
  • 5. 安装Pig 好,作为一切的开始,我们先安装一个Pig环境。 从http://hadoop.apache.org/pig/releases.html下载稳定版本,当前稳定版本是0.12.1,然后解压到任意目录,并且修改环境变量 tar xzf pig-0.12.1.tar.gz export PIG_INSTALL=/root/pig/pig-0.12.1 export PATH=$PATH:$PIG_INSTALL/bin
  • 6. 本地模式 Grunt是Pig的外壳程序(shell)。本地模式下,Pig运行在单个JVM中,访问本地文件系统,该模式用于测试或处理小规模数据集 [root@hadoop-namenodenew pig]# pig -x local grunt>
  • 7. MapReduce模式 在MapReduce模式下,Pig将查询翻译为MapReduce作业,然后在Hadoop集群上执行。Pig版本和Hadoop版本间,有要求,笔者这边的版本如下 Hadoop 2.2.0 Pig 0.12.1 注意:Pig 0.12.1默认是被编译成与Hadoop的旧版本的,所以这边需要重新编译下Pig,运行如下命令,编译时间比较长,耐心等待。参考时间:16min ant clean jar-all -Dhadoopversion=23 否则运行Pig任务时,会有如下错误: Hadoop: java.lang.IncompatibleClassChangeError: Found interface org.apache.hadoop.mapreduce.JobContext, but class was expected 然后,Pig是放在Hadoop集群上的,所以设置下HADOOP_HOME等环境变量 export HADOOP_HOME=/root/hadoop/hadoop-2.2.0 export PATH=$PATH:/root/hadoop/hadoop-2.2.0/bin 运行Pig的MapReduce模式,命令如下: pig 或者:pig -x mapreduce
  • 8. 运行Pig程序示例 运行一个简单的示例,就是把linux下的/etc/passwd文件的第一列提取出来输出,用MapReduce模式跑,效果就是输入所有用户名 首先把/etc/passwd文件put到hadoop的hdfs上,命令如下 hadoop fs -put /etc/passwd /user/root/passwd 然后进入Pig shell,运行命令,以':'分隔提取A,然后把A的第一列放入B,dump打出B [root@hadoop-namenodenew]# pig grunt> A = load 'passwd' using PigStorage(':'); grunt> B = foreach A generate $0 as id; grunt> dump B;
  • 9. 输出如下: (省略几万字....) Input(s): Successfully read 29 records (1748 bytes) from: "hdfs://192.168.12.67:8020/user/root/passwd" Output(s): Successfully stored 29 records (325 bytes) in: "hdfs://192.168.12.67:8020/tmp/temp1558767875/tmp-1327634226" Counters: Total records written : 29 Total bytes written : 325 Spillable Memory Manager spill count : 0 Total bags proactively spilled: 0 Total records proactively spilled: 0 Job DAG: job_1401631066126_0005 (省略几万字....) (root) (bin) (daemon) (adm) (lp) (sync) (shutdown) (halt) (mail) (uucp) (operator) (games) (gopher) (ftp) (nobody) (dbus) (vcsa) (rpc) (abrt) (rpcuser) (nfsnobody) (haldaemon) (ntp) (saslauth) (postfix) (sshd) (tcpdump) (oprofile) (riak)
  • 10. Pig适用场景 Pig并不适合所有的数据处理任务,和MapReduce一样,它是为数据批处理而设计的,如果想执行的查询只涉及一个大型数据集的一小部分数据,Pig的实现不会很好,因为它要扫描整个数据集或其中很大一部分。 随着新版本发布,Pig的表现和原生MapRedece程序差距越来越小,因为Pig的开发团队使用了复杂、精巧的算法来实现Pig的关系操作。除非你愿意花大量时间来优化Java MapReduce程序,否则使用Pig Latin来编写查询的确能帮你节约时间。  
  • 11. 执行Pig程序的方法 脚本:Pig可以运行包含Pig命令的脚本文件,例如,pig script.pig,对于很短的脚本可以通过使用-e选项直接在命令行中输入脚本字符串。 Grunt:Pig shell,就是上文的运行模式 嵌入式方法:也可以在Java中运行Pig程序,和使用JDBC运行SQL程序很像,详情:https://wiki.apache.org/pig/EmbeddedPig
  • 12. Pig与RDBMS、Hive比较 Pig Latin是一种数据流编程语言,而SQL是一种描述性编程语言。换句话说,Pig程序是相对于输入的一步步操作,其中每一步是对数据的一个简答的变换。相反,SQL语句是一个约束的集合,这些约束的集合在一起,定义了输出。 示例也可以看出,Pig其实是对Java的Mapreduce的封装,进一步的抽象,运行的也是java程序,并在此基础上提供其他特性。 Hive介于Pig和传统RDBMS(关系数据库管理系统Relational Database Management System)之间,Hive的设计目的是让精通SQL既能的分析师能够在存放在HDFS的大规模数据集上运行查询。 Hive在很多方面和传统数据库类似,但是它底层对HDFS和MapReduce的依赖意味着它的体系结构有别于传统数据库。 Hive本身不存储数据,完全依赖于HDFS和MapReduce,Hive可以将结构化的数据文件映射为一张数据库表,Hive中表纯逻辑,就是表的元数据。而HBase是物理表,定位是NoSQL。
  • 13. 后记 以上只是简单介绍了下Pig,提供安装和运行demo,也算是对自己知识面的扩充以及加深对Hadoo体系的了解。 关于Pig多值和嵌套的数据结构,以及Join的关系操作都没有涉及,如果后期有深入了解的必要,博文将继续。。。
  • 14. 谢谢!