本文为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 条评论
完全看不懂的打酱油
逻辑有点乱,不像你写的。
长知识。
完全看懵了。
看懵了中~~~~