Hadoop3.x伪分布式及Hbase搭建与单词统计项目构建

2019-09-20 16:21:24 浏览数 (1)

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。大家可以自行选择版本!

https://mirrors.cnnic.cn/apache/hadoop/common/

代码语言:javascript复制
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.xmlconfiguration配置为

代码语言:javascript复制
<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.xmlconfiguration配置为

代码语言:javascript复制
<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.xmlconfiguration配置为

代码语言:javascript复制
<configuration>
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
</configuration>

编辑etc/hadoop/yarn-site.xmlconfiguration配置为

代码语言:javascript复制
<configuration>
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
</configuration>
  • 启动YARN
代码语言:javascript复制
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

  • 下载安装

https://mirrors.cnnic.cn/apache/hbase/

代码语言:javascript复制
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.xmlconfiguration配置为

代码语言:javascript复制
<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>
  • 启动
代码语言:javascript复制
bin/start-hbase.sh

jps查看进程:

代码语言:javascript复制
HMaster
Jps
  • 终端
代码语言:javascript复制
bin/hbase shell

如果想要关闭HBase,则输入:

代码语言:javascript复制
bin/stop-hbase.sh
  • HBase伪分布式配置

编辑conf/hbase-site.xmlconfiguration添加

代码语言:javascript复制
<property>
  <name>hbase.cluster.distributed</name>
  <value>true</value>
</property>

然后修改root由本地文件系统到HDFS,编辑conf/hbase-site.xmlhbase.rootdir值由

代码语言:javascript复制
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即可,然后输入下面代码:

代码语言:javascript复制
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,此时就会看到输出结果:

output文件夹下面的part-r-0000即可看到输出结果!

0 人点赞