知识点
相关文章
更多最近更新
更多Hadoop:客户端提交作业时发生的一个常见错误
2019-03-28 14:01|来源: 网络
public class MyHadoopCounter {
public static class MyHadoopMapper extends Mapper<LongWritable, Text, Text, Text> {
@Override
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
System.out.println(" ===== " + value);
context.write(new Text("Info"), value);
}
}
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
conf.addResource("core-site.xml");
Job myJob = new Job(conf, "MyJob");
myJob.setJarByClass(MyHadoopCounter.class);
myJob.setMapperClass(MyHadoopMapper.class);
FileInputFormat.addInputPath(myJob, new Path("data"));
FileOutputFormat.setOutputPath(myJob, new Path("out1"));
System.exit(myJob.waitForCompletion(true) ? 0 : 1);
}
}
(注:这个例子是我拷贝一位网友的)
然后,系统抛出了异常:
2011-12-17 17:17:37,912 INFO org.apache.hadoop.mapred.TaskInProgress: Error from attempt_201112171704_0004_m_000000_0: java.lang.RuntimeException: java.lang.ClassNotFoundException: com.xkq.hadoop.counter.MyHadoopCounter$MyHadoopMapper
at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:866)
at org.apache.hadoop.mapreduce.JobContext.getMapperClass(JobContext.java:199)
at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:719)
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:370)
at org.apache.hadoop.mapred.Child$4.run(Child.java:261)
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:1059)
at org.apache.hadoop.mapred.Child.main(Child.java:255)
Caused by: java.lang.ClassNotFoundException: com.xkq.hadoop.counter.MyHadoopCounter$MyHadoopMapper
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:247)
at org.apache.hadoop.conf.Configuration.getClassByName(Configuration.java:819)
at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:864)
... 8 more
2011-12-17 17:17:40,921 INFO org.apache.hadoop.mapred.JobTracker: Removing task 'attempt_201112171704_0004_m_000000_0'
2011-12-17 17:17:41,122 INFO org.apache.hadoop.mapred.JobInProgress: Choosing a failed task task_201112171704_0004_m_000000
我可以肯定这个异常绝大多数初学者都遇到过,所以我想说,你们遇到这个尴尬的问题是因为你们不懂Hadoop的源码。下面我来好好分析这个问题。
首先我想先说一个这个配置文件的加载,其实这位网友的conf.addResource("core-site.xml")在Configuration conf = new Configuration()之后根本就是多此一举,因为为在Configuration 类的静态代码中加入了
另外,在JobConf类的静态代码中也加入了
也就是说,Job的配置文件已经会默认包含core-default.xml、core-site.xml、mapred-default.xml、mapred-site.xml,这里还要特别注意的是,如果你不想要这些默认的配置文件,当你创建时应该这样
//false表示忽略默认的配置文件,true表示加载默认的配置文件,默认情况下是true
Configuration conf = new Configuration(false);
好,现在就来看看出现上面异常的原因,这个问题主要出在 myJob.setJarByClass(MyHadoopCounter.class)这条语句的本质是想获取MyHadoopCounter所在的jar包绝对路径,然后把这个绝对路径配置到作业的maprd.jar项,如果当前project中没有MyHadoopCounter所在的jar包的话,作业的配置文件中就没有maprd.jar项,当TaskTracker在执行该作业的任务时就找不到MyHadoopCounter类了,因此也就出现了上面的异常。
解决办法:
1.将上面的而是代码打成一个jar包,并将其引入加到当前工程中。
2.在客户端的配置文件mapred.site.xml中配置
<property>
<name>maprd.jar</name>
<value>MyHadoopCounter所在jar包的绝对路径</value>
</property>
相关问答
更多-
专利电子申请系统个人客户端,如何提交:意见陈述书 和 修改后的权利要求书?请详细些[2022-04-22]
点主动提交-新建-增加-意见陈述书-保存-补正-权利要求书-保存-关闭-草稿箱-中间文件-签名-待发送-中间文件-提交,原权利要求书不用提交。 -
hadoop客户端该如何配置[2023-10-18]
hadoop客户端只需要能够访问hadoop master即可(namenode jobtracker)。 -
hive客户端需要hadoop吗[2022-01-10]
需要,Hive需要用到Hadoop的相关配置和jar包。 -
客户端将作业提交给Namenode。 Namenode查找客户端请求的数据并提供块信息。 JobTracker负责完成工作并为工作分配资源。 在案例2和案例3中 - 乔布斯失败了。 Client submits job to the Namenode. Namenode looks for the data requested by the client and gives the block information. JobTracker is responsible for the job to be ...
-
如何从客户端Windows机器访问hadoop集群(unix)(How to access hadoop cluster (unix) from client windows machine)[2023-11-22]
可能它不是最好的解决方案,但我弄清楚了: 1)在linux机器上创建“windows”用户 2)将该用户添加到运行hadoop的用户组 3)hdfs-site.xml为dfs.permissions.supergroup添加prperty到用户组hadoop正在运行 这解决了我的问题。 我并不认为它是最好的,但并不是一个用户管理器。 Probably it is not the best solution but I figure it out: 1) created "windows" user on l ... -
对于小型本地应用程序Web服务,通常不需要使用代理。 它主要取决于您的服务器负载(客户端数量,请求频率)以及访问您的服务的网络区域:后台服务器到服务器,前台局域网,WAN或整个互联网)。 REST Web服务主要是在线资源,通过URL以独特方式标识,并且通常以经典HTTP方式提供。 从客户端来看,他不知道他得到的数据是静态的,动态的还是缓存的。 他只是将数据看作是静态的。 在大型应用程序中,随着客户端,资源和Web服务请求的增加,您需要技术组件来处理问题,例如用户平衡,随着应用程序的发展对Web服务的使用情 ...
-
不,它不会删除3个块。 所以这是它的工作原理,我们假设块4位于FSDataOuputStream维护的队列的下一个队列中。 由于某些网络问题而写入一些x字节后,数据节点失败,首先关闭管道并删除写入该数据的任何数据,新的良好数据节点被赋予新的标识并被添加到队列中并传达给队列name节点更新块4的元数据信息,然后数据将从该块的第1个字节开始写入新识别的datanode。 “权威指南”中的文件写作剖析可以帮助您更好地理解它是如何完成的。 No it will not delete the 3 blocks. So ...
-
pydoop vs hadoopy - hadoop python客户端[关闭](pydoop vs hadoopy - hadoop python client [closed])[2022-07-17]
我认为最全面的文档是http://blog.cloudera.com/blog/2013/01/a-guide-to-python-frameworks-for-hadoop/ 最近,我真的认为mrjob已经成为一个明确的领跑者。 它有一个非常活跃的邮件列表,它似乎相对稳定和最新。 它还与Amazon EMR很好地集成。 The most comprehensive documentation of this I think is http://blog.cloudera.com/blog/2013/01/ ... -
@Praveen:使用映射器来克服每个客户端数据到Hadoop服务器的停机时间,因为客户端数据在这种情况下保存主键。 充分利用每个客户端的分区以及Date分区。 在开始sqoop导入之前,必须为HDFS文件位置实现TDE区域。 * TDE:Trasparent Data Encryption专区,是客户数据安全区域的最佳实践。 @Praveen: Use mappers to overcome the downtime for each clients data to Hadoop servers, as ...
-
一种方法是实现这些客户端不支持的专有身份验证机制。 这将阻止大多数(如果不是全部)客户。 当然,有人总是可以分叉现有客户端并添加对此auth机制的支持。 取决于您的服务有多受欢迎...... One way would be to implement an proprietary authentication mechanism that these clients didn't support. That would stop most, if not all, clients. Of course, s ...