Alex 的 Hadoop 菜鸟教程: 第16课 Pig 安装使用教程

Alex 的 Hadoop 菜鸟教程: 第16课 Pig 安装使用教程本教程介绍Pig的安装和使用。hdfs虽说是一个文件空间,但是我们每次要查看hdfs上的文件的时候都要输入一大串命令,比如一个简单的ls都需要输入:hdfsdfs-ls/,而且还不能cd到某个目录,这样就造成了每次ls都要带上全路径的麻烦,能不能有一个工具可以模拟linux下的shell呢?Pig就实现了这样的需求,可以直接ls,可以cd到某个目录。并且Pig还创造了PigLatin语言,可以通过Pig写一个类似存储过程的MapReduce的Job,pig会自动帮你把这个job翻译成MapR

大家好,又见面了,我是你们的朋友全栈君。

原文地址 : http://blog.csdn.net/nsrainbow/article/details/43426061  最新课程请关注原作者博客,获得更好的显示体验

声明

  • 本文基于Centos 6.x + CDH 5.x

Pig 有什么用

hdfs虽说是一个文件空间,但是我们每次要查看hdfs上的文件的时候都要输入一大串命令,比如一个简单的ls都需要输入 : hdfs dfs -ls / ,而且还不能cd到某个目录,这样就造成了每次ls都要带上全路径的麻烦,能不能有一个工具可以模拟linux下的shell呢?Pig就实现了这样的需求,可以直接ls,可以cd到某个目录,比如这样
grunt> ls
hdfs://mycluster/user/root/.staging	<dir>
hdfs://mycluster/user/root/employee	<dir>
hdfs://mycluster/user/root/people	<dir>
grunt> cd ..
grunt> ls
hdfs://mycluster/user/cloudera	<dir>
hdfs://mycluster/user/history	<dir>
hdfs://mycluster/user/hive	<dir>
hdfs://mycluster/user/root	<dir>
hdfs://mycluster/user/test3	<dir>
hdfs://mycluster/user/test_hive	<dir>

就像操作linux shell 一样的操作 hdfs 空间


并且Pig还创造了 Pig Latin语言,可以通过Pig写一个类似存储过程的MapReduce的Job,pig会自动帮你把这个job翻译成MapReduce去执行,大家就不用自己写原始的java代码了。

安装Pig

选择host1 用yum安装pig
yum install pig

设置环境变量

如果你用的是 YARN 那么设置HADOOP_MAPRED_HOME=/usr/lib/hadoop-mapreduce   (如果是MRv1 就是 /usr/lib/hadoop-0.20-mapreduce
)
编辑 /etc/profile 在最后一行加上
export HADOOP_MAPRED_HOME=/usr/lib/hadoop-mapreduce

然后运行 source 让设置生效

[root@host1 impala]# source /etc/profile[root@host1 impala]# echo $HADOOP_MAPRED_HOME/usr/lib/hadoop-mapreduce


启动交互模式的Pig

$ pig

看到一堆日志最后出现

, use fs.defaultFS2015-02-02 08:29:03,302 [main] INFO  org.apache.hadoop.conf.Configuration.deprecation - fs.default.name is deprecated. Instead, use fs.defaultFSgrunt> 

试着运行ls命令可以看到当前用户目录下的文件

grunt> ls
hdfs://mycluster/user/root/.staging	<dir>
hdfs://mycluster/user/root/employee	<dir>
hdfs://mycluster/user/root/people	<dir>

还可以cd 到上一级,再ls

grunt> cd ..
grunt> ls
hdfs://mycluster/user/cloudera	<dir>
hdfs://mycluster/user/history	<dir>
hdfs://mycluster/user/hive	<dir>
hdfs://mycluster/user/root	<dir>
hdfs://mycluster/user/test3	<dir>
hdfs://mycluster/user/test_hive	<dir>

怎么样?是不是比直接输入 hdfs dfs -ls / 这一大串命令爽多了?


Latin语言

Pig创造了一个Latin语言,使用Latin语言可以编写脚本。这边不具体说明Latin语言的语法,仅用一个例子让大家对Latin语言长什么样,能干什么事情有一个直观的理解
  • 用Latin语言可以写出MapReduce的Job, Pig会帮你把你写的Latin转化为MapReduce任务而不用去写具体的代码
  • Latin原因是大小写敏感的
  • Latin的命令最好用大写字母书写
这边举一个例子:
通过Pig将一段日志中所有的WARN信息都打印出来

Step1

