Ubuntu部署Hadoop

本文为51CTO VIP群 网络E人来的来稿,谢谢E人哥,祝在广州一切顺利,大展宏图。
第一步、搭建实验物理环境

1、使用VMware 虚拟机软件安装测试环境,最新VMware可以从我的百度慢盘下载,链接 提取密码 qidi
本博客以后分享在百度盘的文件若没有提供提取密码,那么密码就是qidi
下载好后,校验下SHA1SUM值:

2、下载Ubuntu IOS镜像文件
建议从阿里的镜像站下载,刚刚(2017年10月24日 21:26:47)测试浙大和上海交大的镜像站全打不开了。下载地址
3.新建虚拟机
Ubuntu 最低配置要求
➤ 2 GHz dual core processor or better
➤ 2 GB system memory
➤ 25 GB of free hard drive space
➤ Either a DVD drive or a USB port for the installer media
安装完成后显示界面

为了方便复制宿主机文件进入虚拟机进行使用,需安装 VMware tools 。
将Vmware Tools 挂载至Ubuntu 系统中;

在桌面右击打开终端管理器
进入挂载目录 cd /media/ubuntu/VMware\ Tools/
拷贝CD 中的VM文件至 /tmp 目录下 :cp VMwareTools-10.1.15-6627299.tar /tmp
解压缩包 : tar xf VMwareTools-10.1.15-6627299.tar
进入解压缩目录:cd vmware-tools-distrib/

执行安装 sudo ./vmware-install.pl -d,最后的-d是让程序自动安装,不会一步一步的问题确定吗确定吗?安装完成后重启系统。
重启好后,第一件事就是把apt源改为国内的源。

sudo rm /etc/apt/sources.list
sudo wget -P /etc/apt/ https://hqidi.com/wp-content/uploads/2016/sources.list
sudo apt-get update

安装vim
执行命令 sudo apt install vim

为了完成本实验,需要两台虚拟机,我们需要再克隆一台Ubuntu , 克隆完成后需要修改主机名
修改主机名执行 sudo vim /etc/hosts 及 sudo /etc/hostname
分别在HD1与HD2的 hosts 文件中添加两台机器的解析记录.(IP地址要与你机器的实际地址相同,查看本机IP命令 ifconfig )
192.168.18.133 martin-HD1
192.168.18.135 martin-HD2

第二步、建立双机互信
1、新建Hadoop 账号(HD1与HD2两台机器上都需建立)
执行 sudo useradd hadoop && sudo passwd hadoop
2、安装ssh 建立双机互信 (HD1&HD2都执行下列命令)
执行 sudo apt install openssh-server
启动ssh服务(HD1&HD2都执行) sudo systemctl start sshd.service
为了开机直接启动ssh服务(HD1&HD2都将执行) sudo systemctl enable sshd.service

生成ssh密钥(HD1&HD2都执行) ssh-keygen -t rsa -P ''
互丢公钥,把HD1的公钥追加到HD2的 .ssh/authorized_keys 里,在HD1上执行:
ssh-copy-id -i ~/.ssh/id_rsa.pub martin@martin-HD2
把HD2的公钥追加到HD1的 .ssh/authorized_keys 里,在HD2上执行:
ssh-copy-id -i ~/.ssh/id_rsa.pub martin@martin-HD1

验证双机互信结果
在HD1上执行:ssh martin-HD2 'hostname',正常应该输出 martin-HD2
在HD2上执行:ssh martin-HD1 'hostname',正常应该输出 martin-HD1

第三步、部署Hadoop
1、在martin-HD1上下载hadoop 2.8.1
wget http://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/common/hadoop-2.8.1/hadoop-2.8.1.tar.gz
2、在martin-HD1上解压缩hadoop 2.8.1
tar zxvf hadoop-2.8.1.tar.gz
3、在martin-HD1和martin-HD2上分别安装java
sudo apt install default-jre
测试:
java -version
4、拷贝并建立相应的hadoop文件夹在martin-HD1上

mkdir /home/martin/hadoop
mv /tmp/hadoop-2.8.1 /home/martin/hadoop/hadoop
mkdir /home/martin/hadoop/{hdfs,namenode,tmp}


在martin-HD2上

mkdir /home/martin/hadoop
mkdir /home/martin/hadoop/hdfs
mkdir /home/martin//hadoop/tmp

