0

我正在玩 hortonworks 沙箱来学习 hadoop 等。

我正在尝试在单机“集群”上加载文件:

A = LOAD 'googlebooks-eng-all-3gram-20090715-0.csv' using PigStorage('\t')
AS (ngram:chararray, year:int, count1:int, count2:int, count3:int);
B = LIMIT A 10;
Dump B;

不幸的是,该文件对于我的 VM 上的 ram 来说有点太大了。

我想知道是否可以LOAD将 . csv文件?

这样的事情可能吗:

LOAD 'googlebooks-eng-all-3gram-20090715-0.csv' using PigStorage('\t') LOAD ONLY FIRST 100MB?
4

2 回答 2

1

在 Hadoop 中定义解决方案的方式是不可能的,但是如果您可以在 OS Shell 而非 Hadoop shell 中实现您的目标。在 Linux shell 中,您可以编写一个脚本从源文件中读取前 100MB,将其保存到本地文件系统,然后用作 Pig 源。

#Script .sh
# Read file and save 100 MB content in file system
# Create N files of 100MB each
# write a pig_script to process your data as shown below
# Launch Pig script and pass the N files as parameter as below: 
pig -f pigscript.pig -param inputparm=/user/currentuser/File1.File2,..,FileN

#pigscript.pig 
A = LOAD '$inputparm' using PigStorage('\t') AS (ngram:chararray, year:int, count1:int, count2:int, count3:int); 
B = LIMIT A 10; 
Dump B;

在一般情况下,多个文件可以通过它们的名称在 Hadoop shell 中传递,因此您也可以从 Hadoop shell 中调用文件名。

这里的关键是,在 Pig 中,没有从文件和进程中读取 x 的默认方法,它是全有或全无,因此您可能需要找到解决方法来实现您的目标。

于 2013-06-17T23:52:08.103 回答
1

为什么您需要将整个文件加载到 RAM 中?无论您需要多少内存,您都应该能够运行整个文件。尝试将此添加到脚本的顶部:

--avoid java.lang.OutOfMemoryError: Java heap space (execmode: -x local)
set io.sort.mb 10;

您的猪脚本现在将显示为:

--avoid java.lang.OutOfMemoryError: Java heap space (execmode: -x local)
set io.sort.mb 10;
A = LOAD 'googlebooks-eng-all-3gram-20090715-0.csv' using PigStorage('\t')
AS (ngram:chararray, year:int, count1:int, count2:int, count3:int);
B = LIMIT A 10;
Dump B;

假设您在运行脚本时刚刚收到 OutOfMemoryError,这应该可以解决您的问题。

于 2013-06-18T02:14:45.137 回答