创建一个文本 /root/logs 内容是 
(Dec 10 01:22:11 NetworkManager: <INFO> hello world [start]
(Dec 10 03:56:43 NetworkManager: <WARN> Oops! There is an error!
(Dec 10 04:10:18 NetworkManager: <WARN> Please check the database ...
(Dec 10 05:22:11 NetworkManager: <INFO> hello world [end]

Step2

将这个文本上传到hdfs的/user/pig/  目录下
使用 pig 命令进入交互模式的pig,然后执行
grunt > cd hdfs://mycluster/
grunt > cd user
grunt > mkdir pig
grunt > cd pig
grunt > copyFromLocal /root/logs logs



最后那句相当于hdfs的
hdfs dfs -put /root/logs /user/pig


Step3

使用 pig 命令进入交互模式的pig,然后执行以下命令
grunt> messages = LOAD '/user/pig/logs';
grunt> warns = FILTER messages BY $0 MATCHES '.*WARN+.*';
grunt> DUMP warns;

执行结果

((Dec 10 03:56:43 NetworkManager: <WARN> Oops! There is an error!)((Dec 10 04:10:18 NetworkManager: <WARN> Please check the database ...)

解释


第一句话
messages = LOAD '/user/pig/logs';
  • 定义了一个关系叫 message ,你可以把Pig中的关系看成是一种变量
  • message之后跟等号之间的空格不可以省略,包括等号后的空格也不可以省略,否则出错
  • LOAD 意思是加载内容,后面的地址是hdfs的地址
  • 整句话的意思是加载 /user/pig/logs 中的内容到 message 中
第二句话
warns = FILTER messages BY $0 MATCHES '.*WARN+.*';
  • FILTER … BY … 意思是根据… 来过滤某个关系,这句话中就是一个根据 BY 后面的条件来过滤message
  • $0 代表每一行的第一个元素,当有集合出现的时候 $0 代表第一个元素,$1代表第二个元素,以此类推,当只有一串字符串的时候 $0 就代表正行字符串
  • MATCHES 表示用正则来匹配,这句话中用 .*WARN+.* 来匹配含有WARN信息的日志
  • 将匹配的结果赋给warns
第三句话
DUMP warns;
  • pig脚本总是以DUMP命令结尾,DUMP代表执行前面所定义的MapReduce任务,并输出结果
  • DUMP命令回车后才真正开始执行MapReduce过程

由此可以看出一个需要很多java代码的MapReduce任务被简化成了三句话,如此的简洁。

Latin语言还有很多更强大的功能,比如对矩阵的计算和定义接口等,具体见
Pig Latin 语言手册  墙裂建议大家不要看中文的资料,就算用词典慢慢看也好,至少英文官方文档不会误导你,看多少就算多少

跟Hbase交互

Pig还可以跟Hbase交互。一般通过 pig 能干的事情大概就是 导入hbase,导出hbase,或者将hbase的某个表复制成另一个表等。
以下通过一个例子讲解下如何使用Pig将本地数据加载到Hbase的某个表中

Step1

建立一个文本文件customers 内容是 
4000001,Kristina,Chung,55,Pilot
4000002,Paige,Chen,74,Teacher
4000003,Sherri,Melton,34,Firefighter
4000004,Gretchen,Hill,66,Computer hardware engineer
4000005,Karen,Puckett,74,Lawyer
4000006,Patrick,Song,42,Veterinarian
4000007,Elsie,Hamilton,43,Pilot
4000008,Hazel,Bender,63,Carpenter

上传到hdfs的 /user/pig 目录下

grunt > cd /user/pig
grunt > copyFromLocal /root/customers ./customers

Step2

建立要导入的Hbase表
hbase(main):001:0> create 'customers', 'customers_data'

Step3

创建一个pig脚本文件 Load_HBase_Customers.pig
raw_data = LOAD 'hdfs:/user/pig/customers' USING PigStorage(',') AS (
           custno:chararray,
           firstname:chararray,
           lastname:chararray,
           age:int,
           profession:chararray
);

STORE raw_data INTO 'hbase://customers' USING org.apache.pig.backend.hadoop.hbase.HBaseStorage(
'customers_data:firstname 
 customers_data:lastname 
 customers_data:age 
 customers_data:profession'
);

在这个例子中第一个列custno会被作为hbase 的 rowkey


Step4

运行这段脚本
$ PIG_CLASSPATH=/usr/lib/hbase/hbase-client-0.98.6-cdh5.2.1.jar:/usr/lib/zookeeper/zookeeper-3.4.5-cdh5.3.0.jar /usr/bin/pig /root/Load_HBase_Customers.pig

这里的jar包根据你们的实际情况改变

Step5

检查一下hbase表内的数据
hbase(main):001:0> scan 'customers'

跟Hive交互

pig可以通过Hive的HCatalog组件跟Hive进行交互。

HCatalog是什么

一个新的Apache项目(HCatalog)扩展了Hive的元存储,同时保留了Hive DDL中用于表定义的组件。其结果是,Hive的表抽象(当使用了HCatalog时)可以用于Pig和MapReduce应用程序,这带来了以下一些主要优势:

它使得数据消费者不必知道其数据存储的位置和方式。HCatalog依赖于Hive 的 metastore服务,所以其他服务比如Pig可以通过HCatalog访问由Hive metastore定义的那些表。

计算平均工资的例子

Step1

用Hive 建立一个表叫 occupations
hive > CREATE TABLE occupations(code STRING, description STRING,salary INT)  ROW FORMAT DELIMITED FIELDS TERMINATED BY '\054';

Step2

建立一个文本 occupations.txt 内容是
11-0000,Management occupations,96150
11-1011,Chief executives,151370
11-1021,General and operations managers,103780
11-1031,Legislators,33880
11-2011,Advertising and promotions managers,91100


Step3

将文本 occupations.txt 用Hive 的 LOAD DATA方法加载到表内
hive> LOAD DATA LOCAL INPATH '/root/occupations.txt' INTO TABLE occupations;

Step4

进入交互模式pig,并执行以下语句
occ_data = LOAD 'occupations' USING org.apache.hcatalog.pig.HCatLoader();

salaries = GROUP occ_data ALL;
out = FOREACH salaries GENERATE AVG(occ_data.salary);
DUMP out;

并查看计算出的平均工资结果


其实这一大段就等于是Hive的这句话
SELECT AVG(salary) FROM occupations;

这样看起来pig反而比Hive还麻烦了?其实不是的,我只是用这个例子来说明pig跟hive之间的交互,并没有任何的比较性。

关于Pig就介绍这么多,其他更深入的功能大家可以自己查看pig的文档

参考资料

  • http://archive-primary.cloudera.com/cdh5/cdh/5/pig/basic.html
  • https://cwiki.apache.org/confluence/display/Hive/HCatalog+UsingHCat
  • http://archive-primary.cloudera.com/cdh5/cdh/5/pig/start.html#execution-modes
  • http://www.cloudera.com/content/cloudera/en/documentation/core/v5-2-x/topics/cdh_ig_pig_hbase.html
  • http://princetonits.com/technology/loading-customer-data-into-hbase-using-a-pig-script/
  • http://docs.hortonworks.com/HDPDocuments/HDP1/HDP-1.3.7/bk_user-guide/content/user-guide-hbase-import-2.html
  • http://gethue.com/hadoop-tutorial-how-to-access-hive-in-pig-with/
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/142096.html原文链接:https://javaforall.net

(0)
上一篇 2022年5月9日 下午11:20
下一篇 2022年5月9日 下午11:20


相关推荐

  • pycharm 社区版创建django项目连接mysql数据库

    pycharm 社区版创建django项目连接mysql数据库1 创建项目选择 NewProject 选择 Newenvironme 意思是给这个项目一个单独的虚拟环境 Location 就是虚拟环境的地址 好处是这个项目下载的安装包放在 location 目录下 而不会改变全局的 python 环境 我的习惯是给每一项目都创建一个虚拟环境 我们要用 django 框架 所以不需要 main py 文件 Create 因为要创建新的虚拟环境 所以时间有点长创建之后的项目结构如下图 venv 就是虚拟环境 2 下载 django

    2026年3月27日
    2
  • Spark Streaming Join

    Spark Streaming Join多数据源Join思路多数据源Join大致有以下三种思路:数据源端Join,如Android/IOS客户端在上报用户行为数据时就获取并带上用户基础信息。计算引擎上Join,如用SparkStreaming、Flink做Join。结果端Join,如用HBase/ES做Join,Join键做Rowkey/_id,各字段分别写入列簇、列或field。三种思路各有优劣,使用时注意…

    2022年6月30日
    26
  • 软件破解初级实例教程(附工具附图)

    最近在群里总是看到很多新朋友在问:1、“新手怎么学破解啊?”(这是标准的伸手党,baidugoogle其实很好用)2、“哎呀XX大牛,我什么基础都没有啊我不会汇编,不会C更不会C++还不会…………总之高手会的我都不会,我能学么?”(明确的告诉你,你能!你不和唐僧一样罗嗦的话你一定能。)3、某白发帖问曰:“XX大牛,这软件你能帮我看看吗?我尝试了N天还是没有搞定,这是软件地址www.XXX.co…

    2022年4月4日
    58
  • cat、tail、head命令

    cat、tail、head命令cat tail head 命令 cat n 文件路径 tail n 5 head n6 显示 5 10 行的内容 包括 5 和 10tail n iLinNum 从 ILinNum 开始显示到结束的内容 tail niLinNum 显示最后 iLinNum 行的内容 head niLinNum 显示开头 iLinNum 行的内容 head n iL

    2026年3月16日
    3
  • kettle工具实现数据清洗「建议收藏」

    kettle工具实现数据清洗「建议收藏」一、Excel输入2.设置参数3.查看被选中的文件名称。单击【显示文件名称…】按钮,弹出【文件读取】对话框,查看被选中读取的文件,如图所示。4.设置工作表5.【字段】选项卡参数6.预览记录二、生成记录1.加入控件3.预览记录三、生成随机数1.加入控件2.配置控件3.预览记录四、获取系统信息1.加入控件2.配置控件3.预览记录五、排序记录1.建…

    2022年10月10日
    3
  • oracle number对应java数据类型BigDecimal

    oracle number对应java数据类型BigDecimal数据库中为number类型的字段,在java类型中对应的有Integer和BigDecimal都会出现;  经测试发现当数据库为sqlserver和DB2时,用getObject()取出来时Integer类型,但是oracle中取出来就会是Integer或者BigDecimal类型。原因是oracle与java类型对应于number长度有关。 遇到该类型问题,若要判断每

    2022年7月24日
    15

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号