Hadoop单机版安装

配置好java与ssh环境

/etc/init.d/sshd start

配置ssh免登录

cd
ssh-keygen -t rsa
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

登录ssh localhost查看能否免密码登录(第一次登录可能需要输入密码)

然后下载hadoop(我选的是1.1.1版本)

编辑 conf/hadoop-env.sh文件,添加配置环境变量

export JAVA_HOME=/root/jdk1.6.0_38

编辑hadoop几个核心文件

conf/core-site.xml

<configuration>
<property>
    <name>fs.default.name</name>
    <value>hdfs://localhost:9000</value>
 </property>
</configuration>

conf/hdfs-site.xml

<configuration>
  <property>
    <name>dfs.replication</name>
    <value>1</value>
  </property>
  <property>
    <name>dfs.name.dir</name>
    <value>/root/opt/hadoop/var/namedir</value>
  </property>
  <property>
    <name>dfs.data.dir</name>
    <value>/root/opt/hadoop/var/datadir</value>
  </property>
</configuration>

conf/mapred-site.xml

<configuration>
  <property>
    <name>mapred.job.tracker</name>
    <value>hdfs://localhost:9001</value>
  </property>
</configuration>
格式化namenode以及运行如下,然后通过运行jps查看是否运行正常

bin/hadoop namenode -format
bin/start-all.sh

[fedora@fedora hadoop]$ jps
16449 Jps
13388 NameNode
13492 DataNode
13599 SecondaryNameNode
13686 JobTracker
23248 ElasticSearch
13800 TaskTracker
如果Taskracker或者其它组件启动失败,可以查看vi hs*错误日志,一般是动态链接库文件找不到依赖,配置LD_LIBRARY_PATH即可

配置环境变量export CLASSPATH=$CLASSPATH:/home/fedora/hadoop/

如果datanode或者namenode启动失败,可以尝试删除rm -rf /root/opt/hadoop/var/*,然后格式化namenode再启动。

下面就可以写一个简单的统计任务来测试单机版hadoop了

创建test.log,内容如下

20121221  04567 user s00001
20121221  75531 user s00003
20121222  52369 user s00002
20121222  01297 user s00001
20121223  61223 user s00002
20121223  33121 user s00003
放入到hdfs中

bin/hadoop fs -mkdir inputTest
bin/hadoop fs -put test.log inputTest
编写统计脚本如下test/MaxDownBytes.java

package test;

import java.io.IOException;

import java.util.Iterator;
import org.apache.hadoop.fs.*;
import org.apache.hadoop.io.*;
import org.apache.hadoop.mapred.*;

public class MaxDownBytes {

	public static class MaxDownBytesMapper extends MapReduceBase
		implements Mapper<LongWritable, Text, Text, IntWritable> {
		@Override
		public void map(LongWritable key, Text value,
				OutputCollector<Text, IntWritable> output, Reporter reporter)
				throws IOException {
			// TODO Auto-generated method stub
			String line = value.toString();
			String[] ss = line.split(" ");
			String date = ss[0];
			int downBytes = Integer.parseInt(ss[1]);
			output.collect(new Text(date), new IntWritable(downBytes));
		}
	}

	public static class MaxDownBytesReducer extends MapReduceBase
		implements Reducer<Text, IntWritable, Text, IntWritable>{

		@Override
		public void reduce(Text key, Iterator<IntWritable> values,
				OutputCollector<Text, IntWritable> output, Reporter reporter)
				throws IOException {
			// TODO Auto-generated method stub
			
			int maxValue = Integer.MIN_VALUE;
			while(values.hasNext()){
				maxValue = Math.max(maxValue, values.next().get());
			}
			output.collect(key, new IntWritable(maxValue));
		}
	}
	
	/**
	 * @param args
	 * @throws IOException 
	 */
	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		if(args.length != 2){
			System.err.println("Usage: MaxDownBytes <input path> <output path>");
			System.exit(-1);
		}
		
		JobConf conf = new JobConf(MaxDownBytes.class);
		conf.setJobName("Max download bytes");
		
		FileInputFormat.addInputPath(conf, new Path(args[0]));
		FileOutputFormat.setOutputPath(conf, new Path(args[1]));
		
		conf.setMapperClass(MaxDownBytesMapper.class);
		conf.setReducerClass(MaxDownBytesReducer.class);
		
		conf.setOutputKeyClass(Text.class);
		conf.setOutputValueClass(IntWritable.class);
		
		JobClient.runJob(conf);
	}
}

编译打包运行

javac -cp hadoop-core-1.1.1.jar test/MaxDownBytes.java
jar cvf MaxDownBytes.jar test
bin/hadoop jar MaxDownBytes.jar test.MaxDownBytes inputTest outputRes
查看结果如下:

[fedora@fedora hadoop]$ bin/hadoop fs -cat outputRes/part-00000
20121221	75531
20121222	52369
20121223	61223

如果要计算每天的下载bytes总和,只需要修改reducer函数如下即可

                @Override
                public void reduce(Text key, Iterator<IntWritable> values,
                                OutputCollector<Text, IntWritable> output, Reporter reporter)
                                throws IOException {
                        // TODO Auto-generated method stub

                        int sumValue = 0;
                        while(values.hasNext()){
                                sumValue += values.next().get();
                        }
                        output.collect(key, new IntWritable(sumValue));
                }

MapReduce 集群上运行的分布式数据处理模型

一个mapreduce任务由输入数据,mapreduce程序以及配置信息组成。hadoop将它
分配为map任务和reduce任务

有两类节点负责任务的执行,jobtracker和若干tasktracker,前者负责协调所有
tasktracker,重启失败的tasktracker等。tasktracker负责执行任务,将进度反
馈给jobtracker。

hadoop将输入数据拆分固定大小的多份,为每一份创建个map task运行,一个分片的
大小不能太大也不能太小,一般为一个hdfs块大小64M合适(适合本地化计算),map计
算的中间结果是存在本地磁盘而不是hdfs中。

为了能减少各个node之间数据交互量,还可以指定一个combiner function。

	conf.setMapperClass(MaxTempratureMapper.class);
	conf.setCombinerClass(MaxTempratureReducer.class);
	conf.setReducerClass(MaxTempratureReducer.class);
HDFS集群上运行的分布式文件系统
HDFS是一个设计来存储大文件的文件系统。一次写多次读。
namenode在内存中保持文件系统的meta信息,文件系统所能存放的文件数量受到namenode
的内存大小限制。每个文件目录块话费150字节内存,存放一百万个文件需要300MB

bin/hadoop fsck / -files -blocks

namenode维护整个文件系统的目录结构等信息,hadoop提供两种机制保证它的安全可靠
1,同步原子性将状态发送到别的文件系统保存
2,运行一个备用namenode

HDFS提供命令行操作 hadoop fs [command],同时提供java的api

Pig分布式数据分析平台语言

Hive分布式数据仓库工具,对存储在HDFS的数据提供sql查询,将sql转换成mapreduce任务运行

HBase分布式列级存储数据库,使用HDFS作为其底层存储,支持Mapreduce批处理计算和随机读点查询

Zookeeper分布式协调服务,提供分布式锁

Sqoop一个高效地将数据从关系型数据库转移到hdfs的工具

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值