hadoop单机配置运行hadoop和mapreducee用开启吗

Ubuntu Hadoop2.7下使用Eclipse编译运行MapReduce程序 - 简书
Ubuntu Hadoop2.7下使用Eclipse编译运行MapReduce程序
本文不生产内容,只是以下内容的搬运工
本文基于Ubuntu 14.04 64bit, Hadoop2.7
Hadoop伪分布式安装配置
创建Hadoop用户
首先创建Hadoop用户组
sudo addgroup hadoop
然后创建Hadoop用户
sudo adduser -ingroup hadoop hadoop
这会提示输入hadoop用户的密码。
接下来为hadoop用户添加权限
sudo gedit /etc/sudoers
hadoop-user-priviledge.png
用新创建的Hadoop用户登录
sudo apt-get install openssh-server
安装完成后,启动服务
sudo /etc/init.d/ssh start
设置免登陆密码,生成私钥和公钥
ssh-keygen -t rsa -P ""
此时会再/home/hadoop/.ssh下生成两个文件,id_rsa和id_rsa.pub,前者为私钥,后者为公钥。
下面我们将公钥追加到authorized_keys中,它用户保存所有允许以当前用户身份登录到ssh客户端用户的公钥内容。
cat ~/.ssh/id_rsa.pub && ~/.ssh/authorized_keys
ssh localhost
安装JAVA环境
从官网 x64下载到本地jdk-8u73-linux-x64.gz然后解压
tar -zxvf jdk-8u73-linux-x64.gz
我们这里想把JAVA安装到/usr/local/java,因此把解压出的文件移动到这里
sudo mv jdk1.8.0_71 /usr/local/jdk1.8.0_71
安装Hadoop
首先,从官网下载Hadoop 2.7
tar -zxvf hadoop-2.7.0.tar.gz
本实验中我们想把hadoop安装在/usr/local下面,因此把解压出来的文件夹移动到/usr/local/hadoop
sudo mv hadoop-2.7.0 /usr/local/hadoop
配置环境变量
首先我们需要知道上一步中JAVA的安装路径,上一步我们安装到了/usr/local/jdk1.8.0_71。打开 ~/.bashrc
sudo gedit ~/.bashrc
该命令会打开该文件的编辑窗口,在文件末尾追加下面内容,然后保存,关闭编辑窗口。
#HADOOP VARIABLES START
export JAVA_HOME=/usr/local/jdk1.8.0_71
export HADOOP_INSTALL=/usr/local/hadoop
export PATH=$PATH:$HADOOP_INSTALL/bin
export PATH=$PATH:$HADOOP_INSTALL/sbin
export HADOOP_MAPRED_HOME=$HADOOP_INSTALL
export HADOOP_COMMON_HOME=$HADOOP_INSTALL
export HADOOP_HDFS_HOME=$HADOOP_INSTALL
export YARN_HOME=$HADOOP_INSTALL
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_INSTALL/lib/native
export HADOOP_OPTS="-Djava.library.path=$HADOOP_INSTALL/lib"
#HADOOP VARIABLES END
执行下面命,使添加的环境变量生效:
source ~/.bashrc
配置hadoop-env
打开hadoop-env.sh
sudo gedit /usr/local/hadoop/etc/hadoop/hadoop-env.sh
找到JAVA_HOME变量,修改此变量如下
export JAVA_HOME=/usr/local/jdk1.8.0_71
WordCount单机模式测试
至此,我们的单机模式已经安装完成。通过hadoop自带的WordCount实例验证是否安装成功。
cd /usr/local/hadoop
mkdir input
cp README.txt input
bin/hadoop jar share/hadoop/mapreduce/sources/hadoop-mapreduce-examples-2.4.0-sources.jar org.apache.hadoop.examples.WordCount input output
然后查看结果
cat output/*
伪分布式环境配置
Hadoop 可以在单节点上以伪分布式的方式运行,Hadoop 进程以分离的 Java 进程来运行,节点既作为 NameNode 也作为 DataNode,同时,读取的是 HDFS 中的文件。Hadoop 的配置文件位于 /usr/local/hadoop/etc/hadoop/ 中,伪分布式需要修改2个配置文件 core-site.xml 和 hdfs-site.xml 。Hadoop的配置文件是 xml 格式,每个配置以声明 property 的 name 和 value 的方式来实现。修改配置文件 core-site.xml (通过 gedit 编辑会比较方便: gedit ./etc/hadoop/core-site.xml),将当中的
&configuration&
&/configuration&
&configuration&
&property&
&name&hadoop.tmp.dir&/name&
&value&file:/usr/local/hadoop/tmp&/value&
&description&Abase for other temporary directories.&/description&
&/property&
&property&
&name&fs.defaultFS&/name&
&value&hdfs://localhost:9000&/value&
&/property&
&/configuration&
同样的,修改配置文件 hdfs-site.xml
&configuration&
&property&
&name&dfs.replication&/name&
&value&1&/value&
&/property&
&property&
&name&dfs.namenode.name.dir&/name&
&value&file:/usr/local/hadoop/tmp/dfs/name&/value&
&/property&
&property&
&name&dfs.datanode.data.dir&/name&
&value&file:/usr/local/hadoop/tmp/dfs/data&/value&
&/property&
&/configuration&
配置完成后,执行 NameNode 的格式化
./bin/hdfs namenode -format
成功的话,会看到 “successfully formatted” 和 “Exitting with status 0″ 的提示,若为 “Exitting with status 1″ 则是出错。
接着开启 NameNode 和 DataNode 守护进程。
./sbin/start-dfs.sh
启动时可能会出现如下 WARN 提示:WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform… using builtin-java classes where applicable WARN 提示可以忽略,并不会影响正常使用。
启动完成后,可以通过命令 jps来判断是否成功启动,若成功启动则会列出如下进程:“NameNode”、”DataNode” 和 “SecondaryNameNode”(如果 SecondaryNameNode 没有启动,请运行 sbin/stop-dfs.sh 关闭进程,然后再次尝试启动尝试)。如果没有 NameNode 或 DataNode ,那就是配置不成功,请仔细检查之前步骤,或通过查看启动日志排查原因。
install-hadoop-16-jps.png
一般情况下,若是 DataNode 没有启动,可尝试如下的
./sbin/stop-dfs.sh
rm -r ./tmp 删除 tmp 文件,注意这会删除 HDFS 中原有的所有数据
./bin/hdfs namenode -format 重新格式化 NameNode
./sbin/start-dfs.sh
成功启动后,可以访问 Web 界面
查看 NameNode 和 Datanode 信息,还可以在线查看 HDFS 中的文件。
install-hadoop-17-web-ui.png
运行Hadoop伪分布式实例
上面的单机模式,WordCount读取的是本地数据,伪分布式读取的则是 HDFS 上的数据。要使用 HDFS,首先需要在 HDFS 中创建用户目录:
./bin/hdfs dfs -mkdir -p /user/hadoop
接着将 ./etc/hadoop 中的 xml 文件作为输入文件复制到分布式文件系统中,即将 /usr/local/hadoop/etc/hadoop 复制到分布式文件系统中的 /user/hadoop/input 中。我们使用的是 hadoop 用户,并且已创建相应的用户目录 /user/hadoop ,因此在命令中就可以使用相对路径如 input,其对应的绝对路径就是 /user/hadoop/input:
./bin/hdfs dfs -mkdir input
./bin/hdfs dfs -put ./etc/hadoop/*.xml input
复制完成后,可以通过如下命令查看文件列表:
./bin/hdfs dfs -ls input
伪分布式运行 MapReduce 作业的方式跟单机模式相同,区别在于伪分布式读取的是HDFS中的文件
./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar input output
安装配置Eclipse
安装Hadoop Eclipse Plugin
下载地址 (备用下载地址:)
下载后,将 release 中的 hadoop-eclipse-kepler-plugin-2.6.0.jar复制到 Eclipse 安装目录的 plugins 文件夹中,重启 Eclipse。
配置Hadoop Eclipse Plugin
在继续配置前请确保已经开启了 Hadoop。即通过jps可以看到NameNode,DataNode,SecondaryNameNode都已在运行。
启动 Eclipse 后就可以在左侧的Project Explorer中看到 DFS Locations
hadoop-build-project-using-eclipse-03.png
插件需要进一步的配置。第一步:选择 Window 菜单下的 Preference。此时会弹出一个窗体,窗体的左侧会多出 Hadoop Map/Reduce 选项,点击此选项,选择 Hadoop 的安装目录(如/usr/local/hadoop,Ubuntu不好选择目录,直接输入就行)。
hadoop-build-project-using-eclipse-05.png
第二步:切换 Map/Reduce 开发视图选择 Window 菜单下选择 Open Perspective -& Other,弹出一个窗体,从中选择 Map/Reduce 选项即可进行切换。
第三步:建立与 Hadoop 集群的连接点击 Eclipse软件右下角的 Map/Reduce Locations 面板,在面板中单击右键,选择 New Hadoop Location
在弹出来的 General 选项面板中,General 的设置要与 Hadoop 的配置一致。一般两个 Host 值是一样的,如果是伪分布式,填写 localhost 即可。设置 fs.defaultFS 为 hdfs://localhost:9000,则 DFS Master 的 Port 要改为 9000。Map/Reduce(V2) Master 的 Port 用默认的即可,Location Name 随意填写。
最后的设置如下图所示:
hadoop-build-project-using-eclipse-08.png
在 Eclipse 中创建 MapReduce 项目
点击 File 菜单,选择 New -& Project…:选择 Map/Reduce Project,点击 Next。填写 Project name 为 WordCount 即可,点击 Finish 就创建好了项目。
接着右键点击刚创建的 WordCount 项目,选择 New -& Class需要填写两个地方:在 Package 处填写 org.apache.hadoop.examples;在 Name 处填写 WordCount。
创建 Class 完成后,在 Project 的 src 中就能看到 WordCount.java 这个文件。将如下 WordCount 的代码复制到该文件
package org.apache.hadoop.
import java.io.IOE
import java.util.StringT
import org.apache.hadoop.conf.C
import org.apache.hadoop.fs.P
import org.apache.hadoop.io.IntW
import org.apache.hadoop.io.T
import org.apache.hadoop.mapreduce.J
import org.apache.hadoop.mapreduce.M
import org.apache.hadoop.mapreduce.R
import org.apache.hadoop.mapreduce.lib.input.FileInputF
import org.apache.hadoop.mapreduce.lib.output.FileOutputF
import org.apache.hadoop.util.GenericOptionsP
public class WordCount {
public static class TokenizerMapper
extends Mapper&Object, Text, Text, IntWritable&{
private final static IntWritable one = new IntWritable(1);
private Text word = new Text();
public void map(Object key, Text value, Context context
) throws IOException, InterruptedException {
StringTokenizer itr = new StringTokenizer(value.toString());
while (itr.hasMoreTokens()) {
word.set(itr.nextToken());
context.write(word, one);
public static class IntSumReducer
extends Reducer&Text,IntWritable,Text,IntWritable& {
private IntWritable result = new IntWritable();
public void reduce(Text key, Iterable&IntWritable& values,
Context context
) throws IOException, InterruptedException {
int sum = 0;
for (IntWritable val : values) {
sum += val.get();
result.set(sum);
context.write(key, result);
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();
if (otherArgs.length != 2) {
System.err.println("Usage: wordcount &in& &out&");
System.exit(2);
Job job = new Job(conf, "word count");
job.setJarByClass(WordCount.class);
job.setMapperClass(TokenizerMapper.class);
job.setCombinerClass(IntSumReducer.class);
job.setReducerClass(IntSumReducer.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
FileInputFormat.addInputPath(job, new Path(otherArgs[0]));
FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));
System.exit(job.waitForCompletion(true) ? 0 : 1);
通过 Eclipse 运行 MapReduce
在运行 MapReduce 程序前,还需要执行一项重要操作(也就是上面提到的通过复制配置文件解决参数设置问题):将 /usr/local/hadoop/etc/hadoop 中将有修改过的配置文件(如伪分布式需要 core-site.xml 和 hdfs-site.xml),以及 log4j.properties 复制到 WordCount 项目下的 src 文件夹(~/workspace/WordCount/src)中:
cp /usr/local/hadoop/etc/hadoop/core-site.xml ~/workspace/WordCount/src
cp /usr/local/hadoop/etc/hadoop/hdfs-site.xml ~/workspace/WordCount/src
cp /usr/local/hadoop/etc/hadoop/log4j.properties ~/workspace/WordCount/src
复制完成后,务必右键点击 WordCount 选择 refresh 进行刷新(不会自动刷新,需要手动刷新),可以看到文件结构如下所示
hadoop-build-project-using-eclipse-17.png
选择 Run As -& Run Configurations,在此处可以设置运行时的相关参数。切换到 “Arguments” 栏,在 Program arguments 处填写 “input output” 就可以了。这里的input即为之前创建在hadoop上的input路径。
hadoop-build-project-using-eclipse-17.png
至此,你就可以使用 Eclipse 方便的进行 MapReduce程序的开发了。hadoop的单机配置
利用vim /etc/sysconfig/network命令修改主机名称。
Ssh&security shell
登录远程服务器
$ ssh user@host
如果本地用户名与远程用户名一致,登录时可以省略用户名。
$ ssh host
The authenticity of host 'host (12.18.429.21)' can't be established.
  RSA key fingerprint is 98:2e:d7:e0:de:9f:ac:67:28:c2:42:2d:37:16:58:4d.
Are you sure you want to continue connecting (yes/no)?
这段话的意思是,无法确认host主机的真实性,只知道它的公钥指纹,问你还想继续连接吗?
所谓"公钥指纹",是指公钥长度较长(这里采用RSA算法,长达1024位),很难比对,所以对其进行MD5计算,将它变成一个128位的指纹。上例中是98:2e:d7:e0:de:9f:ac:67:28:c2:42:2d:37:16:58:4d,再进行比较,就容易多了。
很自然的一个问题就是,用户怎么知道远程主机的公钥指纹应该是多少?回答是没有好办法,远程主机必须在自己的网站上贴出公钥指纹,以便用户自行核对。
假定经过风险衡量以后,用户决定接受这个远程主机的公钥。
同意接受远程主机公钥
Are you sure you want to continue connecting (yes/no)? yes
系统提示认可
Warning: Permanently added 'host,12.18.429.21' (RSA) to the list of known hosts.
Password: (enter password)
当完成以上几步以后,就可以登录到远程服务器端了。当远程主机的公钥被接受以后,它就会被保存在文件$HOME/.ssh/known_hosts之中。下次再连接这台主机,系统就会认出它的公钥已经保存在本地了,从而跳过警告部分,直接提示输入密码。这样有一个缺点,就是每一次登录的时候都要输入密码,这样的操作是比较繁琐的。
1、&机器A发送自己的公钥到机器B,这个时候机器B有了机器A的公钥
2、&机器B发送一个随机的字符串向机器A
3、&机器A利用自己的私钥把字符串加密
4、&机器A把加密后的字符串再次发送给机器B
5、&机器B利用公钥解密字符串,如果和原来的一样,则OK。
1、&生成自己的公钥和私钥
$ ssh-keygen
2、&把生成的公钥copy到远程机器上
$ ssh-copy-id user@host
3、&远程主机的authorized_keys文件
在远程主机上生成了一个authorized_keys文件,保存公钥的。
4、当再次访问的时候就不需要输入密码了。
在/home下创建一个文件夹app
jdk解压到app下
调用tar &zxvf 文件的目录 &&&的命令把jdk解压缩在app目录下
命令解释:
tar &zxvf &文件的路径
&&f:指定文件的名称
&&z:以gz结尾的文件就是用gzip压缩的结果。与gzip相对的就是gunzip,这个参数的作用就是用来调用gzip。
&&X:为解开的意思
&&Z:详细报告处理文件的信息
转到jdk的bin目录下,输出java命令
[root@localhost bin]# ./java
Usage: java [-options] class [args...]
&&&&&&&&&&&(to execute a class)
&&&or &java [-options] -jar jarfile [args...]
&&&&&&&&&&&(to execute a jar file)
where options include:
&&&&-d32 &&&&&&&&&use a 32-bit data model if available
&&&&-d64 &&&&&&&&&use a 64-bit data model if available
&&&&-server &&&&&&to select the "server" VM
&&&&&&&&&&&&&&&&&&The default VM is server.
&&&&-cp &class search path of directories and zip/jar files&
&&&&-classpath &class search path of directories and zip/jar files&
&&&&&&&&&&&&&&&&&&A : separated list of directories, JAR archives,
&&&&&&&&&&&&&&&&&&and ZIP archives to search for class files.
当离开bin这个目录,输出java命令
[root@localhost bin]# cd ..
[root@localhost jdk1.7.0_45]# java
bash: java: command not found
[root@localhost jdk1.7.0_45]#
上述的内容很简单:不识别java这个命令
设置环境变量
export JAVA_HOME=/home/app/jdk1.7.0_45/
export PATH=$PATH:$JAVA_HOME/bin
把这两行配置放入到/etc/profile以后,要做source /etc/profile这样一个命令。
这样就设置了环境变量。
[root@localhost /]# echo $JAVA_HOME
/home/app/jdk1.7.0_45/
可以利用该命令看环境变量。
默认的配置文件
在hadoop-hdfs.jar包中,有一个配置文件
Hadoop-default.xml文件
在hadoop-common.jar包中,有一个配置文件
core-default.xml文件
修改hadoop-env.sh
主要是修改java_home的路径,在hadoop-env.sh的第27行。
把export JAVA_HOME=${JAVA_HOME}修改成具体的路径
[root@localhost hadoop]# vim hadoop-env.sh
export JAVA_HOME=${JAVA_HOME}&export JAVA_HOME=/home/app/jdk1.7.0_45/
[root@localhost hadoop]# source hadoop-env.sh
如果比较难找,利用: set nu命令可以显示行数
修改core-site.xml
[root@localhost hadoop]# vim core-site.xml
原来的内容:
&configuration&
&/configuration&
现在的内容:
&configuration&
&&&&&&&&&property&
&&&&&&&&&&&&&&&&&name&fs.defaultFS&/name&&&namenode的名字
&&&&&&&&&&&&&&&&&value&hdfs://zd01:9000&/value&&&namenode的地址
&&&&&&&&&/property&
&&&&&&&&&property&
&&&&&&&&&&&&&&&&&name&hadoop.tmp.dir&/name&&&文件存储的名称
&&&&&&&&&&&&&&&&&value&/home/app/hadoop-2.6.0/tmp&/value&&&&文件存储的地址
&&&&&&&&&/property&
文件存储路径
data节点的路径
name节点的路径
修改hdfs-site.xml
原来的内容
&configuration&
&/configuration&
现在的内容:
&configuration&
&&&&&&&&&property&
&&&&&&&&&&&&&&&&&name&dfs.replication&/name&&&//指的是hdfs的副本的数量,包括自己。
&&&&&&&&&&&&&&&&&value&3&/value&
&&&&&&&&&/property&
&/configuration&
修改mapred-site.xml
说明:在/etc/hadoop的目录下,只有一个mapred-site.xml.template文件,所以必须改名
[root@localhost hadoop]# mv mapred-site.xml.template mapred-site.xml
在mapred-site.xml文件中
原来的文件
&configuration&
&/configuration&
现在的文件
&configuration&
&&&&&&&&&property&&&//指明mapreduce运行在yarn上
&&&&&&&&&&&&&&&&&name&mapreduce.framework.name&/name&
&&&&&&&&&&&&&&&&&value&yarn&/value&
&&&&&&&&&/property&
&/configuration&
修改yarn-site.xml
原来的值:
&configuration&
&!-- Site specific YARN configuration properties --&
&/configuration&
现在的值:
&configuration&
&&&&&&&&&property&
//指定resourcemanager的地址
&&&&&&&&&&&&&&&&&name&yarn.resourcemanager.hostname&/name&
&&&&&&&&&&&&&&&&&value&zd01&/value&
&&&&&&&&&/property&
&&&&&&&&&property&
//reduce获取数据的方式
&&&&&&&&&&&&&&&&&name&yarn.nodemanager.aux-services&/name&
&&&&&&&&&&&&&&&&&value&mapreduce_shuffle&/value&
&&&&&&&&&/property&
&/configuration&
修改slaves
存放的是datanode节点的名称
配置hadoop的环境变量
export HADOOP_HOME=/home/app/hadoop-2.6.0/
export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin:$ANT_HOME/bin
格式化namenode
hdfs namenode &format(Hadoop namenode &format &以前的方式)
在格式化的时候,会有这样的输出:
Storage directory /tmp/hadoop-root/dfs/name has been successfully formatted
1、&清空namenode目录下的所有的文件,上图中的tmp/dfs/name下的所有的内容就是要清空的内容
2、&创建一些文件,例如:fsimage,edits文件
启动hadoop
在/home/app/hadoop-2.6.0/sbin目录下
[root@localhost sbin]# start-all.sh
阅读(...) 评论()MapReduce中设置全局变量-大数据学习-about云开发
后使用快捷导航没有帐号?
只需一步,快速开始
扫一扫,访问微社区
查看: 55801|回复: 6
MapReduce中设置全局变量
主题帖子积分
问题导读:
1.MapReduce的应用场景是什么?
2.如何通过Configuration来设置全局变来那个?
3.如何获取设置的全局参数?
实际项目中遇到这样一个场景,需要运行一个MapReduce统计一些数据中的最大最小平均值等特性,将结果存入到HBase中。存结果的同时还要记录这次分析任务的编号,即所有的Reduce产生的结果中都要包含这个任务编号这个字段。当然我们可以把这个任务编号放到输入文件中的每一行中,作为输入数据的一部分,不过这样做显然太不专业,无端的增加了要处理的数据量,加重网络负担。经过网上搜索,发现可以用Configuration来实现。具体过程:
提交job的函数中
Configuration conf = new Configuration();
conf.setStrings(&job_parms&, &aaabbc&); //关键就是这一句 & && &&&Job job = new Job(conf, &load analysis&);& && &&& & && &&&job.setJarByClass(LoadAnalysis.class); & && &&&job.setMapperClass(LoadMapper.class); & && &&&job.setReducerClass(LoadIntoHbaseReduce.class); & && &&&job.setMapOutputKeyClass(Text.class); & && &&&job.setMapOutputValueClass(Text.class);
& && &&&FileInputFormat.addInputPath(job, new Path(otherArgs[0]));复制代码Mapper类中重写setup函数
&&@Override & && &&&protected void setup(Context context) & && && && && & throws IOException, InterruptedException { & && && && &try { & && && && &&& & && && && && & //从全局配置获取配置参数 & && && && && & Configuration conf = context.getConfiguration(); & && && && && & String parmStr = conf.get(&job_parms&); //这样就拿到了 & && && && && &
& && && && && &...... & && && && && &
& && && && &} catch (SQLException e) { & && && && && &
& && && && && & e.printStackTrace(); & && && && &} & && && && & & && &&&}复制代码
当然 Reduce类中也可以同样操作
欢迎加入about云群 、 ,云计算爱好者群,关注
主题帖子积分
上面这个方法有一个限制:
conf.set()方法只能传递String类型的变量,如果在mapper或reducer中更合适使用别的类型(比如List,Map等),则需要通过一些方法来转换,而如果转换方法比较复杂或者数据量比较大,则对整个程序的效率会产生很大的影响,因为上面这种方法每次调用map函数都会进行同样的转换,这种重复性的工作是不可容忍的,并且也违反了我们使用全局变量的初衷。
替代的方法是将static变量定义为mapper类的成员变量,并在static块或static成员函数中进行初始化,这样整个mapper过程只需对static变量初始化一次,这对效率会有很大的提高。
程序结构如下:
& && &&&public class myMR{
& && && & public static class myMapper extends Mapper&Text, Text, Text, Text&{
& && && && && &private static Set&**&
& && && && && &//other static variable
& && && && && &static{
& && && && && && &&&//initialize 'subglobal'
& && && && && &}
& && && && && &//other static blocks
& && && && && &public void map(Text key, Text value, Context context)
& && && && && && && && && && && && &&&throws IOException, InterruptedException{
& && && && && && &&&//直接使用subglobal
& && && && && &}
& && && & }
& && && & public static class myReducer extends Reducer&Text, Text, Text, Text&{
& && && && && &public void reducer(Text key, Iterable&Text&, Context context)
& && && && && && && && && && && && & throws IOException, InterruptedException{
& && && && && && && &//reducer process
& && && && && &}
& && && & }
& && && & public static void main(String[] args){
& && && && && &//your job
& && && & }
对java熟悉的话很容易就可以看出来,这只是个static对象初始化问题。但是这种方法使用的并不是mapper和reducer角度上的全局变量,而只是站在某个mapper task角度上的“全局变量”。而这种情况下除了使用static变量及其初始化块这种方法之外,还可以添加自定义的setup(Context)和close(Context)函数来初始化,这两个方法只在某mapper或reducer task开始和结束的时候分别调用一次,可以起到与上面代码所用方法一样的效果。
欢迎加入about云群 、 ,云计算爱好者群,关注
主题帖子积分
找到一些关于这方面的资料,补充一下:
mapreduce编程全局变量:conf.set().get()
文件reduce输出作为map输入:中间临时文件sequencefile格式(map输入三种格式之一)
reduce结果排序:setPartitionerClass(TotalOrderPartitioner.class)
获取输入文件名:context.get
全局文件:hadoop有distributed cache来保存全局文件,保证所有node都可以访问,使用类名为DistributedCache
欢迎加入about云群 、 ,云计算爱好者群,关注
主题帖子积分
中级会员, 积分 844, 距离下一级还需 156 积分
中级会员, 积分 844, 距离下一级还需 156 积分
写的比较好,值得一看
主题帖子积分
中级会员, 积分 442, 距离下一级还需 558 积分
中级会员, 积分 442, 距离下一级还需 558 积分
值得一看的帖子,谢谢分享
主题帖子积分
中级会员, 积分 656, 距离下一级还需 344 积分
中级会员, 积分 656, 距离下一级还需 344 积分
学习了,正好遇到这方面问题
主题帖子积分
中级会员, 积分 409, 距离下一级还需 591 积分
中级会员, 积分 409, 距离下一级还需 591 积分
经常参与各类话题的讨论,发帖内容较有主见
经常帮助其他会员答疑
活跃且尽责职守的版主
为论坛做出突出贡献的会员
站长推荐 /4
云计算hadoop视频大全(新增 yarn、flume|storm、hadoop一套视频
等待验证会员请验证邮箱
新手获取积分方法
技术类问答,解决学习openstack,hadoop生态系统中遇到的问题
Powered by

我要回帖

更多关于 hadoop的mapreduce 的文章

 

随机推荐