Hadoop平台如何搭建
Hadoop平台的搭建流程之单机/伪分布配置
所需工具:VMware Workstation / Virtual Box 虚拟机; Hadoop安装文件;
实验环境:Ubuntu 32位或64位系统 / CentOS系统;
ps:
该实验教程采用Ubuntu 64位系统进行讲解。
Ubuntu安装系统:请参考http://dblab.xmu.edu.cn/blog/337-2/
如果使用CentOS/RedHat系统,请参考:http://dblab.xmu.edu.cn/blog/install-hadoop-in-centos/
请确保安装过程过程中处于联网状态!虚拟机无法联网,建议使用双系统安装Ubuntu。
一. 创建hadoop用户
按 ctrl+alt+t 打开终端窗口,输入一下命令创建新用户:
$ sudo useradd -m hadoop -s /bin/bash
创建了用户,并使用/bin/bash作为shell
sudo:
本文中会大量使用到sudo命令。sudo是ubuntu中一种权限管理机制,管理员可以授权给一些普通用户去执行一些需要root权限执行的操作。当使用sudo命令时,就需要输入您当前用户的密码.
设置密码:
$ sudo passwd hadoop
为hadoop用户增加管理员权限:
$ sudo adduser hadoop sudo
最后注销用户,返回登录界面。选择刚刚创建的hadoop用户登录。
二. 更新apt
后续需要使用apt安装软件,不进行更新可能会出现一些安装不了的情况。打开终端窗口,执行以下命令:
$ sudo apt-get update
后续需要更改一些配置文件,建议安装vim(vi增强版):
$ sudo apt-get install vim
如果需要确认,按y即可。
三 .安装SSH,配置SSH无密码登录
集群,单节点模式都需要用到ssh登录(类似远程登陆,你可以登陆某台linux主机,并在上面运行命令),ubuntu默认安装了ssh client,还需要安装ssh server:
$ sudo apt-get install openssh-server
安装完成后,登陆本机:
$ ssh localhost
首次登陆会有提示,输入yes。按提示输入密码即可。
将ssh配置为无密码登录比较方便。
退出ssh,回到原先终端窗口,利用ssh-keygen生成密钥,并将密钥加入授权:
$ exit # 退出刚才的 ssh localhost $ cd ~/.ssh/ # 若没有该目录,请先执行一次ssh localhost $ ssh-keygen -t rsa # 会有提示,都按回车就可以 $ cat ./id_rsa.pub >> ./authorized_keys # 加入授权
~的含义:
在 Linux 系统中,~ 代表的是用户的主文件夹,即 “/home/用户名” 这个目录,如你的用户名为 hadoop,则 ~ 就代表 “/home/hadoop/”。 此外,命令中的 # 后面的文字是注释,只需要输入前面命令即可。
之后再使用ssh localhost命令,无需输入密码就可登陆。
四 . 安装JAVA环境
所需要的JDK安装包jdk-8u162-linux-x64.tar.gz放在了百度云盘,https://pan.baidu.com/share/init?surl=ZuY142dtMERuh4vfliAgJg(提取码:gx0b)。请把压缩格式的文件jdk-8u162-linux-x64.tar.gz下载到本地电脑,假设保存在“/home/Downloads/”目录下。
提示:该安装包需要在虚拟机ubuntu系统里面下载,不要下在windows系统等主机里。如果下载到主机,可以通过FTP软件把安装包上传到指定目录(Downloads)下。如果你不会使用FTP,参考我的另一篇博客,这里有具体的执行主机与虚拟机之间交互文件的方法 https://www.cnblogs.com/guojiaxue/p/12628156.html
$ cd /usr/lib $ sudo mkdir jvm #创建/usr/lib/jvm目录用来存放JDK文件 $ cd ~ #进入hadoop用户的主目录 $ cd Downloads #注意区分大小写字母,刚才已经通过FTP软件把JDK安装包jdk-8u162-linux-x64.tar.gz上传到该目录下 $ sudo tar -zxvf ./jdk-8u162-linux-x64.tar.gz -C /usr/lib/jvm #把JDK文件解压到/usr/lib/jvm目录下
关于常用的Linux命令用法:参考http://dblab.xmu.edu.cn/blog/1624-2/
查看解压后的文件:
$ cd /usr/lib/jvm $ ls
继续设置环境变量:
$ cd ~
$ vim ~/.bashrc
打开vim编辑器后,打开了hadoop这个用户的环境变量配置文件,请在这个文件的开头位置,添加如下几行内容:
export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_162 export JRE_HOME=${JAVA_HOME}/jre export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib export PATH=${JAVA_HOME}/bin:$PATH
查看vim使用方法:参考http://dblab.xmu.edu.cn/blog/1607-2/
保存.bashrc文件并退出vim编辑器。然后,继续执行如下命令让.bashrc文件的配置立即生效:
$ source ~/.bashrc
查看是否安装成功:
$ java -version
如果能够在屏幕上返回如下信息,则说明安装成功:
hadoop@ubuntu:~$ java -version java version "1.8.0_162" Java(TM) SE Runtime Environment (build 1.8.0_162-b12) Java HotSpot(TM) 64-Bit Server VM (build 25.162-b12, mixed mode)
五 . 安装Hadoop
Hadoop安装文件:可在官网下载,也可点击此处百度网盘自取:https://pan.baidu.com/share/init?surl=ZuY142dtMERuh4vfliAgJg(提取码:gx0b),下载其中的“stable”下的hadoop-x.x.x.tar.gz格式的文件,另一个含src的是源代码需要编译。
注意:
如果读者是使用虚拟机方式安装Ubuntu系统的用户,请用虚拟机中的Ubuntu自带firefox浏览器访问本指南,再点击下面的地址,才能把hadoop文件下载虚拟机ubuntu中。请不要使用Windows系统下的浏览器下载,文件会被下载到Windows系统中,虚拟机中的Ubuntu无法访问外部Windows系统的文件,造成不必要的麻烦。
将 Hadoop 安装至 /usr/local/ 中:
$ sudo tar -zxf ~/下载/hadoop-2.6.0.tar.gz -C /usr/local # 解压到/usr/local中 $ cd /usr/local/ $ sudo mv ./hadoop-2.6.0/ ./hadoop # 将文件夹名改为hadoop $ sudo chown -R hadoop ./hadoop # 修改文件权限
Hadoop 解压后即可使用。输入如下命令来检查 Hadoop 是否可用,成功则会显示 Hadoop 版本信息:
$ cd /usr/local/hadoop
$ ./bin/hadoop version
相对路径与绝对路径:
请务必注意命令中的相对路径与绝对路径,本文后续出现的 ./bin/...
,./etc/...
等包含 ./ 的路径,均为相对路径,以 /usr/local/hadoop 为当前目录。例如在 /usr/local/hadoop 目录中执行 ./bin/hadoop version
等同于执行 /usr/local/hadoop/bin/hadoop version
。可以将相对路径改成绝对路径来执行,但如果你是在主文件夹 ~ 中执行 ./bin/hadoop version
,执行的会是 /home/hadoop/bin/hadoop version
,就不是我们所想要的了。
六 . Hadoop单机配置
Hadoop 默认模式为非分布式模式(本地模式),无需进行其他配置即可运行。非分布式即单 Java 进程,方便进行调试。
现在我们可以执行例子来感受下 Hadoop 的运行。Hadoop 附带了丰富的例子(运行 ./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0.jar
可以看到所有例子),包括 wordcount、terasort、join、grep 等。
在此我们选择运行 grep 例子,我们将 input 文件夹中的所有文件作为输入,筛选当中符合正则表达式 dfs[a-z.]+ 的单词并统计出现的次数,最后输出结果到 output 文件夹中。
$ cd /usr/local/hadoop $ mkdir ./input $ cp ./etc/hadoop/*.xml ./input # 将配置文件作为输入文件 $ ./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar $ grep ./input ./output 'dfs[a-z.]+' $ cat ./output/* # 查看运行结果
注意:
Hadoop 默认不会覆盖结果文件,因此再次运行上面实例会提示出错,需要先将 ./output
删除。
$ rm -r ./output
七. Hadoop伪分布式配置
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>
注:gredit不能使用的,可以换成sudo vi,效果一样。
配置完成后,执行 NameNode 的格式化:
$ cd /usr/local/hadoop
$ ./bin/hdfs namenode -format
成功的话,会看到 “successfully formatted” 和 “Exitting with status 0” 的提示,若为 “Exitting with status 1” 则是出错。
如果在这一步时提示 Error: JAVA_HOME is not set and could not be found. 的错误,则说明之前设置 JAVA_HOME 环境变量那边就没设置好,请按教程先设置好 JAVA_HOME 变量,否则后面的过程都是进行不下去的。如果已经按照前面教程在.bashrc文件中设置了JAVA_HOME,还是出现 Error: JAVA_HOME is not set and could not be found. 的错误,那么,请到hadoop的安装目录修改配置文件“/usr/local/hadoop/etc/hadoop/hadoop-env.sh”,在里面找到“export JAVA_HOME=${JAVA_HOME}”这行,然后,把它修改成JAVA安装路径的具体地址,比如,“export JAVA_HOME=/usr/lib/jvm/default-java”,然后,再次启动Hadoop。
接着开启 NameNode 和 DataNode 守护进程。
$ cd /usr/local/hadoop $ ./sbin/start-dfs.sh #start-dfs.sh是个完整的可执行文件,中间没有空格
若出现SSH提示,输入yes即可。
八. 运行Hadoop伪分布实例
上面的单机模式,grep 例子读取的是本地数据,伪分布式读取的则是 HDFS 上的数据。要使用 HDFS,首先需要在 HDFS 中创建用户目录:
$ ./bin/hdfs dfs -mkdir -p /user/hadoop
注意:
教材《大数据技术原理与应用》的命令是以”./bin/hadoop dfs”开头的Shell命令方式,实际上有三种shell命令方式。
1. hadoop fs
2. hadoop dfs
3. hdfs dfs
hadoop fs适用于任何不同的文件系统,比如本地文件系统和HDFS文件系统
hadoop dfs只能适用于HDFS文件系统
hdfs dfs跟hadoop dfs的命令作用一样,也只能适用于HDFS文件系统
接着将 ./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中的文件(可以将单机步骤中创建的本地 input 文件夹,输出结果 output 文件夹都删掉来验证这一点)。
$ ./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar grep input output 'dfs[a-z.]+'
查看运行结果的命令(查看的是位于 HDFS 中的输出结果):
$ ./bin/hdfs dfs -cat output/*
我们已经更改了配置文件,所以运行结果不同。
我们也可以将运行结果取回到本地:
$ rm -r ./output # 先删除本地的 output 文件夹(如果存在) $ ./bin/hdfs dfs -get output ./output # 将 HDFS 上的 output 文件夹拷贝到本机 $ cat ./output/*
Hadoop 运行程序时,输出目录不能存在,否则会提示错误 “org.apache.hadoop.mapred.FileAlreadyExistsException: Output directory hdfs://localhost:9000/user/hadoop/output already exists” ,因此若要再次执行,需要执行如下命令删除 output 文件夹:
$ ./bin/hdfs dfs -rm -r output # 删除 output 文件夹
运行程序时,输出目录不能存在:
运行 Hadoop 程序时,为了防止覆盖结果,程序指定的输出目录(如 output)不能存在,否则会提示错误,因此运行前需要先删除输出目录。在实际开发应用程序时,可考虑在程序中加上如下代码,能在每次运行时自动删除输出目录,避免繁琐的命令行操作:
Configuration conf = new Configuration(); Job job = new Job(conf); /* 删除输出目录 */ Path outputPath = new Path(args[1]); outputPath.getFileSystem(conf).delete(outputPath, true);
若要关闭 Hadoop,则运行
$ ./sbin/stop-dfs.sh
注意:
下次启动 hadoop 时,无需进行 NameNode 的初始化,只需要运行 ./sbin/start-dfs.sh
就可以!
以上就是全部。更详细的资料参考厦门大学林子雨老师的教程:http://dblab.xmu.edu.cn/blog/install-hadoop/
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通