5、配置hadoop集群文件配置文件有7个:
/home/martin/hadoop/hadoop/etc/hadoop/hadoop-env.sh
/home/martin/hadoop/hadoop/etc/hadoop/yarn-env.sh
/home/martin/hadoop/hadoop/etc/hadoop/slaves
/home/martin/hadoop/hadoop/etc/hadoop/core-site.xml
/home/martin/hadoop/hadoop/etc/hadoop/hdfs-site.xml
/home/martin/hadoop/hadoop/etc/hadoop/mapred-site.xml
/home/martin/hadoop/hadoop/etc/hadoop/yarn-site.xml
修改hadoop-env.sh 添加两行
sudo vim /home/martin/hadoop/hadoop/etc/hadoop/hadoop-env.sh
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-i386
export HADOOP_HOME=/home/martin/hadoop/hadoop

/home/martin/hadoop/hadoop/etc/hadoop/yarn-env.sh文件里面添加一行

cd /home/martin/hadoop/hadoop/etc/hadoop/
sed -i.bak '/# some Java parameters/a\export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-i386' yarn-env.sh \


修改slaves文件
echo -e "martin-HD1\nmartin-HD2" >/home/martin/hadoop/hadoop/etc/hadoop/slaves

sudo vim /home/martin/hadoop/hadoop/etc/hadoop/core-site.xml
在文件最后追加如下内容

<property>
    <name>fs.defaultFS</name>
    <value>hdfs://martin-HD1:9000</value>
</property>
<property> 
  	  <name>io.file.buffer.size</name>
    	  <value>131072</value>
</property>
<property>
  	  <name>hadoop.tmp.dir</name>
  	  <value>file:/home/martin/hadoop/tmp</value>
</property>
<property>
    <name>hadoop.proxyuser.hduser.hosts</name>
    <value>*</value>
</property>
<property>
    <name>hadoop.proxyuser.hduser.groups</name>
    <value>*</value>
</property>

sudo vim /home/martin/hadoop/hadoop/etc/hadoop/hdfs-site.xml
追加如下内容

<configuration>
    <property>
        <name>dfs.namenode.http-address</name>
        <value>martin-HD1:50070</value>
    </property>
    <property>
        <name>dfs.namenode.secondary.http-address</name>
        <value>martin-HD1:9001</value>
    </property>
    <property>
 	       <name>dfs.namenode.name.dir</name>
        <value>file:/home/martin/hadoop/namenode</value>
    </property>
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>file:/home/martin/hadoop/hdfs</value>
    </property>
    <property>
        <name>dfs.replication</name>
        <value>1</value>
    </property>
    <property>
        <name>dfs.webhdfs.enabled</name>
        <value>true</value>
    </property>
    <property>
        <name>dfs.support.append</name>
        <value>true</value>
    </property>
    <property>
        <name>dfs.support.broken.append</name>
 	       <value>true</value>
    </property>
    <property>
        <name>dfs.permissions.enabled</name>
        <value>false</value>
    </property>
</configuration>

cp /home/martin/hadoop/hadoop/etc/hadoop/mapred-site.xml.templent  /home/martin/hadoop/hadoop/etc/hadoop/mapred-site.xml
sudo vim /home/martin/hadoop/hadoop/etc/hadoop/mapred-site.xml
<property>
    <name>mapreduce.framework.name</name>
    <value>yarn</value>
</property>
<property>
    <name>mapreduce.jobhistory.address</name>
    <value>martin-HD1:10020</value>
</property>
<property>
    <name>mapreduce.jobhistory.webapp.address</name>
    <value>martin-HD1:19888</value>
</property>

sudo vim /home/martin/hadoop/hadoop/etc/hadoop/yarn-site.xml
<property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
</property>

<property>
    <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
    <value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
<property>
    <name>yarn.resourcemanager.address</name>
    <value>martin-HD1:8032</value>
</property>
<property>
    <name>yarn.resourcemanager.scheduler.address</name>
    <value>martin-HD1:8030</value>
</property>
<property>
    <name>yarn.resourcemanager.resource-tracker.address</name>
    <value>martin-HD1:8031</value>
</property>
<property>
 	   <name>yarn.resourcemanager.admin.address</name>
    <value>martin-HD1:8033</value>
</property>
<property>
    <name>yarn.resourcemanager.webapp.address</name>
    <value>martin-HD1:8088</value>
</property>

6、在martin-HD1上添加相关环境变量
sudo vim /etc/profile
加入

export PATH=$PATH:/home/martin/hadoop/hadoop/bin:/home/martin/hadoop/hadoop/sbin

保存退出后,source /etc/profile
在martin-HD2上执行相同操作
7、分发hadoop、格式化hdfs
scp -r /home/martin/hadoop/hadoop martin-HD2:/home/martin/hadoop

hadoop namenode -format

8、启动hdfs
start-dfs.sh

9、进行验证
在 /tmp 目录下新建a.txt 文件 在a.txt 中输入部分内容
在hdfs上创建文件夹:
hdfs dfs -mkdir /folder

