当前位置:首页>开发>正文

hadoop配置bashrc和profile有什么区别 Hadoop中单机模式和伪分布式的区别是什么

2023-07-06 05:35:57 互联网 未知 开发

 hadoop配置bashrc和profile有什么区别 Hadoop中单机模式和伪分布式的区别是什么

hadoop配置bashrc和profile有什么区别

/etc/profile、/etc/bashrc、~/.bash_profile、~/.bashrc很容易混淆,他们之间有什么区别?它们的作用到底是什么?
/etc/profile: 用来设置系统环境参数,比如$PATH. 这里面的环境变量是对系统内所有用户生效的。
/etc/bashrc: 这个文件设置系统bash shell相关的东西,对系统内所有用户生效。只要用户运行bash命令,那么这里面的东西就在起作用。
~/.bash_profile: 用来设置一些环境变量,功能和/etc/profile 类似,但是这个是针对用户来设定的,也就是说,你在/home/user1/.bash_profile 中设定了环境变量,那么这个环境变量只针对 user1 这个用户生效.
~/.bashrc: 作用类似于/etc/bashrc, 只是针对用户自己而言,不对其他用户生效。
另外/etc/profile中设定的变量(全局)的可以作用于任何用户,而~/.bashrc等中设定的变量(局部)只能继承/etc/profile中的变量,他们是"父子"关系.
~/.bash_profile 是交互式、login 方式进入 bash 运行的,意思是只有用户登录时才会生效。
~/.bashrc 是交互式 non-login 方式进入 bash 运行的,用户不一定登录,只要以该用户身份运行命令行就会读取该文件。

Hadoop中单机模式和伪分布式的区别是什么

单机(非分布式)模式
这种模式在一台单机上运行,没有分布式文件系统,而是直接读写本地操作系统的文件系统。
注意事项:运行bin/hadoopjarhadoop-0.16.0-examples.jarwordcounttest-intest-out时,务必注意第一个参数是jar,不是-jar,当你用-jar时,不会告诉你是参数错了,报告出来的错误信息是:Exceptioninthread"main"java.lang.NoClassDefFoundError:org/apache/hadoop/util/ProgramDriver,笔者当时以为是classpath的设置问题,浪费了不少时间。通过分析bin/hadoop脚本可知,-jar并不是bin/hadoop脚本定义的参数,此脚本会把-jar作为Java的参数,Java的-jar参数表示执行一个Jar文件(这个Jar文件必须是一个可执行的Jar,即在MANIFEST中定义了主类),此时外部定义的classpath是不起作用的,因而会抛出java.lang.NoClassDefFoundError异常。而jar是bin/hadoop脚本定义的参数,会调用Hadoop自己的一个工具类RunJar,这个工具类也能够执行一个Jar文件,并且外部定义的classpath有效。
伪分布式运行模式
这种模式也是在一台单机上运行,但用不同的Java进程模仿分布式运行中的各类结点(NameNode,DataNode,JobTracker,TaskTracker,SecondaryNameNode),请注意分布式运行中的这几个结点的区别:从分布式存储的角度来说,集群中的结点由一个NameNode和若干个DataNode组成,另有一个SecondaryNameNode作为NameNode的备份。从分布式应用的角度来说,集群中的结点由一个JobTracker和若干个TaskTracker组成,JobTracker负责任务的调度,TaskTracker负责并行执行任务。TaskTracker必须运行在DataNode上,这样便于数据的本地计算。JobTracker和NameNode则无须在同一台机器上。

hadoop 配置问题

bin/hadoop-daemon.sh start DataNode,这个命令是添加节点的时候才会用到的,如果你是在添加节点,那么前提要让新添加的这台datanode和已经配置好的机器可以无密码访问,配置也要一样,比如说hadoop/conf文件下的配置,java的安装等等。然后在去执行上面的命令。

Hadoop中mapred包和mapreduce包的区别

