Hadoop3.x伪分布式及Hbase搭建与单词统计项目构建
0.导语
本节从0开始一步步搭建伪分布式及Hbase等。同时学习使用Intellij Maven构建Map-Reduce项目进行单词统计。
光城的运行环境为:Ubuntu 16.04。
1.准备工作
【JAVA】
Hadoop环境需要JAVA环境,所以首先得安装Java,而Ubuntu默认Java为OpenJdk,需要先卸载,再安装Oracle。除此之外,你也可以不用卸载OpenJDK,将Oracle JAVA设为默认的即可。光城的JAVA环境为1.8。
关于JAVA,大家可以到官网下载,这里给出现在地址,根据不同的系统选择版本!
https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
关于java配置只要输入java或者javac看到输出,即可配置正确,记得配入Path中!
【用户】
在Ubuntu或者类Unix系统中,用户可以通过下列命令添加创建用户:
代码语言:javascript复制sudo useradd -s /bin/bash -g hadoop -d /home/hadoop -m hadoop
如果提示hadoop不再sudoers文件中,执行下列命令:
代码语言:javascript复制vi /etc/sudoers
编辑上述文件:
代码语言:javascript复制# User privilege specification
root ALL=(ALL:ALL) ALL
hadoop ALL=(ALL:ALL) ALL # 添加此行
再执行上述命令:
代码语言:javascript复制light@city:~$ sudo useradd -s /bin/bash -g hadoop -d /home/hadoop -m hadoop
useradd:“hadoop”组不存在
添加用户组:
代码语言:javascript复制light@city:/home$ sudo groupadd hadoop
再次执行即可:
代码语言:javascript复制light@city:~$ sudo useradd -s /bin/bash -g hadoop -d /home/hadoop -m hadoop
设置或修改密码:
代码语言:javascript复制sudo passwd hadoop
【SSH】
安装ssh
代码语言:javascript复制sudo apt-get install openssh-server
配置免密登陆
代码语言:javascript复制su - hadoop
ssh-keygen -t rsa
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
chmod 0600 ~/.ssh/authorized_keys
然后输入
代码语言:javascript复制ssh localhost
此时不需要输入密码,说明成功!
2.伪分布式
【Hadoop】
- 下载及安装
在下列镜像中下载Hadoop版本,我下载的3.0.2。大家可以自行选择版本!
代码语言:javascript复制https://mirrors.cnnic.cn/apache/hadoop/common/
wget https://mirrors.cnnic.cn/apache/hadoop/common/hadoop-3.0.2/hadoop-3.0.2.tar.gz
tar zxvf hadoop-3.0.2.tar.gz
sudo mv hadoop-3.0.2 /usr/local/hadoop
- 配置
编辑etc/hadoop/core-site.xml
,configuration
配置为
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property>
</configuration>
重要点!一定要看本机的9000端口是否被占用,如果被占用了,后面就启动不出来NameNode!
关于查看本机的9000端口是否被占用:
代码语言:javascript复制sudo netstat -alnp | grep 9000
会发现9000端口被php-fpm给占用了,所以这里得修改为其他端口,比如我修改为9012,然后可以再次执行这个命令,会发现没被占用,说明可行!
编辑etc/hadoop/hdfs-site.xml
,configuration
配置为
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
- 初始化
格式化HDFS
代码语言:javascript复制bin/hdfs namenode -format
格式化执行一次即可!
启动NameNode和DataNode
代码语言:javascript复制sbin/start-dfs.sh
这时在浏览器中访问http://localhost:9870/
,可以看到NameNode相关信息。
http://localhost:9864/
查看DataNode相关信息。
由于hadoop3.x版本与2.x版本监听端口不一样,所以如果还是原先的50070便访问不到相关信息,所以如果你不知道上述9870或者9864,没关系,可以通过下面命令查看!
输入netstat命令即可查看tcp监听端口:
代码语言:javascript复制sudo netstat -ntlp
上述两个重要端口,9864后面可以看到进程ID为17270,通过JPS查看可以看到对应DataNode,9870类似方法,就不在多说了。
- 配置YARN
编辑etc/hadoop/mapred-site.xml
,configuration
配置为
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
编辑etc/hadoop/yarn-site.xml
,configuration
配置为
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
- 启动YARN
sbin/start-yarn.sh
查看进程:
代码语言:javascript复制Jps
NodeManager
SecondaryNameNode
NameNode
ResourceManager
DataNode
没错,YARN就是上述的资源管理:ResourceManager。
同理,可以通过上述方法查看ResourceManager的端口,默认为8088。
浏览器输入:http://localhost:8088/cluster
- 启动与停止
启动:
代码语言:javascript复制sbin/start-dfs.sh
sbin/start-yarn.sh
停止:
代码语言:javascript复制sbin/stop-dfs.sh
sbin/stop-yarn.sh
至此,伪分布式搭建完毕!后面开始HBase与Phoenix搭建!
【HBase】
- 下载安装
代码语言:javascript复制https://mirrors.cnnic.cn/apache/hbase/
wget https://mirrors.cnnic.cn/apache/hbase/stable/hbase-1.4.9-bin.tar.gz
tar zxvf hbase-1.4.9-bin.tar.gz
sudo mv zxvf hbase-1.4.9-bin /usr/local/hbase
- 单机HBase配置
编辑conf/hbase-site.xml
,configuration
配置为
<configuration>
<property>
<name>hbase.rootdir</name>
<value>hdfs://localhost:9012/hbase</value>
</property>
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/home/hadoop/zookeeper</value>
</property>
</configuration>
- 启动
bin/start-hbase.sh
jps查看进程:
代码语言:javascript复制HMaster
Jps
- 终端
bin/hbase shell
如果想要关闭HBase,则输入:
代码语言:javascript复制bin/stop-hbase.sh
- HBase伪分布式配置
编辑conf/hbase-site.xml
,configuration
中添加
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
然后修改root由本地文件系统到HDFS,编辑conf/hbase-site.xml
,hbase.rootdir
值由
file:///home/hadoop/hbase
修改为
代码语言:javascript复制hdfs://localhost:9012/hbase
注意后面的端口号9012,需要保证与Hadoop DFS配置中的fs.defaultFS相同!
这样子修改后,会在hdfs文件系统中看到HBase目录,当然你也可以不用配置此项!
上述配置完毕后,保存后,重启HBase即可!
【封装】
每次启动这些输入太多命令,太繁琐,直接一个bash脚本搞定,首先进入/usr/local
,然后再运行这个脚本!
启动脚本:
代码语言:javascript复制#!/bin/bash
hadoop/sbin/start-dfs.sh
hadoop/sbin/start-yarn.sh
hbase/bin/start-hbase.sh
停止脚本:
代码语言:javascript复制#!/bin/bash
hadoop/sbin/stop-dfs.sh
hadoop/sbin/stop-yarn.sh
hbase/bin/stop-hbase.sh
3.单词统计
【环境】
使用Intellij构建单词统计。
【新建maven项目】
启动Intellij,并新建项目选择Maven!
然后点击下一步,GroupId与ArtifactId随便填写,然后进入下一步,填写项目名字即可!
【修改pom.xml】
修改pom.xml如下:
代码语言:javascript复制<repositories>
<repository>
<id>apache</id>
<url>http://maven.apache.org</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-core</artifactId>
<version>1.2.1</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>3.0.2</version>
</dependency>
</dependencies>
根据自己的hadoop版本修改hadoop-common下面的版本号,其他的可以不用修改!然后放在pom.xml里面即可!
此时会看到Maven projects need to imported
,选择Import Changes
,稍等片刻,所有的包就被导入完毕。
【java项目】
在src/main/java
下面右键新建java class,填写类名为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.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.output.FileOutputFormat;
public class WordCount {
public static class TokenizerMapper
extends Mapper<Object, Text, Text, IntWritable> {
private final static IntWritable one = new IntWritable(1);
private Text word = new Text();
public void map(Object key, Text value, Context context
) throws IOException, InterruptedException {
StringTokenizer itr = new StringTokenizer(value.toString());
while (itr.hasMoreTokens()) {
word.set(itr.nextToken());
context.write(word, one);
}
}
}
public static class IntSumReducer
extends Reducer<Text, IntWritable, Text, IntWritable> {
private IntWritable result = new IntWritable();
public void reduce(Text key, Iterable<IntWritable> values,
Context context
) throws IOException, InterruptedException {
int sum = 0;
for (IntWritable val : values) {
sum = val.get();
}
result.set(sum);
context.write(key, result);
}
}
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
Job job = Job.getInstance(conf, "word count");
job.setJarByClass(WordCount.class);
job.setMapperClass(TokenizerMapper.class);
job.setCombinerClass(IntSumReducer.class);
job.setReducerClass(IntSumReducer.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
FileInputFormat.addInputPath(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));
System.exit(job.waitForCompletion(true) ? 0 : 1);
}
}
【输入】
此时需要对单词统计项目导入数据,在src同级目录下,新建input文件夹,然后右键新建file,输入file.txt。里面输入下面内容:
代码语言:javascript复制love fate hehe
love 他 hehe
fate 他 hehe
love 我 hehe
hehe 哈哈 我 你 他 我
这个就是单词统计的源数据!当然你也可以自己修改!
【配置】
然后点击菜单栏的Run
,找到Edit Configurations
,修改配置如下图:
最主要就是修改Program arguments
内容填写为:input output
,这会让项目从 input 目录读数据并将输出结果保存到output
目录!
注意:不要自己新建output!
然后运行WordCount.java
,此时就会看到输出结果: