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:很抱歉,如果答案太长了。 考虑正确解释,并原谅我的英语。