我的背景 - 在Hadoop世界4周大.使用Cloudera的Hadoop VM在Hive,Pig和Hadoop中略微涉足.已阅读Google关于Map-Reduce和GFS的文章(PDF链接).
我明白那个-
Pig的语言Pig Latin是一种转变(适合程序员认为的方式)SQL就像声明式编程风格和Hive的查询语言非常类似于SQL.
猪坐在Hadoop之上,原则上也可以坐在Dryad之上.我可能错了,但Hive与Hadoop紧密相关.
Pig Latin和Hive命令都编译为Map和Reduce作业.
我的问题 - 当一个人(比如猪)可以达到目的时,双方的目标是什么.是不是因为猪被雅虎传福音!和Facebook的蜂巢?
使用Hadoop或HBase或Hive有什么好处?
根据我的理解,HBase避免使用map-reduce,并且在HDFS之上具有面向列的存储.Hive是Hadoop和HBase的类似sql的接口.
我也想知道Hive与Pig的比较.
我做了类似这样的事情来计算PIG中别名的行数:
logs = LOAD 'log'
logs_w_one = foreach logs generate 1 as one;
logs_group = group logs_w_one all;
logs_count = foreach logs_group generate SUM(logs_w_one.one);
dump logs_count;
Run Code Online (Sandbox Code Playgroud)
这似乎效率太低.如果有更好的方法请赐教!
我已经实现了Apache Pig脚本.当我执行脚本时,它会为特定步骤生成许多映射器,但该步骤只有一个reducer.由于这种情况(许多映射器,一个减速器),Hadoop集群几乎处于空闲状态,而单个减速器执行时.为了更好地使用集群的资源,我希望还有许多并行运行的reducer.
即使我使用SET DEFAULT_PARALLEL命令在Pig脚本中设置并行性,我仍然只有1个reducer.
发出问题的代码部分如下:
SET DEFAULT_PARALLEL 5;
inputData = LOAD 'input_data.txt' AS (group_name:chararray, item:int);
inputDataGrouped = GROUP inputData BY (group_name);
-- The GeneratePairsUDF generates a bag containing pairs of integers, e.g. {(1, 5), (1, 8), ..., (8, 5)}
pairs = FOREACH inputDataGrouped GENERATE GeneratePairsUDF(inputData.item) AS pairs_bag;
pairsFlat = FOREACH pairs GENERATE FLATTEN(pairs_bag) AS (item1:int, item2:int);
Run Code Online (Sandbox Code Playgroud)
'inputData'和'inputDataGrouped'别名在映射器中计算.
减速器中的'pair'和'pairsFlat'.
如果我通过使用FLATTEN命令删除行来更改脚本(pairsFlat = FOREACH对GENERATE FLATTEN(pairs_bag)AS(item1:int,item2:int);)然后执行会产生5个reducers(因此在并行执行中) .
似乎FLATTEN命令是问题,并避免创建许多reducer.
我怎么能达到FLATTEN的相同结果,但是脚本是并行执行的(有很多减速器)?
编辑:
有两个FOREACH时的EXPLAIN计划(如上所述):
Map Plan
inputDataGrouped: Local Rearrange[tuple]{chararray}(false) - scope-32
| |
| Project[chararray][0] - scope-33 …Run Code Online (Sandbox Code Playgroud) 我将多个小文件放入我的输入目录,我希望将其合并到一个文件中,而不使用本地文件系统或编写mapred.有没有办法可以使用hadoof fs命令或猪?
谢谢!
我有以下情况 -
猪版使用0.70
HDFS目录结构示例:
/user/training/test/20100810/<data files>
/user/training/test/20100811/<data files>
/user/training/test/20100812/<data files>
/user/training/test/20100813/<data files>
/user/training/test/20100814/<data files>
Run Code Online (Sandbox Code Playgroud)
正如您在上面列出的路径中看到的,其中一个目录名称是日期戳.
问题:我想从20100810到20100813之间的日期范围加载文件.
我可以将日期范围的'from'和'to'作为参数传递给Pig脚本,但是如何在LOAD语句中使用这些参数.我能够做到以下几点
temp = LOAD '/user/training/test/{20100810,20100811,20100812}' USING SomeLoader() AS (...);
Run Code Online (Sandbox Code Playgroud)
以下适用于hadoop:
hadoop fs -ls /user/training/test/{20100810..20100813}
Run Code Online (Sandbox Code Playgroud)
但是当我在猪脚本中尝试使用LOAD时它失败了.如何利用传递给Pig脚本的参数从日期范围加载数据?
错误日志如下:
Backend error message during job submission
-------------------------------------------
org.apache.pig.backend.executionengine.ExecException: ERROR 2118: Unable to create input splits for: hdfs://<ServerName>.com/user/training/test/{20100810..20100813}
at org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.PigInputFormat.getSplits(PigInputFormat.java:269)
at org.apache.hadoop.mapred.JobClient.writeNewSplits(JobClient.java:858)
at org.apache.hadoop.mapred.JobClient.writeSplits(JobClient.java:875)
at org.apache.hadoop.mapred.JobClient.access$500(JobClient.java:170)
at org.apache.hadoop.mapred.JobClient$2.run(JobClient.java:793)
at org.apache.hadoop.mapred.JobClient$2.run(JobClient.java:752)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:396)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1062)
at org.apache.hadoop.mapred.JobClient.submitJobInternal(JobClient.java:752)
at org.apache.hadoop.mapred.JobClient.submitJob(JobClient.java:726)
at org.apache.hadoop.mapred.jobcontrol.Job.submit(Job.java:378)
at org.apache.hadoop.mapred.jobcontrol.JobControl.startReadyJobs(JobControl.java:247)
at org.apache.hadoop.mapred.jobcontrol.JobControl.run(JobControl.java:279)
at …Run Code Online (Sandbox Code Playgroud) 我有一个存储在HDFS中的文件 part-m-00000.gz.parquet
我试图运行,hdfs dfs -text dir/part-m-00000.gz.parquet但它已经压缩,所以我运行gunzip part-m-00000.gz.parquet但它没有解压缩文件,因为它无法识别.parquet扩展名.
如何获取此文件的架构/列名称?
我想使用Apache Pig构建一个大键 - >值映射,在地图中查找并迭代键.然而,甚至似乎没有做这些事情的语法; 我检查了手册,维基,示例代码,象书,谷歌,甚至尝试解析解析器源.每个示例都从文件加载地图文字...然后从不使用它们.你怎么用Pig的地图?
首先,似乎没有办法直接将2列CSV文件加载到地图中.如果我有一个简单的map.csv:
1,2
3,4
5,6
Run Code Online (Sandbox Code Playgroud)
我尝试将其加载为地图:
m = load 'map.csv' using PigStorage(',') as (M: []);
dump m;
Run Code Online (Sandbox Code Playgroud)
我得到三个空元组:
()
()
()
Run Code Online (Sandbox Code Playgroud)
所以我尝试加载元组然后生成地图:
m = load 'map.csv' using PigStorage(',') as (key:chararray, val:chararray);
b = foreach m generate [key#val];
ERROR 1000: Error during parsing. Encountered " "[" "[ "" at line 1, column 24.
...
Run Code Online (Sandbox Code Playgroud)
语法的许多变体也会失败(例如generate [$0#$1]).
好的,所以我把我的地图变成Pig的地图文字格式map.pig:
[1#2]
[3#4]
[5#6]
Run Code Online (Sandbox Code Playgroud)
加载它:
m = load 'map.pig' as (M: []);
Run Code Online (Sandbox Code Playgroud)
现在让我们加载一些键并尝试查找:
k = …Run Code Online (Sandbox Code Playgroud) 我像这样在Pig中的单列上进行外连接
result = JOIN A by id LEFT OUTER, B by id;
Run Code Online (Sandbox Code Playgroud)
我如何加入两列,如:
WHERE A.id=B.id AND A.name=B.name
Run Code Online (Sandbox Code Playgroud)
什么是猪的等价物?我在猪手册中找不到任何例子......有什么帮助吗?