IDEA 本地运行mapreduce程序不打印日志问题

在IDEA中运行MapReduce程序时,虽然程序成功运行但控制台未显示日志,只出现log4j警告。原因是缺少log4j.properties配置文件。解决方法是在项目resources目录下创建该配置文件,以确保log4j能正确加载并输出日志。

一、问题描述

使用idea运行mapreduce程序后,虽然程序运行成功,但在控制台不打印相关的日志信息,而是出现如下的log4j警告

log4j:WARN No appenders could be found for logger (org.apache.hadoop.metrics2.lib.MutableMetricsFactory).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.

二、产生原因

进入提示的网站,看到相关问题及解答
在这里插入图片描述
翻译一下大概意思是:

1.产生的原因是没有找到log4j.properties或log4j.xml配置文件
2.log4j不提供默认配置,因为在某些环境中可能会禁止输出到控制台或文件系统
3.log4j用Thread().getContextClassLoader().getResource()加载配置文件

三、解决办法

看到官网的解释其实就很明白了,只需要在项目的resources目录下面创建一个配置文件log4j.properties即可。

# log4j.rootLogger日志输出类别和级别:只输出不低于该级别的日志信息DEBUG < INFO < WARN < ERROR < FATAL
# A1是一个“形参”代表输出位置,具体的值在下面
log4j.rootLogger=DEBUG, A1

# 配置A1输出到控制台
lo
### Hadoop MapReduce单词统计任务的实现 以下是关于Hadoop MapReduce单词统计任务的具体实现步骤,包括Mapper、Reducer和Driver类的代码以及如何在IntelliJ IDEA Community Edition 2018.3.6 x64上进行本地测试和集群测试。 --- #### Mapper 类设计 Mapper 的主要功能是从输入文件中读取每一行数据并将其拆分为多个单词。每个单词作为键值对的一部分输出给后续处理阶段。 ```java import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Mapper; import java.io.IOException; public class WordCountMapper extends Mapper<LongWritable, Text, Text, IntWritable> { private final static IntWritable one = new IntWritable(1); private Text word = new Text(); @Override protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { String line = value.toString(); String[] words = line.split("\\s+"); for (String w : words) { if (!w.isEmpty()) { // 跳过空白字符 word.set(w.toLowerCase()); // 将单词转换为小写形式 context.write(word, one); // 输出<word, 1> } } } } ``` 此部分实现了将每行文本分割成单词的功能,并通过 `context.write` 方法发送到 Reducer 中[^1]。 --- #### Reducer 类设计 Reducer 接收来自 Mapper 的中间结果 `<key, Iterable<Value>>` 并对其进行聚合操作。最终输出的是每个单词及其对应的计数。 ```java import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Reducer; import java.io.IOException; public class WordCountReducer extends Reducer<Text, IntWritable, Text, IntWritable> { @Override protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException { int sum = 0; for (IntWritable val : values) { sum += val.get(); // 对相同单词的数量求和 } context.write(key, new IntWritable(sum)); // 输出<word, count> } } ``` 该部分完成了对同一单词出现次数的累加计算逻辑[^2]。 --- #### Driver 类设计 Driver 是整个程序的核心入口点,负责配置 Job 参数并将作业提交至 Hadoop 集群运行。 ```java import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Job; import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; public class WordCountDriver { public static void main(String[] args) throws Exception { Configuration conf = new Configuration(); Job job = Job.getInstance(conf, "Word Count"); job.setJarByClass(WordCountDriver.class); job.setMapperClass(WordCountMapper.class); job.setCombinerClass(WordCountReducer.class); job.setReducerClass(WordCountReducer.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(IntWritable.class); FileInputFormat.addInputPath(job, new Path(args[0])); FileOutputFormat.setOutputPath(job, new Path(args[1])); System.exit(job.waitForCompletion(true) ? 0 : 1); } } ``` 这段代码定义了 Map 和 Reduce 函数之间的交互方式,并指定了输入/输出路径[^3]。 --- #### 在 IntelliJ IDEA 上设置环境 为了能够在 IntelliJ IDEA Community Edition 2018.3.6 x64 上开发和调试 Hadoop 应用程序,请按照以下说明完成必要的准备工作: 1. **安装 Maven 插件** 如果尚未启用 Maven 支持,则需激活它以便管理依赖项。 2. **创建项目结构** 使用 Maven 创建一个新的 Java Project,在 pom.xml 文件中添加如下依赖关系来引入所需库版本: ```xml <dependencies> <!-- Apache Hadoop Core --> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-common</artifactId> <version>3.3.1</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-mapreduce-client-core</artifactId> <version>3.3.1</version> </dependency> </dependencies> ``` 3. **配置本地模式运行参数** 修改 Driver 主函数中的命令行为支持单机模拟执行。例如可以指定两个虚拟目录分别代表源文件夹与目标存储位置。 4. **启动 MiniDFSCluster 或伪分布式部署节点服务端口监听状态确认无误后再尝试连接实际物理硬件资源池实例地址信息传递过去即可正常运作起来[^4]. --- #### 测试方法 - **本地测试**: 运行上述编写的 Main 方法前先准备好一些样本文档存放在特定磁盘分区下供其加载解析;之后观察控制台打印出来的日志消息判断是否成功生成预期的结果集。 - **集群测试**: 把打包后的 jar 包上传服务器并通过 hadoop 命令行工具调用来触发远程批量运算过程[^5]. ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值