美文网首页
hadoop-3.1.3简单部署和测试(mac os)

hadoop-3.1.3简单部署和测试(mac os)

作者: charliecao | 来源:发表于2019-12-01 21:23 被阅读0次

    1.下载3.1.3的hadoop 列表

    cd /Users/caolei/Desktop/big-data/tools
    wget https://www.apache.org/dyn/closer.cgi/hadoop/common/hadoop-3.1.3/hadoop-3.1.3.tar.gz
    
    1. 解压
    tar -zxvf hadoop-3.1.3.tar.gz
    mv hadoop-3.1.3.tar.gz ../ 
    

    3.启动hadoop. 需要安装好JDK.

    cd hadoop-3.1.3
    bin/hadoop
    
    1. 独立运行:直接调用hadoop传入要处理的文件运算并输出.
      mkdir input
      cp etc/hadoop/*.xml input
      bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar grep input output 'dfs[a-z.]+'
      cat output/*
    

    至此完毕.直接提交一个java包,和输入输出参数.完成运算.

    5.伪分布式运行:后台运行hadoop进程并通过提交作业来完成运算.
    6.需要修改两个配置

    vi etc/hadoop/core-site.xml
    <configuration>
        <property>
            <name>fs.defaultFS</name>
            <value>hdfs://localhost:9000</value>
        </property>
    </configuration>
    
    vi etc/hadoop/hdfs-site.xml
    <configuration>
        <property>
            <name>dfs.replication</name>
            <value>1</value>
        </property>
    </configuration>
    

    7.需要设置ssh不需要密码就可以登录,因为集群模式下应该是通过ssh来服务器间通讯的.
    先来检查一下

    ssh localhost
    

    如果成功就可以直接跳过了.如果不成功. 设置本地ssh可以免密码登录本地服务器.

      $ ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
      $ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
      $ chmod 0600 ~/.ssh/authorized_keys
    
    1. 初始化并启动hdfs.启动后可以在http://localhost:9870/查看到hdfs的webui
    bin/hdfs namenode -format
    sbin/start-dfs.sh
    

    9.创建hdfs文件夹用来输入和输出

      $ bin/hdfs dfs -mkdir /user
      $ bin/hdfs dfs -mkdir /user/<username>
    

    10.复制需要测试的数据到input文件夹

      $ bin/hdfs dfs -mkdir input
      $ bin/hdfs dfs -put etc/hadoop/*.xml input
    

    11.提交任务

      $ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar grep input output 'dfs[a-z.]+'
    

    12.获取结果

      $ bin/hdfs dfs -get output output
      $ cat output/*
    或者直接查看hdfs上的内容
    $ bin/hdfs dfs -cat output/*
    

    13.关闭hdfs

    sbin/stop-dfs.sh
    

    14.单节点的YARN模式
    15.修改两处配置, 需要启动hdfs并创建文件夹.

    etc/hadoop/mapred-site.xml:
    
    <configuration>
        <property>
            <name>mapreduce.framework.name</name>
            <value>yarn</value>
        </property>
        <property>
            <name>mapreduce.application.classpath</name>
            <value>$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/*:$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/lib/*</value>
        </property>
    </configuration>
    etc/hadoop/yarn-site.xml:
    
    <configuration>
        <property>
            <name>yarn.nodemanager.aux-services</name>
            <value>mapreduce_shuffle</value>
        </property>
        <property>
            <name>yarn.nodemanager.env-whitelist</name>
            <value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>
        </property>
    </configuration>
    

    16.启动yarn集群.可以在http://localhost:8088/查看webui

    $ sbin/start-yarn.sh
    

    17.运行任务

    18.关闭集群

    sbin/stop-yarn.sh
    
    1. 未完. 创建自己的hadoop jar任务并提交.yarn集群创建和管理.

    1. 例子: WordCount v1.0
    //导入ioexception
    import java.io.IOException;
    //分词
    import java.util.StringTokenizer;
    //hadoopconfig
    import org.apache.hadoop.conf.Configuration;
    //fs 路径
    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();
    //静态函数map
        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.
            context.write(word, one);
          }
        }
      }
    //静态类 继承Reducer类型为文本,可写整数...
      public static class IntSumReducer
           extends Reducer<Text,IntWritable,Text,IntWritable> {
    //保存结果的变量
        private IntWritable result = new IntWritable();
    //关键函数匿名函数.key 值 内容类型.
        public void reduce(Text key, Iterable<IntWritable> values,
                           Context context
                           ) throws IOException, InterruptedException {
    //sum
          int sum = 0;
    //遍历值 每个值为val 累加.
          for (IntWritable val : values) {
            sum += val.get();
          }
    //结果字段写上sum
          result.set(sum);
    //内容写 key,值
          context.write(key, result);
        }
      }
    
    //Main函数.从这里执行.
      public static void main(String[] args) throws Exception {
        Configuration conf = new Configuration();
    //创建一个实例名称
        Job job = Job.getInstance(conf, "word count");
    //根据当前类来设置需要的Jar
        job.setJarByClass(WordCount.class);
    //使用分词器映射
        job.setMapperClass(TokenizerMapper.class);
    //使用整数相加来进行归并
        job.setCombinerClass(IntSumReducer.class);
    //再次使用整数相加来进行聚合
        job.setReducerClass(IntSumReducer.class);
    //设置输出Key
        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);
      }
    }
    

    基本能看懂,就是写了一个map函数一个reducer函数.
    对每一行做处理,先分词,再对每一行进行计数.我靠那时候写的很痛苦啊.相当于嵌套两个java函数进去对每行数据进行映射.对映射结果进行运算.对比使用spark scral DF sql 会好写很多..但是如果原始文件是纯文本,对列进行操作会更复制.难怪只是基础,构建上层的spark之类工具进行转意.会有什么好处么.深入之后再说吧.

    需要设置几个环境变量

    //Java_Home java安装的目录
    export JAVA_HOME=/usr/java/default
    //Path增加Java的执行命令
    export PATH=${JAVA_HOME}/bin:${PATH}
    //增加编译时HADOOP_CLASSPATH 需要的类库.
    export HADOOP_CLASSPATH=${JAVA_HOME}/lib/tools.jar
    

    编译

    //执行hadoop 编译当前文件夹下的java类.同时使用com.sun.tools.javac.Main 为命名空间.
    $ bin/hadoop com.sun.tools.javac.Main WordCount.java
    //使用jar打包 成wc.jar 将当前文件夹下编译出来的类.
    $ jar cf wc.jar WordCount*.class
    
    
    

    在hdfs上创建输入和输出文件夹

    /user/joe/wordcount/input - input directory in HDFS
    /user/joe/wordcount/output - output directory in HDFS
    
    ../bin/hadoop fs -mkdir /user/charlie/input
    ../bin/hadoop fs -mkdir /user/charlie/output
    

    创建一些测试文本

    $ bin/hadoop fs -ls /user/joe/wordcount/input/
    /user/joe/wordcount/input/file01
    /user/joe/wordcount/input/file02
    
    $ bin/hadoop fs -cat /user/joe/wordcount/input/file01
    Hello World Bye World
    
    $ bin/hadoop fs -cat /user/joe/wordcount/input/file02
    Hello Hadoop Goodbye Hadoop
    

    运行应用:

    $ bin/hadoop jar wc.jar WordCount /user/joe/wordcount/input /user/joe/wordcount/output
    

    查看输出:

    $ bin/hadoop fs -cat /user/joe/wordcount/output/part-r-00000
    Bye 1
    Goodbye 1
    Hadoop 2
    Hello 2
    World 2
    

    当前执行好像环境变量中存在之前设置的路径.所以需要重新设置.
    先来看看基本的 映射-聚合 任务怎么写.以及使用IDEA怎么快速写这种任务. 再往后就直接可以条到Spark中玩了.毕竟速度快很多.再再然后就是可以跑到Zeppline中玩.毕竟更更方便.

    使用IDEA进行Hadoop Job编写.

    可以参考这个做一遍. 主要是Maven和 IDEA.以及Java的打包运行之类,习惯一遍就好了.
    https://www.jianshu.com/p/f55142420985

    使用IDEA进行Spark Job编写.

    使用IDEA进行Flink Job编写.

    最后试试直接使用vscode编写.测试和部署,反正都是Maven项目.应该都是一样的.

    相关文章

      网友评论

          本文标题:hadoop-3.1.3简单部署和测试(mac os)

          本文链接:https://www.haomeiwen.com/subject/pvltgctx.html