0

0

Hadoop自动化安装及单节点方式运行

php中文网

php中文网

发布时间:2016-06-07 16:34:35

|

1270人浏览过

|

来源于php中文网

原创

本文尝试使用shell脚本来自动化安装配置hadoop。使用的操作系统为centos,hadoop版本为?1.x,jdk版本?1.7,其他版本未测试,可能有未知bug。 Hadoop安装脚本 Hadoop安装分为3步,首先安装jdk,然后安装Hadoop,接着配置ssh免密码登陆(非必须)。[1] #!/bin/ba

本文尝试使用shell脚本来自动化安装配置hadoop。使用的操作系统为centos,hadoop版本为?1.x,jdk版本?1.7,其他版本未测试,可能有未知bug。

Hadoop安装脚本

Hadoop安装分为3步,首先安装jdk,然后安装Hadoop,接着配置ssh免密码登陆(非必须)。[1]

#!/bin/bash
# Usage: Hadoop自动配置脚本
# History: 
#	20140425  annhe  基本功能
#Hadoop版本
HADOOP_VERSION=1.2.1
#Jdk版本,Oracle官方无直链下载,请自备rpm包并设定版本号
JDK_VESION=7u51
#Hadoop下载镜像,默认为北理(bit)
MIRRORS=mirror.bit.edu.cn
#操作系统版本
OS=`uname -a |awk '{print $13}'`
# Check if user is root
if [ $(id -u) != "0" ]; then
    printf "Error: You must be root to run this script!\n"
    exit 1
fi
# 检查是否是Centos
cat /etc/issue|grep CentOS && r=0 || r=1
if [ $r -eq 1 ]; then
	echo "This script can only run on CentOS!"
	exit 1
fi
#软件包
HADOOP_FILE=hadoop-$HADOOP_VERSION-1.$OS.rpm
if [ "$OS"x = "x86_64"x ]; then
	JDK_FILE=jdk-$JDK_VESION-linux-x64.rpm
else
	JDK_FILE=jdk-$JDK_VESION-linux-i586.rpm
