Java 显示结果中的Pig Udf

Java 显示结果中的Pig Udf,java,apache-pig,Java,Apache Pig,我是新来的猪,我已经用java写了一个udf,我还包括了一个 System.out.println 其中的声明。我必须知道在pig中运行时此语句打印到哪里。假设您的UDF扩展了EvalFunc,您可以使用从EvalFunc.getLogger()返回的记录器。日志输出应该在pig执行的相关Map/Reduce任务中可见(如果作业在多个阶段中执行,那么您必须通过它们来查找相关的日志条目) 日志将在Map Reduce任务日志文件中结束。我建议在集群上部署之前在本地模式下调试UDF,以便您可以像e

我是新来的猪,我已经用java写了一个udf,我还包括了一个

System.out.println

其中的声明。我必须知道在pig中运行时此语句打印到哪里。

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

日志将在Map Reduce任务日志文件中结束。我建议在集群上部署之前在本地模式下调试UDF,以便您可以像eclipse一样从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}/_logs/history/)

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

设置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(脚本)

cat log4j.1属性

# 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文档,了解日志中不同的附加器、控制台及其各自的格式输出。或者,如果您正在寻找特定格式或重定向选项,请告诉我。

如果您在pig脚本中注册并使用此UDF,然后输出存储在pig日志文件(如stdoutlogs)中。

如果您在单机上运行pig,比如说您的本地计算机,则System.out.println日志将显示所有内容打印在终端上,但是如果pig脚本在集群上运行,那么您将看不到打印消息。Bizzarreee。。。嗯

如果您想得更深一点,每个任务都在单独的机器上运行,因此打印消息在集群上的单独机器上,因此您不会在您的机器上看到它

现在解决这个问题的方法是什么,这个过程对我来说有点乏味

跟踪作业的url:http://ip-172-31-29-193.us-west-2.compute.internal:20888/proxy/application_1443585172695_0019/

在浏览器中打开它,当您尝试打开它时,它将无法打开,因为ip是本地ip。假设您正在使用EMR群集,然后将其公开 就我而言是这样

主公共DNS:ec2-52-89-98-140.us-west-2.compute.amazonaws.com

现在替换上面url中的公共ip,将其更改为

ec2-52-89-98-140.us-west-2.compute.amazonaws.com:20888/proxy/application\u 1443585172695\u 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\u 1443585172695\u 0019/

现在你应该到这一页了

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

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

我的作业ID是
job\u 1443585172695\u 0021

现在在前面的步骤中,假设变量位于reduce阶段,单击该阶段,您将看到类似于的屏幕。从那里获取私人IP,这是我的案例的
172-31-28-99

现在转到EMR页面

单击硬件实例,然后单击查看EC2实例

你会得到类似的东西

。现在获取与私有ip相对应的公共ip,在我的示例中它是
52.25.196.219

现在打开url publicip:8042

ie
52.25.196.219:8042
,以获得类似的内容。单击左侧的工具,然后单击本地日志

快到了,再等一会儿

您现在将获得另一页nagivate

单击容器-->您的作业ID(我们在图2中找到)(在我的例子中是应用程序1443585172695_0021/4096字节,2015年9月30日上午5:28:53)-->然后将有许多以容器为前缀的文件,打开一个,您将发现stdout目录打开它以查看system.out.println消息

好的,这是你的日志。呸。那是一件麻烦的工作。做几次,你就会成为职业选手

有几件事需要记住 1) 在本地计算机上测试UDF 2) 了解单元测试用例对调试有很大帮助

以上两件事将省去查找日志的所有麻烦

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


PS:如果答案太长,很抱歉。我想好好解释一下,请原谅我的英语。

@Rengasamy…我问我是否使用了println语句,pig会在哪里显示它。是的,你可以使用print statem