基于hadoop、hive的离线数据分析问题集锦

1、小文件合并。nginx+flume+hdfs的架构采集、存储日志,但是flume采集的日志最终会有很多的小文件存储到hdfs,令人难受的是hdfs并不适用于处理大量小文件,但是好在hadoop的mapreduce提供了可以批量合并小文件的方式,这里直接上干货代码:

在这里插入代码片
package baobei.data.etl;
import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.lib.input.CombineTextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

/**
 * flume会产生多个文件到hdfs,这里设置将小文件聚合为一个大文件,
 * 方便后面的数据处理
 * 
 */
public class SmallFileCombiner {
	
	static class SmallFileCombinerMapper extends Mapper<LongWritable, Text, Text, NullWritable>{
		NullWritable v = NullWritable.get();
		@Override
		protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
			//通过这种方式相当于是直接把值打印到磁盘文件中。value其实就是每一样的的文件内容
			context.write(value, v);
		}
		
	}
	
	/**
	 * 如果生产环境中,小文件的数量太多,那么累计起来的数量也是很庞大的,那么这时候就要设置切片的大小了。
	 * 
	 * 即使用:CombineTextInputFormat.setMaxInputSplitSize(job, 1024*1024*150);
	 */
	public static void main(String[] args) throws Exception {
		Configuration conf = new Configuration();
		Job job = Job.getInstance(conf);		
		job.setJarByClass(SmallFileCombiner.class);	
		job.setMapperClass(SmallFileCombinerMapper.class);		
		job.setOutputKeyClass(Text.class);
		job.setOutputValueClass(NullWritable.class);	
		//下面的方式将小文件划分为一个切片。
		job.setInputFormatClass(CombineTextInputFormat.class);
		//如果小文件的总和为224M,将setMaxInputSplitSize中的第二个参数设置成300M的时候,在
		//hdfs://master:9000/output下只会生成一个part-m-00000这种文件
		//如果将setMaxInputSplitSize中的第二个参数设置成150M的时候,在
		//hdfs://master:9000/output下会生成part-m-00000 和 part-m-00001 两个文件
		CombineTextInputFormat.setMaxInputSplitSize(job, 1024*1024*150);
		CombineTextInputFormat.setInputPaths(job, new Path("hdfs://maoyunchao:9000/in/"));
		FileOutputFormat.setOutputPath(job, new Path("hdfs://maoyunchao:9000/output/"));
//		job.setNumReduceTasks(0);		
		job.waitForCompletion(true);
	}
}

2、集群内存不足。进行集群扩容,增加Datanode。
3、在写shell脚本的时候最好在脚本的前面加上source/etc/profile,这样就会去识别环境变量,否则在使用crontab定时执行脚本中的hive -f、hive -e等指令是会报错没有该指令。
4、在终端使用hive -e ''后面跟的是单引号,但是在shell脚本中hive -e ""后面的语句需要使用双引号。
5、在sqoop导出hive数据到mysql时报错check the manual that corresponds to your MySQL server version for the right syntax to use near。经过分析查询发现是mysql jar报的版本问题,刚开始我使用的是5.1.6版本,mysql jar包最好使用5.1.32版本,比较稳定,没有Bug。
6、查询速度过慢。12台机器(16G+8核),14个G,2000万左右的数据量,刚开始业务全部跑完大概需要1个40分钟左右,最后经过各种调优 ,像:Jvm重用、job并行执行、推测执行的关闭、reduce数目的设置、数据倾斜加盐优化(双重group随机后缀操作)、join优化(reduce join转化为map join、SMB join),最后执行时间1小时左右即可完成。其中执行速度最慢的就是外链分析的数据倾斜了,大概需要15分钟左右,优化后大概10分钟左右。
7、在写hql语句时在表前面加上数据库名eg:select * from baobei.pv的方式,否则会去默认的default库下寻找表。
8、把一些udf及一些配置写到$HIVE_HOME/bin下的.hiverc文件中,在每次执行hive语句时都会默认去执行。
9、调试的时候有时候会用到kill一些僵尸任务,杀掉mapreduce任务时可以使用 hadoop job -kill jobID、yarn application -kill ApplicationId的方式。
10、使用orcFile、parquet等的储存方式时直接建表然后导入数据,这样在查询时是会报错的,必须从另一张表上去查询出某些数据插入。eg:insert overwrite table xxx select …不能直接使用load data inpath …。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值