//压缩文件
public static void compress(String codecClassName) throws Exception{
Class codecClass = Class.forName(codecClassName);
Configuration conf = new Configuration();
FileSystem fs = FileSystem.get(conf);
CompressionCodec codec = (CompressionCodec)ReflectionUtils.newInstance(codecClass, conf);
//指定压缩文件路径
FSDataOutputStream outputStream = fs.create(new Path("/user/hadoop/text.gz"));
//指定要被压缩的文件路径
FSDataInputStream in = fs.open(new Path("/user/hadoop/aa.txt"));
//创建压缩输出流
CompressionOutputStream out = codec.createOutputStream(outputStream);
IOUtils.copyBytes(in, out, conf);
IOUtils.closeStream(in);
IOUtils.closeStream(out);
}
2)、 采用序列化文件
public void testSeqWrite() throws Exception {
Configuration conf = new Configuration();// 创建配置信息
conf.set("fs.default.name", "hdfs://master:9000");// hdfs默认路径
conf.set("hadoop.job.ugi", "hadoop,hadoop");// 用户和组信息
String uriin = "hdfs://master:9000/ceshi2/";// 文件路径
FileSystem fs = FileSystem.get(URI.create(uriin), conf);// 创建filesystem
Path path = new Path("hdfs://master:9000/ceshi3/test.seq");// 文件名
IntWritable k = new IntWritable();// key,相当于int
Text v = new Text();// value,相当于String
SequenceFile.Writer w = SequenceFile.createWriter(fs, conf, path,k.getClass(), v.getClass());// 创建writer
for (int i = 1; i < 100; i++) {// 循环添加
k.set(i);
v.set("abcd");
w.append(k, v);
}
w.close();
IOUtils.closeStream(w);// 关闭的时候flush
fs.close();
}
3、简述Hbase性能优化的思路
1)、 在库表设计的时候,尽量考虑rowkey和columnfamily的特性
2)、 进行hbase集群的调优:见hbase调优
4、简述Hbase filter的实现原理是什么?结合实际项目经验,写出几个使用filter的场景。
hbase的filter是通过scan设置的,所以是基于scan的查询结果进行过滤。
1)、在进行订单开发的时候,我们使用rowkeyfilter过滤出某个用户的所有订单
2)、在进行云笔记开发时,我们使用rowkey过滤器进行redis数据的恢复。
5、ROWKEY的后缀匹配怎么实现?例如ROWKEY是yyyyMMDD-UserID形式,如果要以UserID为条件查询数据,怎样实现。
使用rowkey过滤器实现
6、简述Hive中的虚拟列作用是什么,使用它的注意事项。
Hive提供了三个虚拟列:
INPUT__FILE__NAME
BLOCK__OFFSET__INSIDE__FILE
ROW__OFFSET__INSIDE__BLOCK
但ROW__OFFSET__INSIDE__BLOCK默认是不可用的,需要设置hive.exec.rowoffset为true才可以。可以用来排查有问题的输入数据。
INPUT__FILE__NAME, mapper任务的输出文件名。
BLOCK__OFFSET__INSIDE__FILE, 当前全局文件的偏移量。对于块压缩文件,就是当前块的文件偏移量,即当前块的第一个字节在文件中的偏移量。
hive> SELECT INPUT__FILE__NAME, BLOCK__OFFSET__INSIDE__FILE, line
> FROM hive_text WHERE line LIKE '%hive%' LIMIT 2;
har://file/user/hive/warehouse/hive_text/folder=docs/
data.har/user/hive/warehouse/hive_text/folder=docs/README.txt 2243
har://file/user/hive/warehouse/hive_text/folder=docs/
data.har/user/hive/warehouse/hive_text/folder=docs/README.txt 3646
7、如果要存储海量的小文件(大小都是几百K~几M),请简述自己的设计方案。
1)、将小文件打成har文件存储
2)、将小文件序列化到hdfs中
8、有两个文本文件,文件中的数据按行存放,请编写MapReduce程序,找到两个文件中彼此不相同的行。
写个mapreduce链 用依赖关系,一共三个mapreduce,第一个处理第一个文件,第二个处理第二个文件,第三个处理前两个的输出结果,
第一个mapreduce将文件去重,第二个mapreduce也将文件去重,第三个做wordcount,wordcount为1的结果就是不同的。
import java.io.IOException;
import java.util.Set;
import java.util.StringTokenizer;
import java.util.TreeSet;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.Mapper.Context;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.util.GenericOptionsParser;
public class FindFriend {
public static class ChangeMapper extends Mapper
结果:
1. AB E:C:D 2. AC E:B 3. AD B:E 4. AE C:B:D 5. BC A:E 6. BD A:E 7. BE C:D:A 8. BF A 9. CD E:A:B 10. CE A:B 11. CF A 12. DE B:A 13. DF A 14. EF A |
需求:
期望:
思路:
将数据导入hive表中,查询时,用电话号码和时间排序即可!
#!/bin/bash ls $1 | while read line do sed -i 's,\$HADOOP_HOME\$,\/home\/aa,g' $1$line echo $1$line done |
脚本:
vi runRemoteCmd.sh
#!/bin/bash $1 ssh -q hadoop@slave1 "$1" ssh -q hadoop@slave2 "$1" |
执行命令
./runRemoteCmd.sh "ls -l" |