标签:hadoop-mapreduce submitter c++-pipes
本篇文章主要是对hadoop pipes编程的一些问题的备注,对于网上常见的问题,并未完全写入。
基础环境:3台基于centos7的虚拟机(1个master,2个slave:slave1、slave2)、hadoop-2.6.0
1. hadoop安装主要参考的网址是:hadoop参考安装
2. linux配置ssh免密码登录,具体参考的是:centos ssh免密码登录
tips:
1. 三个虚拟机的一定要用一样的帐号,即用户名。如果不一样的话,通过ssh进行免密码登录时会出现问题。比如master登录用户为hadoop,slave1登录用户为hadoop1,master通过ssh进行登录slave1时,默认的用户名是当前用户hadoop,而slave1的可登录用户是hadoop1,导致登录不成功,当然可以通过显示指定用户名,比如:ssh hadoop1@slave1的ip的方式进行登录。不过hadoop默认ssh登录时应该是采用当前默认用户名,所以就算ssh配置成功了,机器的用户名不一样,hadoop启动时照样会需要输入相应密码。
2. ssh追加密钥文件时,只需要配置master和slave即可,slave之间不需要再配置。即只需要配置:master与slave1、master与slave2。slave1和slave2之间不需要再配置。
3. 配置hadoop时,最好更换下core-site.xml中的“hadoop.tmp.dir”的路径,其默认路径是“/tmp” ,因为“/tmp”很容易因为权限和被系统自动清理出现问题。
4. hadoop配置完以后,可以通过远程复制命令:“scp”,将hadoop分发到其他机器。
tips:
1. 启动前需要关闭各个机器的防火墙。临时关闭防火前命令:(非root用户,即普通用户)“sudo service firewalld stop”或者(root用户)“service firewalld stop”。查看防火墙状态的命令:“service firewalld status”
2. 如果你对hadoop进行多次格式化,在格式化之前需要删除hdfs-site.xml文件中“dfs.namenode.name.dir”、“dfs.datanode.data.dir”和core-site.xml中的“hadoop.tmp.dir”对应路径下的文件,最好是每个机器都删除。如果没有显示赋值,可以默认路径一般对应分别是:”/tmp/dfs/name”、”/tmp/dfs/data”和”/tmp”,这个主要是为了避免下次启动时namenodeID不一致的问题,感觉只删除”dfs.namenode.name.dir”路径下的文件就可以了,具体没有验证。
3. 关于各个程序的启动情况,如果出现错误,可以查看相应的启动日志。路径是:“hadoop的安装目录/logs”
4. 单独启动hadoop的各个应用程序。具体参考:hadoop启动命令 &单个命令使用说明
5. “sbin/hadoop-daemon.sh start datanode”和”sbin/hadoop-daemons.sh start datanode”的区别:前者是启动master的datanode,后者是启动所有slave节点上的datanode。停止命令,把start改为stop即可。
6. 通过web查看hadoop集群的运行情况。参考官方文档 web查看hadoop情况
7. hadoop自带相应的说明文档docs。路径是:hadoop安装目录/share/doc/hadoop,index.html是文档说明的首页,点击即可进行查看。
运行样例程序需要上传相应的文件和创建目录,这要求hadoop需要将safemode设置为off状态。命令是:”bin/hdfs dfsadmin -safemode leave”
启动java,是执行自带的jar,通过hadoop jar命令,类似如下,先切换到hadoop安装目录:
bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0.jar WordCount /wordcount/input /wordcount/output
具体可参考 官网介绍WordCount & hadoop jar命令说明
执行C++版wordcount,需要下载源码,对其进行编译。官方提供了两种编译方式:maven的mvn和make命令。
下载的是hadoop-2.6.0-src
wordcount的源码路径:“hadoop-2.6.0-src/hadoop-tools/hadoop-pipes”
根据“hadoop-2.6.0-src/hadoop-tools/hadoop-pipes/src/main/native/examples/README.txt”的说明进行编译。复制其内容如下:
1. To run the examples, first compile them:(mvn运行需要解析pom.xml配置文件,所以执行这个命令,需要先切换到“hadoop-2.6.0-src/hadoop-tools/hadoop-pipes/”目录下)
% mvn install -Pdist,native
2. and then copy the binaries to dfs:(mvn生成的可执行文件在target/native/examples/wordcount-simple文件夹下,需要先将其上传到hdfs中)
% hdfs dfs -put target/native/examples/wordcount-simple /examples/bin/
3. create an input directory with text files:
% hdfs dfs -put my-data in-dir
4. and run the word count example:(运行文件需要相应的配置信息,同时注意输入路径in-dir默认是在hdfs文件系统上的user文件夹下(未验证),建议以“/in-dir”这种方式指定输入路径,输出路径也一样)
% mapred pipes -conf src/main/native/examples/conf/word.xml -input in-dir -output out-dir
tips:
1. 通过mapred pipes命令执行执行程序,master是将可执行文件分发到各个slave以后再执行,即访问main函数,所以,如果你在mapreduce程序的main函数中有什么读取文件的操作,他们读取的都是slave的,同时他们运行的环境也是基于slave的,比如配置底层需要的jar包,不能只配置master,重点是配置实际运行程序的slave机器。
2. 第4步使用word.xml,主要是为了设置类似recordreader和recordwriter之类的处理是否是java类,所以也可以不用word.xml文件,直接执行如下命令:
mapred pipes -D hadoop.pipes.java.recordreader=true -D hadoop.pipes.java.recordwriter=true -input /input/sample.txt -output /output -program /examples/bin/wordcount
3. 如果通过hadoop-eclipse-plugin编写mapreduce程序时,在linux中,通过插件设置“Edit Hadoop Location…>Advanced parameters”时,会显示空白,如果等待一段时间(3分钟左右)还不显示,你可以通过上下左右拉大窗口来刷新窗口来显示,如果还是不行,可能需要根据说明进行重新编译一遍插件。
4. “Location name” 为任意字符串,Host是master的ip,不要用字符串“master”,显示用ip,“User name”为master主机的登录账号
根据源码中提供的CMakeLists.txt文件来生成make命令需要的Makefile文件,然后利用Makefile进行编译生成可执行文件。具体如下:
1. 切换到具有CMakeLists.txt的文件夹下。即“hadoop-2.6.0-src/hadoop-tools/hadoop-pipes/src”
2. 直接执行cmake,即“cmake .”注意,“.”表示当前目录,还有cmake可能需要先安装。cmake执行完后会在当前目录下生成Makefile文件。
3. 直接执行make命令,即“make”,不需要指定当前目录
4. 命令执行完成后会在当前目录生成相应的可执行文件,同样需要上传到hdfs和通过mapred pipes命令进行执行。
需要包含的头文件在“hadoop安装目录/include”路径下。需要包含的库文件主要是:
编译时,设置的库目录,在程序具体运行时,会通过LD_LIBRARY_PATH查找相应文件,需要在/etc/profile,即设置系统环境变量的地方,设置查找库所需要的路径,比如:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$JAVA_HOME/jre/lib/amd64/server:$HADOOP_HOME/lib/native
Submitter类的使用如下(Utils是自己写的包含一些功能函数的类,和具体使用Submitter无关):
package test;
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.mapred.FileInputFormat;
import org.apache.hadoop.mapred.FileOutputFormat;
import org.apache.hadoop.mapred.JobConf;
import org.apache.hadoop.mapred.RunningJob;
import org.apache.hadoop.mapred.pipes.Submitter;
public class KMeans_Pipes {
public static final String centerPath="hdfs://192.168.1.104:9000/inputTemp/center/centers.txt";
public static final String inputPath="hdfs://192.168.1.104:9000/inputTemp/data/wine.txt";
public static final String outputPath="hdfs://192.168.1.104:9000/output/kmean";
public static void main(String[] args) {
int i=0;
while(true){
try {
runTask();
if(Utils.compareCenters(centerPath, outputPath)){
Utils.output();
break;
}
System.out.println("第"+(++i)+"次运行结束");
} catch (IOException e) {
e.printStackTrace();
}
}
}
static void runTask() throws IOException{
JobConf jobConf = new JobConf(new Configuration());
// jobConf.setJobName("kmeans:"+num);
FileInputFormat.setInputPaths(jobConf, new Path(inputPath));
FileOutputFormat.setOutputPath(jobConf, new Path(outputPath));
Submitter.setKeepCommandFile(jobConf, true);
Submitter.setExecutable(jobConf,"hdfs://192.168.1.104:9000/examples/bin/MR_KMeans");
Submitter.setIsJavaMapper(jobConf, false);
Submitter.setIsJavaReducer(jobConf, false);
Submitter.setIsJavaRecordReader(jobConf, true);
Submitter.setIsJavaRecordWriter(jobConf, true);
Utils.deletePath(outputPath);
RunningJob rj = Submitter.runJob(jobConf);
// RunningJob rj = Submitter.jobSubmit(jobConf);
// rj.waitForCompletion();
System.out.println(rj.isComplete());
}
}
tips:
1. 程序要打包成jar,通过hadoop jar命令进行执行,不能通过eclipse本地或者hadoop-eclipse-plugin插件执行,会出现问题。
2. 函数说明
RunningJob rj = Submitter.jobSubmit(jobConf);
rj.waitForCompletion();
这两个可以配合使用,来实现等待任务完成后再往下执行。当然也可以只用一个函数,即:
RunningJob rj = Submitter.runJob(jobConf);
注意这个就不要再使用waitForCompletion();函数了,不然会出错误。
编写程序运行时,可能会遇到空指针问题。
1. 可参考local mapreduce遇到的问题 & local mapreduce问题
2. 主要是在当前工程中,添加进去“org.apache.hadoop.mapred.pipes”下的Application.java类,即在工程中新建package,名为“org.apache.hadoop.mapred.pipes”,然后把Application.java复制到该package下来进行修改代码,覆盖原先jar中的Application类。Application.java的位置在:
hadoop源码目录下的:hadoop-mapreduce-project\hadoop-mapreduce-client\hadoop-mapreduce-client-core\src\main\java\org\apache\hadoop\mapred\pipes
3. 修改说明如下:
byte[] password = jobToken.getPassword();
修改为:byte[] password = "no password".getBytes();
if (jobToken != null) {
password = jobToken.getPassword();
}
FSDataOutputStream out = FileSystem.create(localFs, localPath,
new FsPermission("666"));
参考Windows下配置环境变量和需不需要重启问题
一个程序启动时,环境变量被复制到该程序所在的环境中,在该程序执行过程中不会被除该程序以外的其他程序所改变。也就是说,假设我们启动了一个cmd程序,然后通过控制面板修改了环境变量设置,但是已经启动了的cmd所拥有的环境变量并不会被改变。如果我们在修改环境变量之后启动cmd程序,则该程序将拥有新的环境变量。
那么结论就很明显了:修改环境变量之后,如果受影响的是应用程序,那么只要简单地重新启动此应用程序,环境变量的修改就会反映到该程序中,而不必重新启动计算机;但是,如果受影响的是系统服务,就必须重新启动才能将环境变量的修改反映到系统服务中(因为没有办法在不重启计算机的情况下重新启动系统服务管理器)。
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:hadoop-mapreduce submitter c++-pipes
原文地址:http://blog.csdn.net/syx19930206/article/details/46999555