apache-hadoop环境搭建 基本hadoop指令介绍
hadoop环境搭建
预先准备:
软件兼容性调查:
在安装hadoop时应该考虑到将来使用得情况,一般我们除了安装hadoop之外,还会安装hbase,hive,zookeeper等,这些软件之间会存在兼容性问题,再安装前,需要调研完整后选择合适的版本
hadoop硬件安装需求:
通常,安装hadoop至少需要三台主机,这是因为分布式存储的备份逻辑要求,一份文件需要有三个副本,这就导致至少要有三台node data主机。由于namenode主机可以与node data主机共存再一台机器上,这样用户就可以在三台主机上搭建一个hadoop分布式存储环境。
在这里,我们采用四台主机的方式来搭建hadoop分布式存储环境,使用户能够更好,更快的理解分布式存储的概念和模块功能。
安装拓扑结构图:
数据流
hadoop账户配置
|
IP
|
192.168.10.110
|
192.168.10.111
|
192.168.10.112
|
192.168.10.113
|
|
hostname
|
namenode
|
node1
|
node2
|
node3
|
|
user
|
hadoop
|
hadoop
|
hadoop
|
hadoop
|
|
ssh
|
√
|
√
|
√
|
√
|
|
ntp
|
√
|
√
|
√
|
√
|
通用环境准备:
java编译环境准备:
防火墙关闭
systemctl stop firewalld.service
systemctl disable firewalld.service
结点时间同步准备:
ntp服务器
ssh无密码访问准备:
为普通结点创建管理账户
以下操作需要通过ssh登录相应主机后,在结点上执行,默认username和passwd均为hadoop,在下面的参数中也使用hadoop
新建账户:
sudo useradd -d /home/{username} -m {username}
为账户创建密码:
sudo passwd {username}
给账户提升root权限:
echo "{username} ALL = (root) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/{username}
sudo chmod 0440 /etc/sudoers.d/{username}
为namenode结点创建方便的管理方法
注:以下操作都是针对name-node结点,hadoop用户。
生成ssh公私钥对:
ssh-keygen
注:使用普通用户hadoop,所有密码位空,直接回车就好
将生成的key复制到普通结点ceph-node:
ssh-copy-id hadoop@node1
首次需要输入正确的密码
注:若是无法执行成功可以先执行下面的步奏,与node1无法解析为IP有关
生成新的ssh配置文件:
vi ~/.ssh/config(格式如下:)
Host node1
Hostname node1
User hadoop
Host node2
Hostname node2
User hadoop
Host node3
Hostname node3
User hadoop
注:这里假设有3个用户
附:假如以上第二步无法成功可以先执行第三步,还有这里的附加步奏,以下文件中的格式是IP和主机名。
vi /etc/hosts
192.168.10.40 namenode
192.168.10.41 node1
192.168.10.42 node2
192.168.10.43 node3
再注:
再安装时可以不制定second namenode,这样默认使用namenode为seconde namenode。此时需要为本机使用ssh-copy-id hadoop@namenode指令
hadoop集群安装
Hadoop支持namenode和date node使用同一套配置文件,为集群化配置简化了配置条件。但在复杂的集群中,可能会将namenode或者data node中的一部分功能进行单独提取放置在一台专门为计算或者内存处理的机器上,在这样的情况下,就有可能需要做一些针对性的特殊配置。
hadoop中的配置文件使用说明
hadoop中存在众多的配置文件,如:core-default.xml,hdfs-default.xml,mapred-default.xml,yarn-default.xml。配置文件中定义了一系列可用的参数,如元数据存放位置,副本文件的个数等。
配置文件使用实例:
在etc/hadoop/core-site.xml中定义namenode的文件系统名
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property>
</configuration>
如上所示,configuration是配置文件的开始和结束标记,property才是一个配置项的开始和结束
在etc/hadoop/hdfs-site.xml中配置副本数目
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
配置文件说明:
默认情况下,配置文件中的配置项均有一个默认参数,用户可以根据需要进行更改。hadoop介绍文档中并没有一章专门介绍每个配置文件中的配置参数,用户可以根据官方文档提供的默认配置文件中的配置项名,配置项的值,配置项的描述来实现自己需要定制的目标。
在http://hadoop.apache.org/docs/stable/网页左边栏的最下方,configuration中提供了所有配置文件的默认配置参数。
hadoop初步安装
-
下载hadoop镜像
-
将hadoop镜像移动到目标主机
-
解压hadoop镜像
-
进入解压后的文件夹,编辑etc/hadoop/hadoop-env.sh文件,需改export JAVA_HOME=/usr/java/latest为上面java安装的实际路径
-
配置hadoop
此处为单点完全分布式,仅仅配置core-site.xml和slave即可
-
core-site.xml文件配置
文件 位置:etc/hadoop/core-site.xml
常用配置参数:fs.defaultFS
io.file.buffer.size
实际配置文件:参考配置文件一
-
Hdfs-site.xml文件配置
文件 位置:etc/hadoop/hdfs-site.xml
常用配置参数:dfs.namenode.name.dir
dfs.hosts / dfs.hosts.exclude
dfs.blocksize
dfs.namenode.handler.count
实际配置文件:为空即可
-
slave文件配置
文件位置:etc/hadoop/slaves
要 求:每个date node名或者ip单独占一行
要求ssh实现免密码登陆
实际配置文件:参考配置文件二
-
格式化集群
在首次搭建集群时需要格式化集群,即生成元数据,以后直接启动就好。
bin/hdfs namenode -format
集群搭建
-
在上一步中我们已经将namenode节点整个配置完成,下一步将已经配置好的整个namenode复制到node1,node2,node3中(使用scp指令)。
-
在namenode下启动集群 sbin/start-dfs.sh
-
在浏览器中输入一下http://192.168.10.40:50070,出现图一和图二展示,确认namenode和datanode启动。
注意:这里的http://192.168.10.40:50070也是hadoop中的默认配置项 dfs.namenode.http-address。
集群控制命令
hadoop支持配置环境变量省去带路径的命令模式,用户可以习惯选择配置或者不配置。
-
元数据格式化命令
bin/hdfs namenode -format
一旦在namenode中执行该命令,必须保证此时生成的元数据配置与data node上的一致。该文件的配置选项为
-
集群化启动和关闭hadoop
sbin/start-dfs.sh
sbin/stop-dfs.sh
注意:该命令的使用前提是已经实现免密码ssh
-
单独启动关闭一个namenode或者一个data node的方式
sbin/hadoop-daemon.sh start datanode(namenode)
sbin/hadoop-daemon.sh stop datanode(namenode)
集群元数据配置选项
默认的集群元数据配置选项为dfs.namenode.name.dir,其值为file://${hadoop.tmp.dir}/dfs/name,而hadoop.tmp.dir的默认值为/tmp/hadoop-${user.name}。故默认的元数据配置文件在/tmp/hadoop-hadoop中
Hadoop命令行接口
hadoop支持的命令种类繁多,这里主要讲述dfs相关的指令。
Hadoop支持类unix shell的命令行操作,形如:bin/hadoop fs <args>
在目前版本中以上指令还可以如此操作:bin/hdfs dfs <args>
df指令:
一般使用: bin/hdfs dfs -df
替代使用: bin/hadoop fs -df
命令实现: 实现的功能同unix的df,不过目标是hdfs
mkdir指令:
一般使用: bin/hdfs dfs -mkdir
替代使用: bin/hadoop fs -mkdir
ls指令:
指令用法: bin/hdfs dfs -ls [-C] [-d] [-h] [-q] [-R] [-t] [-S] [-r] [-u] <args>
选项说明:
-C:
一般使用: bin/hdfs dfs -ls /
替代使用: bin/hadoop fs -ls /
命令实现: 查看hdfs文件系统指定文件夹下的内容
put指令:
一般使用: bin/hdfs dfs -put
替代使用: bin/hadoop fs -put
命令实现: 将本地文件上传到目标hdfs文件系统中
Hadoop java API
hadoop的命令行接口,支持在namenode和datanode上直接执行类似shell指令的各种操作。对于非hadoop集群的机器而言,想要查看集群上有什么信息,或者想要向集群上传下载文件等其它指令,可以使用hadoop提供的Java API。
以下,以windows的esclipse为平台搭建,测试hadoop的java API。
环境准备:
-
Eclipse
-
Junit(代码完成后需要使用run as unit测试代码)
-
Hadoop jar(将hadoop主机的share/hadoop文件夹整个复制到工程项目中,并将对应需要的jar使用build path,添加到liabray)
-
hadoop配置文件。由于share/hadoop文件夹下的子文件夹会自动复制原来配置的配置文件,这里直接将配置文件添使用build as src
实例代码:
package hadoop;
import java.io.File;
importjava.net.URI;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.junit.Test;
public class HdfsTest {
FileSystem fs = null;
static Configuration config = null;
static {
config = new Configuration();
System.out.println("fs.defaultFS: "+config.get("fs.defaultFS"));
}
@Test
public void upload() throws Exception {
fs = FileSystem.get(URI.create("hdfs://192.168.10.40:8000/"),config,"hadoop");//namenode的fs.defaultFS,config,用户名
Path path = new Path("/new.lsl3"); //目标路径 不带路径时 出现在/usr/hadoop/下
FSDataOutputStream out = fs.create(path);
FileUtils.copyFile(new File("E:\\Eclipse\\workspace\\hadoop\\src\\hadoop\\lsl.test") , out);
fs.close();
}
}
esclipse配置
工程结构:
接口测试:
在java文件中点击run as junit即可
在http://192.168.10.40:50070的如下页面中查看hadoop集群中的数据
linux下测试
借用windows方式方便的测试了java API。该方法同样适用linux系统,但需要用户配置HADOOPPATH,junit,CLASSPATH三个环境变量。
目前暂没有实际测试。

浙公网安备 33010602011771号