hadoop简介
Hadoop是一个由Apache基金会所开发的分布式系统基础架构。可以对大数据进行分布式处理的软件框架,核心是HDFS和MapReduce,hadoop生态圈也非常丰富,包括Hbase,FLume等等。
学习hadoop知识储备
- Java编程基础
- Linux基本操作及Linux基本常识,发行版本为CentOS或Ubuntu
- SSH协议原理及其C/S的使用
- 了解分布式文件系统相关知识
安装流程
- 创建hadoop用户
- 配置Java环境
- 设置SSH登陆权限
- 单机安装,伪分布式安装
环境
- UBuntu14.04以上都可以
- hadoop2.6.0
- jdk8
创建hadoop用户
目的:因为linux是多用户多任务的操作系统,所有的用户都有同一个根目录,也可以有自己的用户目录,也就是家目录,为了保存用户使用时的信息,所以创建hadoop用户是为了分清楚在hadoop用户下是为了做一些hadoop的操作和学习,例如MySql这个数据库管理系统原则上也应该分一个用户单独管理。
sudo useradd -m hadoop -s /bin/bash
sudo passwd hadoop
sudo adduser hadoop sudo
- 以上命令描述了创建hadoop用户,并且使用了bash版本的shell
- 设置hadoop用户密码
- 将hadoop用户增加到sudo组,也就是可以在hadoop用户下用超级管理员权限
创建完成后注销当前用户,登录到hadoop用户,并更新软件源
sudo apt update
配置Java运行环境
网上教程很多,版本不要太高,java8比较合适。
安装SSH server并且配置无密码登录
目的:hadoop是一个分布式计算框架,其中需要ssh来登陆到各个结点,实现无密码登陆就不用每次输入密码了。
SSH简介与原理如下:
SSH是安全外壳协议,正确来说就是一个协议,专为远程登录会话和其他网络服务提供安全性的协议,可以安全的远程登陆到其它主机上,进行操作,既然是协议,那就是抽象的,非具体化的,所以就有了不同的实现,实现成ssh这样的一个C/S架构的软件,类似于TCP协议,那就有其TCP软件。目前,ssh协议是比较安全的。
原理:
ssh采用了非对称加密,非对称加密有两个密钥:“公钥”和“私钥”,公钥加密,私钥解密。
TopGun为客户端用户。以下是非对称加密登陆流程
- 远程Server收到Client端用户TopGun的登录请求,Server把自己的公钥发给用户。
- Client使用这个公钥,将密码进行加密。
- Client将加密的密码发送给Server端。
- 远程Server用自己的私钥,解密登录密码,然后验证其合法性。
- 若验证结果,给Client相应的响应。
这种方法就不是绝对安全的,如果中间人用自己的公钥发送给客户端,那么客户端就和中间人进行连接了。如下图。
ssh解决这种问题用了两种方法:
- 第一种级别(基于口令的安全验证)
- 第二种级别(基于密匙的安全验证)
第一种级别(基于口令的安全验证)如下:
首先安装server端,linux都带有ssh客户端。
sudo apt install openssh-server
ssh软件使用:
第一次使用ssh的时候会高你不确定主机的真实性,填写yes之后,紧接着就让你输入的你想要连接的用户密码,你连接的主机用户密码输入正确才能进入,否则不能进入,就算有中间人攻击,你输入的密码和中间人的密码相同的概率那是相当的小。
所谓“中间人”的攻击方式, 就是“中间人”冒充真正的服务器接收你传给服务器的数据,然后再冒充你把数据传给真正的服务器。服务器和你之间的数据传送被“中间人”一转手做了手脚之后,就会出现很严重的问题。
输入密码正确之后,就会执行非对称加密登陆流程。
第一次使用之后会自动在家目录中生成一个.ssh目录,其中的known_hosts文件记录被确认的目标主机,再一次连接的时候就不会让你再次确认,就只用输入密码即可。
公钥私钥都是通过加密算法生成的参数,利用这个参数,也就是公钥在利用算法对传送的数据加密,利用私钥解密。
退出连接输入
exit
第二种级别(基于公钥的安全验证)如下:
第一种方法确实使安全性大大提高但是呢,每一次输入密码就很麻烦,所以就有了第二种基于公钥的安全验证。
- 用户将自己的公钥存放在Server上,追加在家目录下.ssh目录中的文件authorized_keys(用户自己创建)中。
- Server端接收到Client的连接请求后,会在authorized_keys中匹配到Client的公钥pubKey,并生成随机数R,用Client的公钥对该随机数进行加密得到pubKey®,然后将加密后信息发送给Client。
- Client端通过私钥进行解密得到随机数R,然后对随机数R和本次会话的SessionKey利用MD5生成摘要Digest1,发送给Server端。SessionKey是会话密钥,是双方通信的时候随机产生的一种密钥。
- Server端会也会对R和SessionKey利用同样摘要算法生成Digest2。
- Server端会最后比较Digest1和Digest2是否相同,完成认证过程。
通过以上方法完成了通过公钥完成免密码登陆,就算有中间人攻击,第一,中间人不知道你的公钥,很小概率能完成连接,第二,就算知道了你的公钥,中间人也没有私钥,也无法对server完成攻击。
实现:
cd ~/.ssh/
touch authorized_keys
ssh-keygen -t rsa
cat ./id_rsa.pub >> ./authorized_keys
会在.ssh目录下生成id_rsa 和id_rsa.pub文件,其中id_rsa.pub就是公钥,将它加入到authorized_keys中。这时就实现了免密登陆。
以上我都是用的同一台机器,也就是自己连接自己,可以下载虚拟机,模拟一下两台机器互联。
安装hadoop
在apache hadoop安装hadoop2.6.0,并将其解压到/usr/local中,修改目录名,因为在根目录下的执行命令需要输入密码,所以,改变hadoop目录的用户为hadoop,方便操作。
sudo tar -zxvf hadoop-2.6.0.tar.gz -C /usr/local/
cd /usr/local
sudo mv hadoop-2.6.0/ hadoop
sudo chown -R hadoop ./hadoop
ll
查看版本
cd /usr/local/hadoop
./bin/hadoop version
其中hadoop的目录结构就是
其中bin和sbin就是使用hadoop的脚本,类似于jdk中bin中javac这个编译程序,所以可以配置环境。配置环境之后,用source生效。
export HADOOP_HOME=/usr/local/hadoop
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
到此位置,单机版的hadoop已经配置完毕。也就是利用本地的文件系统。
现在我们可以执行例子来感受下 Hadoop 的运行。Hadoop 附带了丰富的例子(运行 ./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0.jar 可以看到所有例子),包括 wordcount、terasort、join、grep 等。
测试如下:
cd /usr/local/hadoop
mkdir ./input
cp ./etc/hadoop/*.xml ./input # 将配置文件作为输入文件
hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar grep ./input ./output 'dfs[a-z.]+'
cat ./output/*
Hadoop 默认不会覆盖结果文件,因此再次运行上面实例会提示出错,需要先将 ./output 删除
rm -r ./output/
伪分布式配置
这一部分需要自学hdfs相关内容
Hadoop 的配置文件位于 /usr/local/hadoop/etc/hadoop/ 中,伪分布式需要修改2个配置文件 core-site.xml 和 hdfs-site.xml 。Hadoop的配置文件是 xml 格式,每个配置以声明 property 的 name 和 value 的方式来实现。这些标签所代表的意义可以在官网上寻找。
修改配置文件 core-site.xml:
<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>
说明:
此外,伪分布式虽然只需要配置 fs.defaultFS 和 dfs.replication 就可以运行,不过若没有配置 hadoop.tmp.dir 参数,则默认使用的临时目录为根目录下的 /tmp/hadoo-hadoop,而这个目录在重启时有可能被系统清理掉,导致必须重新执行 format 才行。所以我们进行了设置,同时也指定dfs.namenode.name.dir 和 dfs.datanode.data.dir,否则在接下来的步骤中可能会出错。
接下来执行:
cd /usr/local/hadoop
./bin/hdfs namenode -format
namenode可以看作是集群中的boss,就像是一块硬盘需要初始化成某种格式才能使用,这里的namenode就是一块硬盘,初始化为hdfs格式了。
Error: JAVA_HOME is not set and could not be found. 的错误,则说明之前设置 JAVA_HOME 环境变量那边就没设置好,那就要好好配置java环境变量,如果还不行的话,修改配置文件目录下hadoop-env.sh文件的参数export JAVA_HOME=安装jdk的具体地址。
启动hdfs
start-dfs.sh
jps是jdk提供的一个查看当前java进程的小工具, 可以看做是JavaVirtual Machine Process Status Tool的缩写。非常简单实用。
jps
出现SecondaryNameNode, DataNode,NameNode,Jps则表示启动成功。
hadoop启动后,会在本地的web端口50070显示一些信息,可以访问 Web 界面 http://localhost:50070 查看 NameNode 和 Datanode 信息,还可以在线查看 HDFS 中的文件。
到此,hadoop成功安装成伪分布式了。关闭hadoop如下:(其中.sh结尾的是shell脚本,直接运行)