从本地把a.txt文件拷贝到hdfs相关位置:
hdfs dfs -copyFromLocal /tmp/a.txt /folder

打印hdfs文件内容:
hdfs dfs -cat /folder/a.txt

从hdfs把文件拷贝到本地:
hdfs dfs -copyToLocal /folder/a.txt /tmp/A.txt
验证a.txt 与 A.txt 的内容

安装pip
sudo apt install python-pip
如果出现下列报错信息
Could not get lock /var/lib/dpkg/lock - open
请进入 cd /var/lib/dpkg/
执行 sudo rm -rf /var/lib/dpkg/lock
再次执行 sudo apt install python-pip
安装python hdfs包
pip install hdfs
重置集群服务
执行 stop-all.sh 停止集群服务
执行 start-all.sh 启用集群服务
书写读取 dfs 目录中的文件内容的python 脚本
创建文件 执行 vim read_hdfs.py
python 脚本内容

from hdfs import *

client = Client("http://martin-HD1:50070")

with client.read("/folder/a.txt") as reader:

  print reader.read()

验证脚本是否成功
执行 python read_hdfs.py

建立文件夹、拷贝、浏览文件夹、删除 python 脚本
首先vim /tmp/b.txt 文件
执行 vim operate_hdfs.py
脚本内容

from hdfs import *
client = Client('http://martin-HD1:50070')
dir(client)
print client.list('/')
client.makedirs('/test1')
client.upload('/test1', '/tmp/b.txt', overwrite=True)
print client.list('/test1')
client.delete('/test1/b.txt')
print client.list('/test1')

执行 python operate_hdfs.py 验证

10、使用python实现mapreduce调用的是Hadoop Stream
主要利用:
STDIN(标准输入)
STDOUT(标准输出)
来实现在map函数和reduce函数之间的数据传递。
我们需要做的是利用python的sys.stdin读取输入数据,并把输入传递到sys.stdout,
其他的工作Hadoop的流API会为我们处理。
验证:
创建文本文件
执行 vim /tmp/count.txt 并在文件中输入部分内容
1
2
3
4
4
3
2
1
将文件上传至dfs
执行 hdfs dfs -copyFromLocal /tmp/count.txt /

建立mapper
创建working 文件夹 sudo mkdir /usr/local/working
并赋予权限 sudo chmod 777 /usr/local/working
进入新创建的文件夹 cd /usr/local/working
创建mapper python 脚本
执行 vim m_wc.py
脚本内容

#!/usr/bin/env python
import sys
def read_input(file):
    for line in file:
        yield line.split()

def main(separator='\t'):
    data = read_input(sys.stdin)
    for words in data:
        for word in words:
            print "%s%s%d" % (word, separator, 1)

if __name__ == "__main__":
    main()

创建 reducer python 脚本
脚本文件 执行 vim r_wc.py
脚本内容

#!/usr/bin/env python
from operator import itemgetter
from itertools import groupby
import sys

def read_mapper_output(file, separator = '\t'):
    for line in file:
        yield line.rstrip().split(separator, 1)

def main(separator = '\t'):
    data = read_mapper_output(sys.stdin, separator = separator)
    for current_word, group in groupby(data, itemgetter(0)):
        try:
            total_count = sum(int(count) for current_word, count in group)
            print "%s%s%d" % (current_word, separator, total_count)
        except valueError:
            pass

if __name__ == "__main__":
    main()

在dfs 中创建一个目录
创建 hdfs dfs -mkdir -p /temp/hdin
将之前上传到 dfs 根目录的count.txt 移动到 /temp/hdin 目录中
执行 hdfs dfs -mv /count.txt /temp/hdin/
调用mapper和reducer
hadoop jar /home/martin/hadoop/hadoop/share/hadoop/tools/lib/hadoop-streaming-2.8.1.jar -file m_wc.py -mapper m_wc.py -file r_wc.py -reducer r_wc.py -input /temp/hdin/* -output /temp/hdout
该命令执行过一次后想再次执行计算,需要删除 /temp/hdout 这个目录
执行命令 hdfs dfa -rm -r -f /temp/hdout

查看结果
执行 hdfs dfs -cat /temp/hdout/*

原创文章,转载请注明: 转载自笛声

本文链接地址: Ubuntu部署Hadoop

5 条评论

  • Mr.Li 2017年10月25日 回复

    完全看不懂的打酱油

  • 老刘 2017年10月28日 回复

    逻辑有点乱,不像你写的。

  • 胡俊杰 2017年10月28日 回复

    长知识。

  • 姜辰 2017年10月28日 回复

    完全看懵了。

  • 广州网站建设 2018年7月3日 回复

    看懵了中~~~~

发表评论

电子邮件地址不会被公开。 必填项已用*标注