Pig 安装及使用

一、Pig简介


  • 1、Pig与Mapreduce

    当业务比较复杂的时候,使用MapReduce将会是一个很复杂的事情,比如你需要对数据进行很多预处理或转换,以便能够适应MapReduce的处理模式。另一方面,编写MapReduce程序,发布及运行作业都将是一个比较耗时的事情。

    Pig的出现很好的弥补了这一不足。Pig能够让你专心于数据及业务本身,而不是纠结于数据的格式转换以及MapReduce程序的编写。本质是上来说,当你使用Pig进行处理时,Pig本身会在后台生成一系列的MapReduce操作来执行任务,但是这个过程对用户来说是透明。

    相比Java的MapReduce api,Pig为大型数据集的处理提供了更高层次的抽象,与MapReduce相比,Pig提供了更丰富的数据结构,一般都是多值和嵌套的数据结构。Pig还提供了一套更强大的数据变换操作,包括在MapReduce中被忽视的连接Join操作。

  • 2、Pig组成

    Pig包括两部分:

    • 用于描述数据流的语言,称为Pig Latin。

    • 用于执行Pig Latin程序的执行环境,当前有两个环境:单JVM中的本地执行环境和Hadoop集群上的分布式执行环境。

    Pig内部,每个操作或变换是对输入进行数据处理,然后产生输出结果,这些变换操作被转换成一系列MapReduce作业,Pig让程序员不需要知道这些转换具体是如何进行的,这样工程师可以将精力集中在数据上,而非执行的细节上。

二、 Pig安装


Pig作为客户端程序运行,即使你准备在Hadoop集群上使用Pig,你也不需要在集群上做任何安装。Pig从本地提交作业,并和Hadoop进行交互。

  • 1、 下载并解压

    [hadoop@master ~]$ wget http://mirror.bit.edu.cn/apache/pig/latest/pig-0.16.0.tar.gz
    [hadoop@master ~]$ ls pig-0.16.0.tar.gz 
    pig-0.16.0.tar.gz
    [hadoop@master ~]$ tar xvf pig-0.16.0.tar.gz 
    [hadoop@master ~]$ cd pig-0.16.0
    [hadoop@master pig-0.16.0]$ ls
    bin          conf     ivy      lib      LICENSE.txt             pig-0.16.0-core-h2.jar  scripts  test
    build.xml    contrib  ivy.xml  lib-src  NOTICE.txt              README.txt              shims    tutorial
    CHANGES.txt  docs     legacy   license  pig-0.16.0-core-h1.jar  RELEASE_NOTES.txt       src
    [hadoop@master pig-0.16.0]$
    
  • 2、 设置环境变量

    [hadoop@master pig-0.16.0]$ vim ~/.bash_profile
    export PIG_INSTALL=/home/hadoop/pig-0.16.0
    export PATH=$PATH:$PIG_INSTALL/bin
    [hadoop@master pig-0.16.0]$ source ~/.bash_profile 
    
  • 3、 验证
    执行以下命令,查看Pig是否可用:

    [hadoop@master pig-0.16.0]$ pig -help
    

三、Pig运行


  • 1、 两种运行模式

    • 本地模式
      Grunt是Pig的外壳程序(shell)。本地模式下,Pig运行在单个JVM中,访问本地文件系统,该模式用于测试或处理小规模数据集。
    [hadoop@master ~]$ pig -x local
    17/04/21 18:31:07 INFO pig.ExecTypeProvider: Trying ExecType : LOCAL
    17/04/21 18:31:07 INFO pig.ExecTypeProvider: Picked LOCAL as the ExecType
    grunt> 
    
    • Mapreduce 模式
      在MapReduce模式下,Pig将查询翻译为MapReduce作业,然后在Hadoop集群上执行。
    [hadoop@master ~]$ pig -x mapreduce
    17/04/21 18:32:55 INFO pig.ExecTypeProvider: Trying ExecType : LOCAL
    17/04/21 18:32:55 INFO pig.ExecTypeProvider: Trying ExecType : MAPREDUCE
    17/04/21 18:32:55 INFO pig.ExecTypeProvider: Picked MAPREDUCE as the ExecType
    grunt> 
    
  • 2、 示例运行

    • 运行一个简单的示例,就是把linux下的/etc/passwd文件的第一列提取出来输出,用MapReduce模式跑,效果就是输出所有用户名。首先把/etc/passwd文件put到hadoop的hdfs上,命令如下:
    [hadoop@master ~]$ hdfs dfs -mkdir pigtest
    [hadoop@master ~]$ hdfs dfs -put /etc/passwd pigtest/
    
    • 然后进入Pig shell,运行命令,以':'分隔提取A,然后把A的第一列放入B,dump打出B
    grunt> A = load 'pigtest/passwd' using PigStorage(':');
    grunt> B = foreach A generate $0 as id; 
    grunt>  dump B;
    2017-04-21 18:44:33,261 [main] INFO  org.apache.pig.data.SchemaTupleBackend - Key [pig.schematuple] was not set... will not generate code.
    2017-04-21 18:44:33,267 [main] INFO  org.apache.hadoop.mapreduce.lib.input.FileInputFormat - Total input paths to process : 1
    2017-04-21 18:44:33,267 [main] INFO  org.apache.pig.backend.hadoop.executionengine.util.MapRedUtil - Total input paths to process : 1
    (root)
    (bin)
    (daemon)
    (adm)
    (lp)
    (sync)
    (shutdown)
    (halt)
    (mail)
    (uucp)
    (operator)
    (games)
    (gopher)
    (ftp)
    (nobody)
    (dbus)
    (hacluster)
    (rpc)
    (oprofile)
    (named)
    (bacula)
    (nscd)
    #存入DFHS文件系统
    grunt>store B into 'hdfs_dir';
    
  • 3、 查找每年最高温度

    我们以查找最高气温为例,演示如何利用Pig统计每年的最高气温。假设数据文件内容如下(每行一个记录,tab分割):

    1990 21
    1990 18
    1991 21
    1992 30
    1992 999
    1990 23
    

    以local模式进入pig,依次输入以下命令(注意以分号结束语句):

    records = load ‘/home/user/input/temperature1.txt’ as (year: chararray,temperature: int);
    dump records;
    describe records;
    valid_records = filter records by temperature!=999;
    grouped_records = group valid_records by year;
    dump grouped_records;
    describe grouped_records;
    max_temperature = foreach grouped_records generate group,MAX(valid_records.temperature);
    

    --备注:valid_records是字段名,在上一语句的describe命令结果中可以查看到group_records 的具体结构。

    [hadoop@master ~]$ pig -x local
    grunt> records = load '/home/hadoop/pig/temperature.txt' as (year: chararray,temperature: int);
    grunt> dump records;
    (1990,21)
    (1990,18)
    (1991,21)
    (1992,30)
    (1992,999)
    (1990,23)
    grunt> describe records;
    records: {year: chararray,temperature: int}
    grunt> valid_records = filter records by temperature!=999;
    grunt> grouped_records = group valid_records by year;
    grunt> dump grouped_records;
    grunt> describe grouped_records;
    grouped_records: {group: chararray,valid_records: {(year: chararray,temperature: int)}}
    grunt> max_temperature = foreach grouped_records generate group,MAX(valid_records.temperature);
    grunt> dump max_temperature;
    (1990,23)
    (1991,21)
    (1992,30)
    

四、Pig使用场景


  • Pig并不适合所有的数据处理任务,和MapReduce一样,它是为数据批处理而设计的,如果想执行的查询只涉及一个大型数据集的一小部分数据,Pig的实现不会很好,因为它要扫描整个数据集或其中很大一部分。

  • 随着新版本发布,Pig的表现和原生MapRedece程序差距越来越小,因为Pig的开发团队使用了复杂、精巧的算法来实现Pig的关系操作。除非你愿意花大量时间来优化Java MapReduce程序,否则使用Pig Latin来编写查询的确能帮你节约时间。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,864评论 6 494
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,175评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,401评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,170评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,276评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,364评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,401评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,179评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,604评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,902评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,070评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,751评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,380评论 3 319
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,077评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,312评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,924评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,957评论 2 351

推荐阅读更多精彩内容