Pig Udf显示结果

我是猪的新手,我在java中编写了一个udf并且我已经包含了一个

System.out.println 

声明。 我必须知道在猪身上跑步时这个陈述的印刷地点。

如果在pig脚本中注册并使用此UDF,则输出将存储在诸如stdoutlogs之类的pig日志文件中。

假设您的UDF扩展了EvalFunc ,您可以使用从EvalFunc.getLogger()返回的Logger。 日志输出应该在pig执行的相关Map / Reduce任务中可见(如果作业在多个阶段中执行,那么您将不得不通过它们来查找关联的日志条目)。

日志将最终出现在Map Reduce Task日志文件中。我建议在部署到集群之前以本地模式调试UDF,以便您可以像IDE一样从IDE调试它。

默认情况下,错误(例如:脚本解析错误)会记录到pig.logfile中,该文件可以在$ PIG_HOME / conf / pig.properties中设置。 如果还要记录状态消息,请准备一个有效的log4j.properties文件并将其设置在log4jconf属性中。

使用Pig v0.10.0(r1328203)时,我发现成功的pig任务不会将作业的历史日志写入hdfs的输出目录。 (hadoop.job.history.user.location = $ {} mapred.output.dir / _日志/历史/)

如果您想通过各种方式获得这些历史记录,请以这种方式在pig脚本中设置mapred.output.dir:

set mapred.output.dir’/ user / hadoop / test / output’;

注意: Pig使用apache的log4j模块进行日志记录。 但是,弄清楚为什么你不能使用log4j会令人望而生畏。 有猪的属性,有时您可能会使用自定义根记录器获得NPE。

Pig有一个命令行选项-4(是的,非常不像人们可以将它与log4j联系起来)与log4j一起使用。

以下是示例log4j.properties示例的示例用法。

选项-l用于命名日志文件t

pig -l /tmp/some.pig.log -4 log4j.properties -x local mysample.pig(script)

cat log4j.properties

 # Root logger option log4j.rootLogger=INFO, file, F # Direct log messages to a log file log4j.logger.org.apache.pig=DEBUG log4j.logger.org.apache.hadoop=INFO log4j.appender.file=org.apache.log4j.RollingFileAppender log4j.appender.file.File=${pig.logfile} log4j.appender.file.MaxFileSize=1MB log4j.appender.file.MaxBackupIndex=1 log4j.appender.file.layout=org.apache.log4j.PatternLayout #log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p [%t] (%F:%L) - %m%n #another example line below for a different format of output log line # log4j.appender.file.layout.ConversionPattern="%d [%t] %-5p %c - %m%n" 

上述pig命令的输出以典型的apache log4j格式存储在文件/tmp/some.pig.log中。

请查看apache log4j文档,了解日志中不同的Appender,控制台及其各自的格式输出。 或者,如果您正在寻找特定格式或重定向选项,请告诉我。

如果你在单机上运行猪,说你的本地计算机,那么System.out.println日志将显示所有与终端上打印的东西但是如果猪脚本在集群上运行,那么你将看不到打印消息。 Bizzarreee ……嗯……

如果你认为每个任务都在一个单独的机器上运行,那么打印消息就在集群上的单个机器上,因此你不会在你的机器上看到它。

现在它的解决方案是什么,这个过程对我来说有点乏味。

The url to track the job: http://ip-172-31-29-193.us-west-2.compute.internal:20888/proxy/application_1443585172695_0019/

在浏览器中打开它,当你尝试打开它时,它将无法打开,因为ip是本地的。 假设您正在使用EMR集群,那么就我的情况而言是公开的

Master public DNS:ec2-52-89-98-140.us-west-2.compute.amazonaws.com

现在替换上面url中的public ip将其更改为

ec2-52-89-98-140.us-west-2.compute.amazonaws.com:20888/proxy/application_1443585172695_0019/

执行此操作后,您会注意到url已更改

一些私有IP然后作业历史服务器

http://ip-172-31-29-193.us-west-2.compute.internal:19888/jobhistory/job/job_1443585172695_0019/

再次替换私有IP

ec2-52-89-98-140.us-west-2.compute.amazonaws.com:19888/jobhistory/job/job_1443585172695_0019/

到现在为止你应该来到这个页面 工作页面

现在确定您的任务(调用UDF的点)是在mapper还是reducer阶段(groupby之前或之后)执行,然后单击链接

现在转到日志所在的终端。 找到计算变量的步骤并从那里获取jobid

看突出部分 我的工作是job_1443585172695_0021

现在在上一步中,假设你的变量在于减少相位点击,你会得到类似的屏幕 这个 。 从那里获取私有IP,这是我的情况172-31-28-99

现在转到EMR页面

点击硬件实例并点击查看EC2实例

你会得到类似的东西

这个 。 现在获取对应于私有IP的公共ip,在我的情况下是52.25.196.219

现在打开urlpublicip:8042

52.25.196.219:8042得到类似的东西 这个 。 单击左侧的工具,然后单击本地日志。

几乎在那里再等一会儿。

你会得到另一个页面现在nagivate

点击容器 – >你的工作ID(我们在图片2中找到)(在我的情况下是application_1443585172695_0021 / 4096字节2015年9月30日上午5:28:53)—>然后会有很多带容器的文件作为前缀,打开一个,你会发现stdout目录打开它看到system.out.println消息。

那么你有你的日志。 唷。 这是一些麻烦的工作。 做几次,你会成为专业人士。

要记住的事情1)在本地机器上测试UDF 2)学习unit testing用例有助于调试

超过2件事将节省查找日志的所有麻烦

有一种方法可以找到实际的集装箱号码但是我忘了,如果有人知道请告诉我。

PS:很抱歉,如果答案太长了。 考虑正确解释,并原谅我的英语。