一、 学习目的
熟练掌握Linux的相关命令并会配置java环境。学会安装Hadoop并配置Hadoop的环境。深入理解MapReduce并会进行Hadoop的编程。熟练搭建平台和环境,能执行MapReduce实例,同时会使用自带工具TestDFSIO来测试I/O。二、实验内容
Install Virtual Machine and LinuxInstall HadoopTesting Hadoop PerformanceRealize and run Hadoop applicationReport三、 课程实验设备与环境 VMware Workstation Pro 14.0 Centos 7 Xshell 5 Hadoop-2.9.2 Jdk1.8.0_191
四、 设计过程
安装虚拟机软件和Linux 1.1 安装Virtual Machine虚拟机软件,并在虚拟机上安装Linux,我装的是Centos7 1.2 找到安装Linux的IP地址,可以用Xshell进行命令行管理虚拟机 1.2.1 通过su命令切换到root用户,因为root的权限比一般用户大 1.2.2 输入 ls /etc/sysconfig/network-scripts命令(注意ls与/etc之间有空格),找到ifcfg-ens33这个文件 1.2.3 然后,输入vi /etc/sysconfig/network-scripts/ifcfg-ens33命令(注意vi与/etc之间有空格),输入这个命令后,会打开ifcfg-ens33这个文件,如图: 1.2.4 如果你的是显示的“ONBOOT=no”,就不能上网。下面先把它改为“yes”。 先使用方向键将光标移动到ONBOOT=no那一行,然后按下字母 “i”,此时屏幕下方会出现“INSERT”字样,就可以进行修改操作 修改完成后按“Esc”退出编辑,按“:wq”保存编辑。然后执行service network restart命令,等待重启network。开机后输密码进入操作系统,接着再次换root账户进入终端。 输入“ping www.baidu.com”出现如下图所示,即连上了网络,按ctrl +c 结束指令。 安装一个“ifconfig”命令,ifconfig命令被用于配置和显示Linux内核中网络接口的网络参数,使用:yum install net-tools 我们输入ifconfig 我们可以看到我们的IP地址为192.168.140.134 接下来用Xshell来登录 1.3 通过xshell工具成功连接安装好的虚拟机之后可通过rpm -qa | grep java或 rpm -qa | grep jdk 命令来查询出系统自带的jdk 1.4 清除Linux自带的openjdk 然后通过 rpm -e --nodeps 后面跟系统自带的jdk名 这个命令来删除系统自带的jdk 例如: rpm -e --nodeps java-1.7.0-openjdk-1.7.0.191-2.6.15.5.el7.x86_64 rpm -e --nodeps java-1.7.0-openjdk-headless-1.7.0.191-2.6.15.5.el7.x86_64 rpm -e --nodeps java-1.8.0-openjdk-headless-1.8.0.181-7.b13.el7.x86_64 rpm -e --nodeps java-1.8.0-openjdk-1.8.0.181-7.b13.el7.x86_64删完之后可以再通过 rpm -qa | grep java或 rpm -qa | grep jdk 命令来查询出是否删除掉 1.5 安装一个新的orcle的jdk 接下来就是要安装自己的jdk了,通过命令cd /usr/local/ 进入local目录,并通过 ll(两个小写的L)命令或者 ls 命令(ll本身不是命令,只是 ls -l 命令的一个别名)列出当前目录下得所有非隐含的文件,如果想要看到隐含(以.开头的,如.test.txt)文件信息可通过ll –a(ls -all)来查看 进入local目录之后 通过mkdir java命令来创建java目录存放自己的jdk (扩展:如果你想一次性在同一级目录下创建多个平级的目录可以通过 mkdir brother1 brother2 (如要创建更多就在后面加上去就可以了,中间用空格隔开)这样的命令来创建,如果要一次创建父子目录(parent/child)可以通过 mkdir -p parent/child/grandson 来创建)
cd /usr/local //进入usr的local目录 mkdir java //在local目录下创建于一个java文件夹用来存放jdk此时多出一个java文件夹 创建好之后,进入java目录cd java 在线导入安装包的插件,如果之前没有用过可以通过yum -y install lrzsz命令安装这个插件 我们导入jdk包 传输好后解压一下,并删除原来的压缩文件
tar -zxvf jdk-8u191-linux-x64.tar.gz rm -rf jdk-8u191-linux-x64.tar.gz这时安装包已经没用了,我一般都会删掉安装包 ,通过 rm -rf jdk-8u191-linux-x64.tar.gz删除安装包 -f的意思就是不询问删除,如果你不加 -f 在删除时它会询问你是否要删除该安装包,我是确定要删了就加上 -f 了。这里还有递归删除不询问的命令,如果你要删除一个目录,而这个目录下还有目录或者有文件,比如在parent/child/grandson 这样的目录下你要删除 parent 下得所有目录和文件(包括parent)就可以用到rm -rf parent 命令就可以删除掉了。 删掉安装包之后就开始配置环境变量了,通过vim /etc/profile命令打开profile文件盘配置环境变量。 打开之后按 i 进入insert(插入)模式,在文件末尾添加上环境变量
export JAVA_HOME=/usr/local/java/jdk1.8.0_191 export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar export PATH=$PATH:$JAVA_HOME/bin添加完之后保存并退出,保存并退出的命令有两种 第一种是:按住shift 键然后连按两次z(这是我常用的,因为它方便快速), 第二种是:wq 命令,有一种是不保存退出的命令:q ,注意:以上三种命令都是在非插入模式(插入模式下按键盘左上角的ESC键退出插入模式就是非插入模式了)下操作。 保存完之后输入:source /etc/profile命令使刚才配置的环境变量生效 现在就可以测试jdk了,输入javac命令如果出现以下的文字就说明编译成功了 接下来我们通过 java -version命令来查看你安装的jdk信息 2. 安装并配置hadoop的环境 2.1 hadoop的下载 在 Apache的 Hadoop项目界面找到hadoop的 hadoop下载地址 http://hadoop.apache.org/releases.html 因为直接从Apache官方下载文件速度很慢,所以在表格下面选择别的镜像站地址。 在弹出的界面中会推荐一个下载速度很快的国内镜像站。 2.2 配置ssh免密码登录 以下操作均在root用户中进行,centos7 可以在命令行中使用 su 命令,输入密码后进入root用户。并且默认centos系统中已经正确的配置好了java环境 2.2.1 进入当前用户目录,找到 .ssh 文件夹
cd ~ //切换到当前用户的用户目录下 ls -all //查看当前用户目录下的所有文件查看当前用户的目录下是否有.ssh文件夹,如果没有就自己创建一个 mkdir .ssh 2.2.2 生成私钥和公钥
cd .ssh ssh-keygen -t rsa // 生成公钥和私钥,期间系统会询问密钥的保存位置,直接一路回车确认即可 cp id_rsa.pub authorized_keys // 复制公钥2.2.3 验证ssh免密码登录是否成功
ssh localhost //ssh登录本机,第一次登录可能需要输入一次密码,退出之后再登录就不需要了 exit2.3 解压Hadoop源文件
cd /usr/local rz tar -zxvf hadoop-2.9.2.tar.gz rm -rf hadoop-2.9.2.tar.gz2.4 配置hadoop环境变量
vim /etc/profile //配置系统变量,配置之后可在全局任意地方使用Hadoop命令 打开文件之后,在文件的最后面添加hadoop的配置信息 export HADOOP_HOME=/usr/local/hadoop-2.9.2 //这个地方记得修改成自己Hadoop安装目录的地址 export PATH=$HADOOP_HOME/bin:$PATH //使配置文件生效 source /etc/profile //之后可以输入命令验证配置是否正确生效
2.5 修改hadoop配置文件 修改 /usr/local/hadoop-2.9.2/etc/hadoop/ 下面的hadoop配置文件hadoop-env.sh、hdfs-site.xml、core-site.xml这三个文件
cd /usr/local/hadoop-2.9.2/etc/hadoop/ //切换到Hadoop配置文件所在的目录(1) hadoop-env.sh 将文件中的
export JAVA_HOME=${JAVA_HOME}改成 export JAVA_HOME=/usr/local/java/jdk1.8.0_191 export HADOOP_CONF_DIR=/usr/local/hadoop-2.9.2/etc/hadoop/(2) hdfs-site.xml 补充最后的属性:
<configuration> <property> <name>dfs.replication</name> <value>1</value> </property> </configuration>(3) core-site.xml 在文件的最后补充:
<configuration> <property> <name>fs.defaultFS</name> <value>hdfs://localhost:9000</value> </property> </configuration>2.6 启动hadoop
cd /usr/local/hadoop-2.9.2/bin hdfs namenode -format cd /usr/local/hadoop-2.9.2/sbin ./start-dfs.sh jps在centos系统的浏览器中输入 http://localhost:50070 查看运行在本机上的hadoop的运行状态 2.7 配置YARN 修改 /usr/local/hadoop-2.9.2/etc/hadoop 目录下的YARN配置文件 cd /usr/local/hadoop-2.9.2/etc/hadoop mv mapred-site.xml.template mapred-site.xml //首先复制YARN配置文件 (1) mapred-site.xml 在最后修改:
<configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration>(2) yarn-site.xml 在最后修改:
<configuration> <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> </configuration>运行YARN,验证是否成功
cd /usr/local/hadoop-2.9.2/sbin ./start-yarn.sh //开启YARN jps在浏览器中输入 http://localhost:8088 查看YARN管理的集群状态 3. 测试hadoop TestDFSIO 该测试为Hadoop自带的测试工具,位于$HADOOP_HOME/share/hadoop/mapreduce目录中,主要用于测试DFS的IO性能 我的Hadoop文件安装目录在/usr/local/hadoop-2.9.2工具在/usr/local/hadoop-2.9.2/share/hadoop/mapreduce目录中
yarn jar hadoop-mapreduce-client-jobclient-2.9.2-tests.jar步骤 1、写入测试,向DFS中写入10个512MB的文件
yarn jar /usr/local/hadoop-2.9.2/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-2.9.2-tests.jar TestDFSIO -write -nrFiles 10 -size 512 -resFile /tmp/dfsio.txt2、清除写入的文件
yarn jar /usr/local/hadoop-2.9.2/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-2.9.2-tests.jar TestDFSIO -clean3、读取测试,在HDFS中读取10个512MB的文件
yarn jar /usr/local/hadoop-2.9.2/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-2.9.2-tests.jar TestDFSIO -read -nrFiles 10 -size 512 -resFile /tmp/dfsio.txt 用mapduce实现一个程序 4.1 写一个txt文件导入到root目录下 4.2 将写的txt文件上传到hadoop文件目录下 hadoop fs -mkdir /input //在HDFS的根目录下新建 input 目录 hadoop fs -put classic story.txt /input //将本地的txt文件上传到HDFS的 input 目录下 hadoop fs -ls -R / //查看文件是否成功上传到HDFS上面4.3 在电脑写一个wordcount程序,生成jar包 WordCount程序代码如下:
import java.io.IOException; import java.util.StringTokenizer; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Job; import org.apache.hadoop.mapreduce.Mapper; import org.apache.hadoop.mapreduce.Reducer; import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; import org.apache.hadoop.mapreduce.lib.input.TextInputFormat; import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat; public class WordCount { public static class WordCountMap extends Mapper<LongWritable, Text, Text, IntWritable> { private final IntWritable one = new IntWritable(1); private Text word = new Text(); public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { String line = value.toString(); StringTokenizer token = new StringTokenizer(line); while (token.hasMoreTokens()) { word.set(token.nextToken()); context.write(word, one); } } } public static class WordCountReduce extends Reducer<Text, IntWritable, Text, IntWritable> { public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException { int sum = 0; for (IntWritable val : values) { sum += val.get(); } context.write(key, new IntWritable(sum)); } } public static void main(String[] args) throws Exception { Configuration conf = new Configuration(); Job job = new Job(conf); job.setJarByClass(WordCount.class); job.setJobName("wordcount"); job.setOutputKeyClass(Text.class); job.setOutputValueClass(IntWritable.class); job.setMapperClass(WordCountMap.class); job.setReducerClass(WordCountReduce.class); job.setInputFormatClass(TextInputFormat.class); job.setOutputFormatClass(TextOutputFormat.class); FileInputFormat.addInputPath(job, new Path(args[0])); FileOutputFormat.setOutputPath(job, new Path(args[1])); job.waitForCompletion(true); } }4.4 将wordcount.jar放到root目录中 4.5 执行wordcount程序
hadoop jar /root/wordcount.jar WordCount /input /output4.6 记录结果文件 如果要从HDFS中删除文件,可以使用以下命令:
hadoop fs -rm -r -skipTrash /path_to_file/file_name五、 拓展 What do you think about the Cloud Computing? 什么是云计算?狭义的云计算是指IT基础设施的交付和使用模式,指通过网络以按需、易扩展的方式获得所需的资源(硬件、平台、软件)。提供资源的网络被称为“云”。“云”中的资源在使用者看来是可以无限扩展的,并且可以随时获取,按需使用,随时扩展,按使用付费。这种特性经常被称为像水电一样使用IT基础设施。广义的云计算是指服务的交付和使用模式,指通过网络以按需、易扩展的方式获得所需的服务。这种服务可以是IT和软件、互联网相关的,也可以是任意其他的服务。