一、Hadoop配置文件修改
(如果要设置集群,必须先设置主机名和hosts,否则DataNode不能和namenode相连接)
1、hadoop-env.sh
修改JAVA_HOME的值
2、core-site.xml
3、hdfs-site.xml
4、mapred-site.xml(将mapred-site.xml.template重命名)
5、yarn-site.xml
二、启动hadoop
1、hadoop/bin运行 ./hdfs -namenode –format
2、hadoop/bin运行 jps 查看java进程
3、hadoop/sbin运行start-dfs.sh
4、hadoop/sbin运行start-yarn.sh
5、hadoop/bin运行 jps 查看java进程
三、使用hadoop
1、hdfs文件系统
路径/hdfsdfs -ls(等文件操作命令) +路径
或者在ip:50070的文件目录查看
四、mapper编程
注: 1、可以手动指定reduce的个数,job.setNumReduceTasks(intnum);
2、防止jar包存放位置写死,可以使用job.setJarByClass(this.class)
3、如果需要在map阶段计算一些小型的计算,可以指定一个combiner,用法与reducer相同,工作在两者之间,并用job.setCombinerClass(MyCom.class)指定类。
五、启动yarn
hadoop jar pv.jar
六、使用技巧
1、当一次不能得到结果时,可以采用两次或者多次的方法。
2、如有需要,可使用key-文件名结合的方式输出map
生成文件名的方法:
3、map和reduce的启动过程是:先实例化map和reduce类,再一行行的执行数据。
在实例化第一次会执行setup一次,且只有一次,在执行map和reduce之前。
在实例化第一次会执行clearup一次,且只有一次,在执行map和reduce之后。
4、如果map和reduce之间的分配方式不能满足,则可以重写partitioner类,再使用
job.setPartitionerClass(MyPartitioner.class)的方法指定。
5、如果要使用自定义的JavaBean,要重写空参数构造方法和toString方法。
6、如果map和reduce的泛型参数要使用自定义的JavaBean,则JavaBean要实现Writeable接口,也要实现两个方法,如下(注意顺序,String类型写writeUTF(String)):
7、如果要比较JavaBean某一个参数的大小,必须让JavaBean实现compareable接口
并实现其方法,用javaBean.property.compare(other.property)
8、如果configuration.set(“属性”,”值”),可以用context.getConfiguration获得configuration,再configuration.getInt(“属性”)的方法获取
cd /usr/hadoop-2.8.2/tmp/dfs/
9、如果要改变排序规则,建造以下类并在mian中指定job.setGroupComparatorClass():
10、如果想输出到不同的文件中,则需要自定义FileOutputFormat,并在job.setOutputFormat()中指定,如下:
还可以使用multipleOutput工具类(注意一定要关闭multipleOutput):
比如如上还可以用以下实现:
public class MyReducerextends Reducer<MyTestBean,NullWritable,Text,Text> {
MultipleOutputsmos;
@Override
protectedvoid setup(Contextcontext) throws IOException,InterruptedException {
mos=newMultipleOutputs(context);
}
@Override
protectedvoid reduce(MyTestBeankey, Iterable<NullWritable>values, Context context)throws IOException,InterruptedException {
int count=0;
for (NullWritablenullWritable:values){
count++;
if (count>1)return;
String name= key.getName();
String num= key.getNum();
//context.write(new Text(name),new Text(num));
mos.write((Object)name,NullWritable.get(),"/out1");
mos.write((Object)num,NullWritable.get(),"/out2");
}
}
@Override
protectedvoid cleanup(Contextcontext) throws IOException,InterruptedException {
mos.close();
}
}
如果不想输出空文件,则需要在main中添加:
LazyOutputFormat.setOutputFormatClass(job,TextOutputFormat.class);
七、常用的实现方法
1、join连接
在main中,加入job.setCacheFiles(),并指定reduce数量为0,再在setup方法中逐行读取数据(用bufferdreader),放入到HashMap中,最后在map阶段连接。
2、topN输出
构建JavaBean的key,用GroupComparator构建比较规则(必须在Javabean中实现writablecomparable接口),让他id相同的(不管评分大小)为一个相同的key,再分发到reduce,最后输出。
八、安全模式
相关的操作命令
Hadoop提供脚本用于对安全模式进行操作,主要命令为:
hadoop dfsadmin -safemode <command>
- 1
command的可用取值如下:
command | 功能 | 备注 |
---|---|---|
get | 查看当前状态 | |
enter | 进入安全模式 | |
leave | 强制离开安全模式 | |
wait | 一直等待直到安全模式结束 |
九、 distcp工具
diatcp是使用map方法的命令
hadoop distcp [option] dir1 dir2
标识 | 描述 | 备注 |
-update | 将dir1与dir2不同的地方更新到dir2,即按照dir1更新dir2 | |
-overwrite | 将dir1覆盖到dir2 | |
-delete | 与-update同用,表示可以删除dir2中比dir1多的文件和目录 | |
-p | 文件的状态属性如权限、大小、副本数都被保留 | |
-i | 忽略失败 | |
参考:https://blog.youkuaiyun.com/yinansheng1/article/details/78402459