fi
function Install ()
{
	#卸载已安装版本
	rpm -qa |grep hadoop
	rpm -e hadoop
	rpm -qa | grep jdk
	rpm -e jdk
	#恢复/etc/profile备份文件
	mv /etc/profile.bak /etc/profile
	#准备软件包
	if [ ! -f $HADOOP_FILE ]; then
		wget "http://$MIRRORS/apache/hadoop/common/stable1/$HADOOP_FILE" && r=0 || r=1
		[ $r -eq 1 ] && { echo "download error, please check your mirrors or check your network....exit"; exit 1; }
	fi
	[ ! -f $JDK_FILE ] && { echo "$JDK_FILE not found! Please download yourself....exit"; exit 1; }
	#开始安装
	rpm -ivh $JDK_FILE && r=0 || r=1
	if [ $r -eq 1 ]; then
		echo "$JDK_FILE install failed, please verify your rpm file....exit"
		exit 1
	fi
	rpm -ivh $HADOOP_FILE && r=0 || r=1
	if [ $r -eq 1 ]; then
		echo "$HADOOP_FILE install failed, please verify your rpm file....exit"
		exit 1
	fi
	#备份/etc/profile
	cp /etc/profile /etc/profile.bak
	#配置java环境变量
	cat >> /etc/profile <<eof
#set java enviroment
JAVA_HOME=/usr/java/default
CLASSPATH=.:\$JAVA_HOME/lib
PATH=\$JAVA_HOME/bin:\$PATH
export JAVA_HOME CLASSPATH PATH
eof
	bash /etc/profile
	#配置Hadoop脚本权限
	chmod u+x /usr/sbin/*.sh
	#重置HADOOP_CLIENT_OPTS值
	sed -i "s/export\ HADOOP_CLIENT_OPTS=\"-Xmx128m \$HADOOP_CLIENT_OPTS\"/export\ HADOOP_CLIENT_OPTS=\"-Xmx512m \$HADOOP_CLIENT_OPTS\"/g" /etc/hadoop/hadoop-env.sh
}
#配置ssh免密码登陆
function SSHlogin ()
{
	#不重复生成私钥
	[ ! -f ~/.ssh/id_dsa ] && ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
	cat ~/.ssh/authorized_keys |grep "`cat ~/.ssh/id_dsa.pub`" && r=0 || r=1
	#没有公钥的时候才添加
	[ $r -eq 1 ] && cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
	chmod 644 ~/.ssh/authorized_keys
}
Install 2>&1 | tee -a hadoop_install.log
SSHlogin 2>&1 | tee -a hadoop_install.log
#修改HADOOP_CLIENT_OPTS后需要重启 
shutdown -r now

单节点运行自带示例

默认情况下,Hadoop被配置成以非分布式模式运行的一个独立Java进程。这对调试非常有帮助。新建测试文本

[root@linux hadoop]# echo "hello world" >input/hello.txt
[root@linux hadoop]# echo "hello hadoop" >input/hadoop.txt

运行Wordcount

[root@linux hadoop]# hadoop jar /usr/share/hadoop/hadoop-examples-1.2.1.jar wordcount input output
14/04/26 02:56:23 INFO util.NativeCodeLoader: Loaded the native-hadoop library
14/04/26 02:56:23 INFO input.FileInputFormat: Total input paths to process : 2
14/04/26 02:56:24 WARN snappy.LoadSnappy: Snappy native library not loaded
14/04/26 02:56:24 INFO mapred.JobClient: Running job: job_local275273933_0001
14/04/26 02:56:24 INFO mapred.LocalJobRunner: Waiting for map tasks
14/04/26 02:56:24 INFO mapred.LocalJobRunner: Starting task: attempt_local275273933_0001_m_000000_0
14/04/26 02:56:25 INFO util.ProcessTree: setsid exited with exit code 0
14/04/26 02:56:25 INFO mapred.Task:  Using ResourceCalculatorPlugin : org.apache.hadoop.util.LinuxResourceCalculatorPlugin@7e86fe3a
14/04/26 02:56:25 INFO mapred.MapTask: Processing split: file:/root/hadoop/input/hadoop.txt:0+13
14/04/26 02:56:25 INFO mapred.MapTask: io.sort.mb = 100
14/04/26 02:56:25 INFO mapred.MapTask: data buffer = 79691776/99614720
14/04/26 02:56:25 INFO mapred.MapTask: record buffer = 262144/327680
14/04/26 02:56:25 INFO mapred.MapTask: Starting flush of map output
14/04/26 02:56:25 INFO mapred.MapTask: Finished spill 0
14/04/26 02:56:25 INFO mapred.Task: Task:attempt_local275273933_0001_m_000000_0 is done. And is in the process of commiting
14/04/26 02:56:25 INFO mapred.LocalJobRunner:
14/04/26 02:56:25 INFO mapred.Task: Task 'attempt_local275273933_0001_m_000000_0' done.
14/04/26 02:56:25 INFO mapred.LocalJobRunner: Finishing task: attempt_local275273933_0001_m_000000_0
14/04/26 02:56:25 INFO mapred.LocalJobRunner: Starting task: attempt_local275273933_0001_m_000001_0
14/04/26 02:56:25 INFO mapred.Task:  Using ResourceCalculatorPlugin : org.apache.hadoop.util.LinuxResourceCalculatorPlugin@16ed889d
14/04/26 02:56:25 INFO mapred.MapTask: Processing split: file:/root/hadoop/input/hello.txt:0+12
14/04/26 02:56:25 INFO mapred.MapTask: io.sort.mb = 100
14/04/26 02:56:25 INFO mapred.MapTask: data buffer = 79691776/99614720
14/04/26 02:56:25 INFO mapred.MapTask: record buffer = 262144/327680
14/04/26 02:56:25 INFO mapred.MapTask: Starting flush of map output
14/04/26 02:56:25 INFO mapred.MapTask: Finished spill 0
14/04/26 02:56:25 INFO mapred.Task: Task:attempt_local275273933_0001_m_000001_0 is done. And is in the process of commiting
14/04/26 02:56:25 INFO mapred.LocalJobRunner:
14/04/26 02:56:25 INFO mapred.Task: Task 'attempt_local275273933_0001_m_000001_0' done.
14/04/26 02:56:25 INFO mapred.LocalJobRunner: Finishing task: attempt_local275273933_0001_m_000001_0
14/04/26 02:56:25 INFO mapred.LocalJobRunner: Map task executor complete.
14/04/26 02:56:25 INFO mapred.Task:  Using ResourceCalculatorPlugin : org.apache.hadoop.util.LinuxResourceCalculatorPlugin@42701c57
14/04/26 02:56:25 INFO mapred.LocalJobRunner:
14/04/26 02:56:25 INFO mapred.Merger: Merging 2 sorted segments
14/04/26 02:56:25 INFO mapred.Merger: Down to the last merge-pass, with 2 segments left of total size: 53 bytes
14/04/26 02:56:25 INFO mapred.LocalJobRunner:
14/04/26 02:56:25 INFO mapred.Task: Task:attempt_local275273933_0001_r_000000_0 is done. And is in the process of commiting
14/04/26 02:56:25 INFO mapred.LocalJobRunner:
14/04/26 02:56:25 INFO mapred.Task: Task attempt_local275273933_0001_r_000000_0 is allowed to commit now
14/04/26 02:56:25 INFO output.FileOutputCommitter: Saved output of task 'attempt_local275273933_0001_r_000000_0' to output
14/04/26 02:56:25 INFO mapred.LocalJobRunner: reduce > reduce
14/04/26 02:56:25 INFO mapred.Task: Task 'attempt_local275273933_0001_r_000000_0' done.
14/04/26 02:56:25 INFO mapred.JobClient:  map 100% reduce 100%
14/04/26 02:56:25 INFO mapred.JobClient: Job complete: job_local275273933_0001
14/04/26 02:56:25 INFO mapred.JobClient: Counters: 20
14/04/26 02:56:25 INFO mapred.JobClient:   File Output Format Counters
14/04/26 02:56:25 INFO mapred.JobClient:     Bytes Written=37
14/04/26 02:56:25 INFO mapred.JobClient:   FileSystemCounters
14/04/26 02:56:25 INFO mapred.JobClient:     FILE_BYTES_READ=429526
14/04/26 02:56:25 INFO mapred.JobClient:     FILE_BYTES_WRITTEN=586463
14/04/26 02:56:25 INFO mapred.JobClient:   File Input Format Counters
14/04/26 02:56:25 INFO mapred.JobClient:     Bytes Read=25
14/04/26 02:56:25 INFO mapred.JobClient:   Map-Reduce Framework
14/04/26 02:56:25 INFO mapred.JobClient:     Reduce input groups=3
14/04/26 02:56:25 INFO mapred.JobClient:     Map output materialized bytes=61
14/04/26 02:56:25 INFO mapred.JobClient:     Combine output records=4
14/04/26 02:56:25 INFO mapred.JobClient:     Map input records=2
14/04/26 02:56:25 INFO mapred.JobClient:     Reduce shuffle bytes=0
14/04/26 02:56:25 INFO mapred.JobClient:     Physical memory (bytes) snapshot=0
14/04/26 02:56:25 INFO mapred.JobClient:     Reduce output records=3
14/04/26 02:56:25 INFO mapred.JobClient:     Spilled Records=8
14/04/26 02:56:25 INFO mapred.JobClient:     Map output bytes=41
14/04/26 02:56:25 INFO mapred.JobClient:     CPU time spent (ms)=0
14/04/26 02:56:25 INFO mapred.JobClient:     Total committed heap usage (bytes)=480915456
14/04/26 02:56:25 INFO mapred.JobClient:     Virtual memory (bytes) snapshot=0
14/04/26 02:56:25 INFO mapred.JobClient:     Combine input records=4
14/04/26 02:56:25 INFO mapred.JobClient:     Map output records=4
14/04/26 02:56:25 INFO mapred.JobClient:     SPLIT_RAW_BYTES=197
14/04/26 02:56:25 INFO mapred.JobClient:     Reduce input records=

结果

云网OA
云网OA

采用JSP开发的办公自动化产品、基于B/S结构,运行环境:JDK v1.5、Tomcat v5.5、MySQL v4.1,三者均为以上版本其他相关内容:可视化流程设计: 流程支持串签、会签和分支流程,可以设置流程节点的修改、删除权限,并可指定流程中各个用户在表单中可以填写的域。智能表单所见即所得设计: 智能设计,自动在数据库中生成表格,方便优化程序 公共交流: 集论坛、博客、聊天室于一体文件柜:C

下载
[root@linux hadoop]# cat output/*
hadoop  1
hello   2
world   1

?运行自己编写的Wordcount

package net.annhe.wordcount;
import java.io.IOException;
import java.util.*;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.conf.*;
import org.apache.hadoop.io.*;
import org.apache.hadoop.mapreduce.*;
import org.apache.hadoop.mapreduce.lib.input.*;
import org.apache.hadoop.mapreduce.lib.output.*;
import org.apache.hadoop.util.*;
public class WordCount extends Configured implements Tool {
	public static class Map extends Mapper<LongWritable, Text, Text, IntWritable> {
		private final static IntWritable one = new IntWritable(1);
		private Text word = new Text();
		public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
			String line = value.toString();
			StringTokenizer tokenizer = new StringTokenizer(line);
			while (tokenizer.hasMoreTokens()) {
				word.set(tokenizer.nextToken());
				context.write(word,one);
			}
		}
	}
	public static class Reduce extends Reducer<Text, IntWritable, Text, IntWritable> {
		public void reduce (Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
			int sum=0;
			for(IntWritable val : values) {
				sum += val.get();
			}
			context.write(key, new IntWritable(sum));
		}
	}
	public int run(String[] args) throws Exception {
		Job job = new Job(getConf());
		job.setJarByClass(WordCount.class);
		job.setJobName("wordcount");
		job.setOutputKeyClass(Text.class);
		job.setOutputValueClass(IntWritable.class);
		job.setMapperClass(Map.class);
		job.setReducerClass(Reduce.class);
		job.setInputFormatClass(TextInputFormat.class);
		job.setOutputFormatClass(TextOutputFormat.class);
		FileInputFormat.setInputPaths(job, new Path(args[0]));
		FileOutputFormat.setOutputPath(job, new Path(args[1]));
		boolean success = job.waitForCompletion(true);
		return success ? 0 : 1;
	}
	public static void main(String[] args) throws Exception {
		int ret = ToolRunner.run(new WordCount(),args);
		System.exit(ret);
	}
}

编译

javac -classpath /usr/share/hadoop/hadoop-core-1.2.1.jar -d . WordCount.java

打包

jar -vcf wordcount.jar -C demo/ .

运行

hadoop jar wordcount.jar net.annhe.wordcount.WordCount input/ out

结果

[root@linux hadoop]# cat out/*
hadoop  1
hello   2
world   1

?遇到的问题

1. 内存不足

分给虚拟机的内存才180M,运行实例程序时报错:

java.lang.Exception: java.lang.OutOfMemoryError: Java heap space

解决方案:
增加虚拟机内存,并编辑/etc/hadoop/hadoop-env.sh,修改:

export HADOOP_CLIENT_OPTS="-Xmx512m $HADOOP_CLIENT_OPTS" #改成512m
原来启动JVM时配置的最大内存是128m,当运行hadoop的一些自带的实例会报内存溢出,其实这里是可以修改内存大小 如果不需要也不必修改。[2]

?2. 带有包名的类的引用

带有包名的类要按照包层次调用类。如上面的 net.annhe.wordcount.WordCount [3]

3. 带有包名的类的编译

需要打包编译,加-d选项。

java的类文件是应该放入包中的,如package abc;
public class ls {...} 那么这个abc就是就是类ls的包,那么编译的时候就应该创建相应的abc包,具体就是用javac的一个参数,就是这个-d来生成这个类文件的包,例如上面的类在编译时应该写javac -d . ls.java注意javac和-d,-d和后面的.,.和后面的ls.java中间都有空格[4]

参考资料

[1]. 陆嘉桓. Hadoop实战. 第二版. 机械工业出版社

[2]. OSchina博客:http://my.oschina.net/mynote/blog/93340

[3]. CSDN博客:http://blog.csdn.net/xw13106209/article/details/6861855

[4]. 百度知道:http://zhidao.baidu.com/link?url=ND1BWmyGb_5a05Jntd9vGZNWGtmJmcKF1V6dhVNM1eFNuHL6kbQyVrEWtCUmy7KYP5F66R2BumCifCnPQnYdD_


本文遵从CC版权协定,转载请以链接形式注明出处。
本文链接地址: http://www.annhe.net/article-2672.html

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Golang 测试体系与代码质量保障:工程级可靠性建设
Golang 测试体系与代码质量保障:工程级可靠性建设

Go语言测试体系与代码质量保障聚焦于构建工程级可靠性系统。本专题深入解析Go的测试工具链(如go test)、单元测试、集成测试及端到端测试实践,结合代码覆盖率分析、静态代码扫描(如go vet)和动态分析工具,建立全链路质量监控机制。通过自动化测试框架、持续集成(CI)流水线配置及代码审查规范,实现测试用例管理、缺陷追踪与质量门禁控制,确保代码健壮性与可维护性,为高可靠性工程系统提供质量保障。

28

2026.02.28

Golang 工程化架构设计:可维护与可演进系统构建
Golang 工程化架构设计:可维护与可演进系统构建

Go语言工程化架构设计专注于构建高可维护性、可演进的企业级系统。本专题深入探讨Go项目的目录结构设计、模块划分、依赖管理等核心架构原则,涵盖微服务架构、领域驱动设计(DDD)在Go中的实践应用。通过实战案例解析接口抽象、错误处理、配置管理、日志监控等关键工程化技术,帮助开发者掌握构建稳定、可扩展Go应用的最佳实践方法。

23

2026.02.28

Golang 性能分析与运行时机制:构建高性能程序
Golang 性能分析与运行时机制:构建高性能程序

Go语言以其高效的并发模型和优异的性能表现广泛应用于高并发、高性能场景。其运行时机制包括 Goroutine 调度、内存管理、垃圾回收等方面,深入理解这些机制有助于编写更高效稳定的程序。本专题将系统讲解 Golang 的性能分析工具使用、常见性能瓶颈定位及优化策略,并结合实际案例剖析 Go 程序的运行时行为,帮助开发者掌握构建高性能应用的关键技能。

27

2026.02.28

Golang 并发编程模型与工程实践:从语言特性到系统性能
Golang 并发编程模型与工程实践:从语言特性到系统性能

本专题系统讲解 Golang 并发编程模型,从语言级特性出发,深入理解 goroutine、channel 与调度机制。结合工程实践,分析并发设计模式、性能瓶颈与资源控制策略,帮助将并发能力有效转化为稳定、可扩展的系统性能优势。

16

2026.02.27

Golang 高级特性与最佳实践:提升代码艺术
Golang 高级特性与最佳实践:提升代码艺术

本专题深入剖析 Golang 的高级特性与工程级最佳实践,涵盖并发模型、内存管理、接口设计与错误处理策略。通过真实场景与代码对比,引导从“可运行”走向“高质量”,帮助构建高性能、可扩展、易维护的优雅 Go 代码体系。

18

2026.02.27

Golang 测试与调试专题:确保代码可靠性
Golang 测试与调试专题:确保代码可靠性

本专题聚焦 Golang 的测试与调试体系,系统讲解单元测试、表驱动测试、基准测试与覆盖率分析方法,并深入剖析调试工具与常见问题定位思路。通过实践示例,引导建立可验证、可回归的工程习惯,从而持续提升代码可靠性与可维护性。

2

2026.02.27

漫蛙app官网链接入口
漫蛙app官网链接入口

漫蛙App官网提供多条稳定入口,包括 https://manwa.me、https

164

2026.02.27

deepseek在线提问
deepseek在线提问

本合集汇总了DeepSeek在线提问技巧与免登录使用入口,助你快速上手AI对话、写作、分析等功能。阅读专题下面的文章了解更多详细内容。

8

2026.02.27

AO3官网直接进入
AO3官网直接进入

AO3官网最新入口合集,汇总2026年可用官方及镜像链接,助你快速稳定访问Archive of Our Own平台。阅读专题下面的文章了解更多详细内容。

309

2026.02.27

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
尚学堂Mahout视频教程
尚学堂Mahout视频教程

共18课时 | 3.3万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号