实验一
一、下载安装Vmware Workstation Pro 12
二、安装CentOS
点击【创建新的虚拟机】→ 【自定义安装】→ 【下一步】→ 【稍后安装操作系统(S)】→【Linux(L)】→ 【输入虚拟机名称,选择安装位置】→ 【下一步】→ 【使用网络地址转换(NAT)(E)】→ 【LSI Logic(L)】点击【下一步】→ 【SCSI(S)】→ 【创建新虚拟磁盘】→ 【将虚拟磁盘拆分成多个文件(M)】→ 选择【自定义硬件】,点击【浏览】输入安装文件的路径 → 点击【完成】,开启虚拟机。然后选择虚拟机的语言,网络与主机名记录下来,设置登录密码,开始安装虚拟机。
三、安装配置Hadoop
1、开启虚拟机,首先关闭防火墙。将jdk和hadoop压缩包传入虚拟机,解压。
2、配置jdk:
vi /etc/profile文件添加:
export JAVA_HOME=/opt/module/jdk1.8.0_121
export PATH=$JAVA_HOME/bin:$PATH
Esc :wq!保存并退出。不需要配置CLA:SSPATH。
source /etc/profile配置生效
运行命令javac,检验是否成功。
3、配置HADOOP并生效
vi /etc/profile文件添加:
export HADOOP_HOME=/opt/module/hadoop-2.7.3
export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
Esc :wq!保存并退出。
source /etc/profile配置生效。
4、Hadoop伪分布式
修改配置文件:
①core-site.xml
<!--配置HDFS主节点,namenode的地址,9000是RPC通信端口-->
<property>
<name>fs.defaultFS</name>
<value>hdfs://bigdata128:9000</value>
</property>
<!--配置HDFS数据块和元数据保存的目录,一定要修改-->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop-2.7.3/tmp</value>
</property>
②core-site.xml
<!--注释配置数据块的冗余度,默认是3-->
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<!--secondaryNameNode的主机地址-->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>bigdata128:50090</value>
</property>
③mapred-site.xml(该配置文件不存在,先复制)
cp mapred-site.xml.template mapred-site.xml
<!--配置MR程序运行的框架-->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
④yarn-site.xml
<!--配置Yarn的节点-->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>bigdata128</value>
</property>
<!--NodeManager执行MR任务的方式是Shuffle洗牌-->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
⑤Slaves文件里使用默认localhost,或者添加 bigdata128(既是NameNode又是DataNode)
注:如果Slaves文件为空,就没有DataNode和NodeManager。
⑥修改\etc\hosts配置文件
运行命令 vi \etc hosts
注释掉已有内容,添加虚拟机的ip及对应主机名:
192.168.163.128 bigdata128
⑦修改\etc\配置文件
运行命令 vi \etc hostname
添加虚拟机的主机名:
bigdata128
重启虚拟机,主机名生效。
格式化:hdfs namenode -format
启动名称节点和数据节点:start-all.sh
访问50070和8088端口成功则伪分布式完成。
5、完全分布式
修改配置文件:
①slaves配置文件
三台虚拟机分别都运行命令 vi /opt/module/hadoop-2.7.3/etc/hadoop slaves
修改slaves为:
bigdata129
bigdata131
②修改\etc\hosts配置文件
三台虚拟机分别都运行命令 vi \etc hosts
注释已有内容,添加集群三台虚拟机的ip及对应主机名:
192.168.163.128 bigdata128
192.168.163.129 bigdata129
192.168.163.131 bigdata131
③修改\etc\hostname配置文件
三台虚拟机分别都运行命令 vi \etc hostname
添加各自的主机名bigdata128或者bigdata129或者bigdata131。
重启全部虚拟机,主机名生效。
格式化:
在主节点bigdata128上面输入格式化命令(hdfs namenode -format),格式化集群。
注:如果不是第一次格式化,三台虚拟机都删除\opt\module\hadoop-2.7.3\下面的tmp、logs目录:rm –rf \opt\module\hadoop-2.7.3\tmp rm –rf \opt\module\hadoop-2.7.3\logs
注:如果格式化之前启动过集群,先在主节点bigdata128上面停止集群(stop-all.sh),再格式化。
启动集群:
在主节点bigdata128上面输入启动命令(start-all.sh),启动集群。
访问50070和8088端口成功则伪分布式完成。
实验二
使用Hadoop和Java API实现文件的读写
步骤:1.安装JDK→2.安装Eclipse→3.安装Maven→4. Eclipse里配置Maven (下载Windows版本,在Windows里安装使用。)
1、新建HDFS目录/aadir,写入/上传 本地文件e:\\hdfs\\aa.txt 到HDFS的/aadir目录下,查看HDFS文件/bb.txt是否存在。
package hdfs.files;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
public class HDFSMkdir{
private static InputStream input;
private static OutputStream output;
public static void main(String[] args) throws IOException{
System.setProperty("HADOOP_USER_NAME","root");
Configuration conf=new Configuration();
conf.set("fs.defaultFS","hdfs://192.168.43.230:9000");
FileSystem client=FileSystem.get(conf);
client.mkdirs(new Path("/aadir"));
client.mkdirs(new Path("/bb.txt"));
input = new FileInputStream("E:\\hdfs\\aa.txt");
output =client.create(new Path("/aadir/aaout.txt"));
output =new FileOutputStream("E:\\hdfs\\bbout.txt");
input =client.open(new Path("/bb.txt"));
byte[] buffer=new byte[1024];int len=0;
while((len= input.read(buffer))!=-1) {
output.write(buffer,0,len);
}
output.flush();
input.close();
output.close();
System.out.println("successfully!");
String fileName="/bb.txt";
if(client.exists(new Path(fileName))) {
System.out.println("文件存在! ");
}
else
{
System.out.println("文件不存在! ");
}
}
}
2、读/下载 HDFS的根目录文件/bb.txt 到本地e:\\hdfs目录下。
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
public class HDFSDownload {
private static InputStream input;
private static OutputStream output;
public static void main(String[] args) throws IOException{
System.setProperty("HADOOP_USER_NAME", "root");
Configuration conf=new Configuration();
conf.set("fs.defaultFS", "hdfs://bigdata128:9000");
FileSystem client=FileSystem.get(conf);
output =new FileOutputStream("E:\\hdfs\\bbout.txt");
input =client.open(new Path("/bb.txt"));
byte[] buffer=new byte[1024];
int len=0;
while((len=input.read(buffer))!=-1) {
output.write(buffer,0,len);
}
output.flush();
input.close();
output.close();
}
}
实验三
启动自带MapReduce实例程序WordCount
Map处理 :public class WordCountMapper extends Mapper<LongWritable, Text, Text, IntWritable>
Reduce处理: public class WordCountReducer extends Reducer <Text, IntWritable, Text, IntWritable>
Job配置: public class WordCountDriver //关联使用的Mapper类
job.setMapperClass(WordCountMapper.class); //关联使用的Reducer类
job.setReducerClass(WordCountReducer.class);
public class WordCountMapper extends Mapper<LongWritable, Text, Text, IntWritable>{
//对数据进行打散
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
//输入数据 hello world love work
String line = value.toString();
//对数据切分
String[] words=line.split(" ");
//写出<hello, 1>
for(String w:words) {
//写出reducer端
context.write(new Text(w), new IntWritable(1));
}}}
public class WordCountReducer extends Reducer <Text, IntWritable, Text, IntWritable>{
protected void reduce(Text Key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
//记录出现的次数
int sum=0;
//累加求和输出
for(IntWritable v:values) {
sum +=v.get();
}
context.write(Key, new IntWritable(sum));
}
}
public class WordCountDriver {
public static void main(String[] args) throws IllegalArgumentException, IOException, ClassNotFoundException, InterruptedException {
// 设置root权限
System.setProperty("HADOOP_USER_NAME", "root");
//创建job任务
Configuration conf=new Configuration();
Job job=Job.getInstance(conf);
//指定jar包位置
job.setJarByClass(WordCountDriver.class);
//关联使用的Mapper类
job.setMapperClass(WordCountMapper.class);
//关联使用的Reducer类
job.setReducerClass(WordCountReducer.class);
//设置Mapper阶段输出的数据类型
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(IntWritable.class);
//设置Reducer阶段输出的数据类型
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
//设置数据输入路径和文件名
FileInputFormat.setInputPaths(job, new Path("c:\\in\\aa.txt"));
//设置数据输出路径
FileOutputFormat.setOutputPath(job, new Path("c:\\out"));
//提交任务
Boolean rs=job.waitForCompletion(true);
//退出
System.exit(rs?0:1);
}
}
生成jar包之后,在虚拟机上运行。
实验四
安装并配置Hbase,使用Hbase的Java API实现简单的CRUD操作
1.HBase安装配置
①下载压缩包(选择与自己安装的Hadoop版本的兼容版本,见后面附录)
官网下载地址:https://mirrors.tuna.tsinghua.edu.cn/apache/hbase/stable/
选择稳定版hbase-1.4.9-bin.tar.gz,在Windows里面下载。
②将压缩包从Windows传输到Linux当前目录下
SecureCRT 【File】→【Connect SFTP Session】开启sftp操作
③安装
解压安装到指定目录下/opt/module(/opt是系统自带目录,之下的/module是自己创建的)
④配置环境变量
在/etc/profile文件里添加HBase安装路径的配置信息,之后用source命令使配置生效。
2.HBase配置(伪分布式模式)
配置文件位于HBase安装路径的conf目录(/opt/module/hbase/conf)下面
①配置hbase-env.sh
设置Java安装路径
设置HBase的配置文件路径(/opt/module/hbase/conf)
采用HBase自带Zookeeper,设置参数true
②配置hbase-site.xml
<!--hbase共享目录,持久化hbase数据-->
<!--配置为core-site.xml 中的fs.defaultFS -->
<property>
<name>hbase.rootdir</name>
<value>hdfs://bigdata128:9000/hbase</value>
</property>
<!--分布式运行模式,false(默认)为单机模式-->
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<!--Zookeeper集群的地址列表,伪分布式用默认localhost-->
<property>
<name>hbase.zookeeper.quorum</name>
<value>localhost</value>
</property>
③启动并运行HBase(之前启动Hadoop)
启动HBase,并jps查看。
3.进入HBase数据库
①创建表
②添加数据
③查看数据
④删除数据
⑤删除表
实验五
安装Redis、MangoDB了解其基本操作
1.下载安装redis
下载:wget http://download.redis.io/releases/redis-5.0.4.tar.gz
解压:tar -zxvf redis-5.0.4.tar.gz
安装gcc使用make命令:make install安装redis
启动redis:./redis-server
2.redis连接配置redis.conf文件
1.cd ..(redis.conf文件默认在redis安装根目录下)
2.vi redis.conf
[1] daemonize yes(no改为yes)
[2]protected-mode no(yes改为no)
[3]requirepass foobared(将foobared改为自己的密码,并且删除前面”#“,例如:我的密码时“111111”}
[4]bind 自己虚拟机的IP
MongoDB下载安装:https://docs.mongodb.com/manual/tutorial/install-mongodb-on-red-hat/
实验六
安装配置Hive、MySQL以及JDBC驱动
1.下载Hive,解压安装
2.Hive配置环境变量
export HIVE_HOME=/opt/module/apache-hive-3.1.1-bin
export PATH=$PATH:$HIVE_HOME/bin12
3.修改Hive的hive-env.sh文件
export JAVA_HOME=/usr/java ##Java路径
export HADOOP_HOME=/usr/local/hadoop ##Hadoop安装路径
export HIVE_HOME=/usr/local/hive ##Hive安装路径
export HIVE_CONF_DIR=/usr/local/hive/conf ##Hive配置文件路径
4.下载安装MySQL
下载安装:
wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm1
rpm -ivh mysql-community-release-el7-5.noarch.rpm1
yum install mysql-server1
设置密码:
mysql -u root1
重启MySQL服务:
service mysqld restart1
5.配置JDBC驱动
将MySQL的JDBC驱动 mysql-connector-java-5.1.43.jar添加到HIVE_HOME/lib 目录下。
6.Hive Metastore配置
6.1.创建数据库和用户
假定你已经安装好 MySQL。下面创建一个 hive 数据库用来存储 Hive 元数据,且数据库访问的用户名和密码都为 hive。
mysql> CREATE DATABASE hive;
mysql> USE hive;
mysql> CREATE USER 'hive'@'localhost' IDENTIFIED BY 'hive';
mysql> GRANT ALL ON hive.* TO 'hive'@'localhost' IDENTIFIED BY 'hive';
mysql> GRANT ALL ON hive.* TO 'hive'@'%' IDENTIFIED BY 'hive';
mysql> FLUSH PRIVILEGES;
mysql> quit;1234567
6.2.修改hive-site.xml
进入/opt/module/hive/conf目录,修改default.xml.template的文件名为hive-site.xml。(可以使用cp或者mv命令)
cp hive- default.xml.template hive-site.xml
在最后添加以下属性:
<property>
<!-- 元数据库的链接地址 mysql -->
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://bigdata131:3306/hivedb?createDatabaseIfNotExist=true</value>
<description>JDBC connect string for a JDBC metastore</description>
</property>
<property>
<!-- 指定mysql驱动 -->
<!-- mysql5的驱动是com.mysql.jdbc.Driver,mysql6以后的是com.mysql.cj.jdbc.Driver。 -->
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
<description>Driver class name for a JDBC metastore</description>
</property>
<property>
<!-- 指定mysql用户名 -->
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
<description>username to use against metastore database</description>
</property>
<property>
<!-- 指定mysql密码 请输入自己的MySQL连接密码 -->
<name>javax.jdo.option.ConnectionPassword</name>
<value>root</value>
<description>password to use against metastore database</description>
</property>
注:
查看Hive建库、建表默认的hdfs目录为/user/hive/warehouse
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
<description>location of default database for the warehouse</description>
</property>
7.启动Hive
①启动Hadoop:start-all.sh
②初始化Metastore架构:schematool -dbType mysql -initSchema
③启动Hive:hive
hive> 进入hive shell
④创建/删除/修改/查看 数据库、表、视图,向表中装载数据,查询数据等等。
注:
①启动hive报错:Exception in thread "main" java.lang.IllegalArgumentException: java.net.URISyntaxException: Relative path in absolute URI: ${system:java.io.tmpdir%7D/$%7Bsystem:user.name%7D,原因是hive-site.xml里的临时目录没有设置好。
修改${system:Java.io.tmpdir}为自己创建的临时目录/opt/module/hive/tmp。
<property>
<name>Hive.exec.local.scratchdir</name> <value>${system:Java.io.tmpdir}/${system:user.name}</value>
<description>Local scratch space for Hive jobs</description>
</property>
<property>
<name>hive.downloaded.resources.dir</name> <value>${system:java.io.tmpdir}/${hive.session.id}_resources</value>
<description>Temporary local directory for added resources in the remote file system.</description>
</property>
<property>
<name>hive.server2.logging.operation.log.location</name>
<value>${system:java.io.tmpdir}/${system:user.name}/operation_logs</value>
<description>Top level directory where operation logs are stored if logging functionality is enabled</description>
</property>
<property>
<name>hive.querylog.location</name>
<value>${system:java.io.tmpdir}/${system:user.name}</value>
<description>Location of Hive run time structured log file</description>
</property>
实验七
安装配置Spark以及Scala语言环境,分别使用Spark语言和Scala语言编写WordCount程序
1.下载安装Scala
下载后解压,在/etc/profile文件中加入安装路径:
export SCALA_HOME=/usr/local/scala/scala-2.12.8
export PATH=$PATH:$SCALA_HOME/bin
在每一个节点上都安装配置scalar,安装完后发送给slave1、slave2:
scp -r /usr/local/scala/scala-2.12.8 root @slave1:/usr/local/scala
scp -r /usr/local/scala/scala-2.12.8 root @slave2:/usr/local/scala
2.下载安装Spark
下载:http://mirrors.tuna.tsinghua.edu.cn/apache/spark/spark-2.4.2/spark-2.4.2-bin-hadoop2.7.tgz
安装解压到以下路径
/usr/local/spark
编辑/etc/profile文件,增加:
export SPARK_HOME=/usr/local/spark/spark-2.4.2-bin-hadoop2.7
export PATH=$PATH:$SPARK_HOME/bin
生效:source /etc/profile
2.修改spark-env.sh文件
#Java环境变量
export JAVA_HOME=/opt/module/jdk1.8.0_121
#Scala环境变量
export SCALA_HOME=/usr/local/scala
#Hadoop环境变量
export HADOOP_HOME=/opt/module/hadoop-2.7.3/
#定义管理端口
export SPARK_MASTER_WEBUI_PORT=8080
#定义master域名和端口
export SPARK_MASTER_HOST=spark-master
export SPARK_MASTER_PORT=7077
#定义master的地址slave节点使用
export SPARK_MASTER_IP=spark-master
#定义work节点的管理端口.work节点使用
export SPARK_WORKER_WEBUI_PORT=8080
#每个worker节点能够最大分配给exectors的内存大小
export SPARK_WORKER_MEMORY=1g
3.新建slaves文件:
cp slaves.template slaves
将slaves文件修改为:
slaver1
slaver2
配置完成,分发给其他节点,并且完成/etc/profile文件的配置 :
scp -r /usr/local/spark/spark-2.4.2 root @slave1:/usr/local/spark
scp -r /usr/local/spark/spark-2.4.2 root @slave2:/usr/local/spark
启动spark:./sbin/start-all.sh
4.执行 spark-shell
4.1.加载本地文件(“file:///opt/module/code/wordcount/word.txt")centos7系统中必须存在该文件。
scala>val textFile = sc.textFile("file:///opt/module/code/wordcount/word.txt")
scala>textFile.first()
4.2.读取hdfs中文件(/user/root/word.txt hdfs中必须存在,若不存在则手动创建)
val textFile = sc.textFile("hdfs://bigdata128:9000/user/root/word.txt")
textFile.first()
4.3.词频统计:
val wordCount = textFile.flatMap(line => line.split(" ")).map(word => (word, 1)).reduceByKey((a, b) => a + b)
wordCount.collect()
5.安装sbt打包:
下载安装:https://bintray.com/sbt/rpm/rpm > bintray-sbt-rpm.repo
mv bintray-sbt-rpm.repo /etc/yum.repos.d/
yum install sbt
6.运行sbt:
安装sbt成功:CTRL+C退出sbt
回到root目录,创建一个文件夹test
创建WordCount.scala;
创建word-count.sbt;
执行打包;
打开test02, part-00000文件即是程序的输出文件。