今天写了段代码突然发现,很多类在mapred和mapreduce中分别都有定义,下面是小菜写的一段代码:
public class MyJob extends Configured implements Tool
{

public static class MapClass extends MapReduceBase implements Mapper
{//
public void map(Text key, Text value, OutputCollector output, Reporter reporter) throws IOException
{
output.collect(value, key)
}

}

public static class Reduce extends MapReduceBase implements Reducer
{

@Override
public void reduce(Text key, Iterator values, OutputCollector output, Reporter reporter) throws IOException
{
String csv = ""
while (values.hasNext())
{
csv = csv.length() > 0 ? "," : ""
csv = values.next().toString()
}
output.collect(key, new Text(csv))
}

}

@Override
public int run(String[] args) throws Exception
{
Configuration conf = getConf()

JobConf job = new JobConf(conf, MyJob.class) //JobConf job = new JobConf(conf, MyJob.class)

Path in = new Path(args[0])
Path out = new Path(args[1])
FileInputFormat.setInputPaths(job, in)
FileOutputFormat.setOutputPath(job, out)

job.setJobName("MyJob")
job.setMapperClass(MapClass.class)
job.setReducerClass(Reduce.class)

job.setInputFormat(KeyValueTextInputFormat.class)
job.setOutputFormat(TextOutputFormat.class)
job.setOutputKeyClass(Text.class)
job.setOutputValueClass(Text.class)
job.set("key.value.separator.in.input.line", ",")

JobClient.runJob(job)

return 0
}

public static void main(String[] args) throws Exception
{
// TODO Auto-generated method stub
int res = ToolRunner.run(new Configuration(), new MyJob(), args)
System.exit(res)
}
}

主要看run方法:

上面代码中的Jobconf无可厚非,只有在mapred包中有定义,这个没问题。
但是FileInputFormat和FileOutputFormat在mapred和mapreduce中都有定义,刚开始脑海里对这些都没有概念,就引用了mapreduce中的FileInputFormat和FIleOutputFormat。
这样操作就带来了后面的问题
FileInputFormat.setInputPaths(job, in)
FileOutputFormat.setOutputPath(job, out)

这两条语句不能通过编译,为什么呢,因为FileInputFormat.setInputPaths和FileOutputFormat.setOutputPath的第一个参数都是Job,而不是JobConf,找了很多资料,由于对Hadoop了解少,所以找资料没有方向感,这也是学习新东西效率低下的原因,如果有哪位大牛,知道怎么克服效率低下的问题,请不吝赐教!
后来,无意中,看到mapred包中也有这两个类的定义,于是火箭速度修改为mapred下的包,OK,顺利通过编译!
下面还有 job.setOutputFormat(TextOutputFormat.class)语句编译不同通过,提示参数需要扩展。。。的参数;于是小菜也去mapred下面查找是否存在此类,正如期望,也存在此类,当即立段,修改为此包下的类,顺利编译通过,此时,颇有成就感!

可是现在小菜发现,mapred包下和mapreduce包下同时都存在又相应的类,不知道是为什么,那么下面就有目标的请教搜索引擎啦,呵呵,比刚才有很大进步。
结果令小菜很失望,就找到了一个符合理想的帖子。但是通过这个帖子,小菜知道了,mapred代表的是hadoop旧API,而mapreduce代表的是hadoop新的API。
OK,小菜在google输入框中输入“hadoop新旧API的区别”,结果很多。看了之后,又结合权威指南归结如下:
1. 首先第一条,也是小菜今天碰到这些问题的原因,新旧API不兼容。所以,以前用旧API写的hadoop程序,如果旧API不可用之后需要重写,也就是上面我的程序需要重写,如果旧API不能用的话,如果真不能用,这个有点儿小遗憾!
2. 新的API倾向于使用抽象类,而不是接口,使用抽象类更容易扩展。例如,我们可以向一个抽象类中添加一个方法(用默认的实现)而不用修改类之前的实现方法。因此,在新的API中,Mapper和Reducer是抽象类。
3. 新的API广泛使用context object(上下文对象),并允许用户代码与MapReduce系统进行通信。例如,在新的API中,MapContext基本上充当着JobConf的OutputCollector和Reporter的角色。
4. 新的API同时支持"推"和"拉"式的迭代。在这两个新老API中,键/值记录对被推mapper中,但除此之外,新的API允许把记录从map()方法中拉出,这也适用于reducer。分批处理记录是应用"拉"式的一个例子。
5. 新的API统一了配置。旧的API有一个特殊的JobConf对象用于作业配置,这是一个对于Hadoop通常的Configuration对象的扩展。在新的API中,这种区别没有了,所以作业配置通过Configuration来完成。作业控制的执行由Job类来负责,而不是JobClient,并且JobConf和JobClient在新的API中已经荡然无存。这就是上面提到的,为什么只有在mapred中才有Jobconf的原因。
6. 输出文件的命名也略有不同,map的输出命名为part-m-nnnnn,而reduce的输出命名为part-r-nnnnn,这里nnnnn指的是从0开始的部分编号。

这样了解了二者的区别就可以通过程序的引用包来判别新旧API编写的程序了。小菜建议最好用新的API编写hadoop程序,以防旧的API被抛弃!!!