研究院指导笔记整理

前期

​ 主要是虚拟机的下载、安装、创建、配置。没记什么,因为早就弄好了。

​ 一些基础的命令。

是否使用照妖镜使妖怪现形

解压

1
tar -zxvf jdk-8u251-linux-x64.tar.gz -C /usr/local/

更改网络配置

1
vim /etc/sysconfig/network-scripts/ifcfg-ens33
1
2
3
4
5
6
dhcp改static
IPADDR=192.168.222.100
NETMASK=255.255.255.0
GATEWAY=192.168.222.2
DNS1=223.5.5.5
DNS2=223.6.6.6
1
service network restart

配环境变量

1
vim /etc/profile
1
source /etc/profile

防火墙

1
2
3
4
5
启动: systemctl start firewalld
关闭: systemctl stop firewalld
查看状态: systemctl status firewalld
开机禁用 : systemctl disable firewalld
开机启用 : systemctl enable firewalld

主机名

1
hostnamectl set-hostname px02 && bash

分发

1
scp -r hadoop/ px03:/usr/local/hadoop-2.9.2/etc/

ssh

1
ssh-keygen -t rsa && ssh-copy-id 地址

day03 应该是 一台

  1. hadoop-env.sh

    1
    export JAVA_HOME=/usr/local/jdk1.8.0_251
  2. core-site.xml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <!-- 指定HDFS中NameNode的地址 -->
    <property>
    <name>fs.defaultFS</name>
    <value>hdfs://hadoop100:9000</value>
    </property>

    <!-- 指定Hadoop运行时产生文件的存储目录 -->
    <property>
    <name>hadoop.tmp.dir</name>
    <value>/usr/local/hadoop-2.9.2/tmp</value>
    </property>
  3. hdfs-site.xml

    1
    2
    3
    4
    5
    <!-- 指定HDFS副本的数量 -->
    <property>
    <name>dfs.replication</name>
    <value>1</value>
    </property>
  4. 启动

    1
    2
    3
    4
    5
    6
    7
    8
    9
    格式化NameNode(第一次启动时格式化,以后就不要总格式化)
    hadoop namenode -format
    启动NameNode
    hadoop-daemon.sh start namenode
    启动DataNode
    hadoop-daemon.sh start datanode
    (当时应该没有执行)hadoop-daemon.sh start secondarynamenode
    # 注意配置环境变量,否则要写全路径。启动后用jps(要先配置java)查看
    web页面:机子ip:50070

day04 第一台伪分布+多一个配置

  1. hadoop-env.sh JAVA_HOME

  2. vi core-site.xml 不变

    1
    2
    <property><name>fs.defaultFS</name><value>hdfs://ip:9000
    hadoop.tmp.dir /usr/local/hadoop-2.9.2/tmp
  3. vi hdfs-site.xml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    <property>
    <name>dfs.replication</name>
    <value>3</value>
    </property>
    <!-- 指定 Hadoop 辅助名称节点主机配置 ,可以不设置,默认在和namenode在同一台机器上 -->
    <property>
    <name>dfs.namenode.secondary.http-address</name>
    <value>hadoop104:50090</value>
    </property>
  4. vim slaves

    1
    2
    3
    192.168.100.102 去掉localhost 这是本机 下面是其他机
    192.168.100.103
    192.168.100.104
  5. 1
    2
    3
    4
    5
    6
    7
    拷贝到其他机器 profile jdk hadoop
    scp -r /usr/local/hadoop-2.9.2/ 192.168.100.103:/usr/local/
    为了方便生成密钥 单向的
    ssh-keygen -t rsa
    ssh-copy-id 地址

    如果通过其他方式比如xftp传输, Permission denied 命令行输入 sudo chmod -R 777 /(java_home的完整路径) 同理
  6. 启动

    1
    2
    3
    4
    5
    格式化 他说你地址写那个就在那里格式化 但我不清楚那个地址 我在第2台机子上格的
    hadoop namenode -format
    如果没改主机名,会出现localhost/127.0.0.1 而不是分配好的ip地址
    hostnamectl set-hostname px02
    bash
  7. 1
    2
    3
    4
    5
    6
    映射 他说用映射比较好,主机名ip都行
    vim core-site.xml 把ip改为主机名
    改了要分发一下
    vim /etc/hosts
    ip 名
    都改或分发
  8. 启动

    1
    start-dfs.sh
  9. web

    1
    http://192.168.100.102:50070/ 应该是namenode的机子ip

day05

搭建 yarn 昨天hdfs

  1. vim yarn-env.sh

    1
    JAVA_HOME /usr/local/jdk1.8.0_251/
  2. vim yarn-site.xml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <!-- reducer获取数据的方式-->
    <property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
    </property>
    <!-- 指定yarn的resourcemanager的地址-->
    <property>
    <name>yarn.resourcemanager.hostname</name>
    <value>px03</vslue>
    </property>
  3. vim mapred-env.sh

    1
    JAVA_HOME
  4. mapred-site.xml

    1
    2
    3
    4
    5
    6
    7
    8
    cp mapred-site.xml.template mapred-site.xml
    拷贝一份,以防写错
    vim mapred-site.xml
    <!--指定mr在yarn上运行-->
    <property>
    <name>mapreduce.framework.name</name>
    <value>yarn</value>
    </property>
  5. 分发

    1
    2
    4个文件 可偷懒分发hadoop文件夹 可用主机名或ip
    scp -r hadoop/ px03:/usr/local/hadoop-2.9.2/etc/
  6. 启动

    1
    2
    3
    4
    5
    resourcemanage在那台机子就在那台启动,比如我的px03
    要先启动hdfs
    start-dfs.sh(我是在px02上启动的 我的机子 02 03 04)
    再启动yarn 若未配置免密则须输密码
    start-yarn.sh(我03上启动的)
  7. web页面

    1
    2
    http://192.168.100.103:8088/ ip为resourcemanage的机子的ip
    注:后面的再次配置会把端口改为18088
  8. 如果觉得不方便,把所有主机写在同一台,secondnamenode去掉

hdfs基本命令

  1. fs和dfs

    1
    2
    bin/hadoop fs具体命令OR bin/hdfs dfs具体命令。
    dfs是fs的实现类。
  2. 命令

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    帮助
    hadoop fs -help 命令
    -ls
    hadoop fs -ls / /根目录
    -mkdir 创建目录
    hadoop fs -mkdir / 可在hdfs web界面看 ip/explorer.html#/
    从本地(不是windows)剪切粘贴到HDFS
    hadoop fs -moveFromLocal 文件 目录
    查看文件
    hadoop fs -cat 文件
    追加
    hadoop fs -appendToFile 源文件 目标文件
    从本机拷贝 等同于 -put
    -copyFromLocal 文件 目录
    拷贝回本地 等同于 -get
    -copyToLocal 文件 目录
    HDFS中拷贝到另一个路径
    -cp 文件 目录
    移动 -mv

    感觉就是linux命令的结合

wordcount案例

  1. 准备

    1
    2
    3
    4
    目录
    /usr/local/hadoop-2.9.2/share/hadoop/mapreduce
    文件
    hadoop-mapreduce-examples-2.9.2.jar
  2. 运行

    1
    2
    3
    hadoop jar hadoop-mapreduce-examples-2.9.2.jar wordcount(主类) /wordcount.txt(输入) /output(输出)
    http://192.168.100.103:8088/cluster/ 可看
    他的在204 我的未在04而在02 猜测随机
  3. 查看

    1
    2
    3
    可用以下命令查看
    hadoop fs -cat /output/part-r-00000
    他会出现统计的频率

写程序前

  1. windows的jdk配置
  2. windows配置hadoop
    • 更改env的JAVA_HOME
    • 添加HADOOP_HOME
    • 添加Path,%HADOOP_HOME%\bin 绝对路径相对路径随意
    • 验证 cmd hadoop

新命令

杀死进程 kill -9 进程号

day06

zookeeper 注:他此时hdfs和yarn是启动好的

  1. 解压

    1
    tar -zxvf 文件 -C 目录
  2. 改配置

    1
    2
    3
    4
    5
    6
    7
    8
    9
    创建data目录
    在data下创建文件myid,里面写1(id为1)
    在conf下
    拷贝文件 cp zoo_sample.cfg zoo.cfg
    修改dataDir为 /usr/local/zookeeper-3.4.13/data/
    添加 (id) (主机或ip)
    server.1=px02:2888:3888
    server.2=px03:2888:3888
    server.3=px04:2888:3888
  3. 分发

    1
    2
    3
    scp -r /usr/local/zookeeper-3.4.13/ px03:/usr/local/
    scp -r /usr/local/zookeeper-3.4.13/ px04:/usr/local/
    修改data下的myid
  4. 启动

    1
    2
    3
    4
    在bin目录下
    ./zkServer.sh start
    三台都要敲命令
    # 注:配置环境变量会简单点
  5. 查看状态

    1
    2
    3
    4
    ./zkServer.sh status
    出现Mode: follower、Mode: leader成功了
    进程为QuorumPeerMain
    注:他说(意为):zkp一般搭建奇数台,三台中正常第二台为leader

编程(windows)

  1. idea导包

    1
    2
    3
    4
    share\hadoop下的
    common和lib、hdfs和lib、mapreduce和lib、yarn和lib
    有多余的,但老师他说不管
    会出现jdiff,他说选不选无所谓,他没选
  2. 小技巧:idea里 .var可以方便声明变量

  3. 代码

    • mapper

      代码隐藏
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      /**
      * Copyright (C), 2015-2020, px有限公司
      * FileName: WordCounttMapper
      * Author: 15081
      * Date: 2020/7/6 15:51
      * Description:
      * History:
      * <author> <time> <version> <desc>
      * px 修改时间 版本号 描述
      */
      package cn.org.sibd;

      import org.apache.hadoop.io.IntWritable;
      import org.apache.hadoop.io.LongWritable;
      import org.apache.hadoop.io.Text;
      import org.apache.hadoop.mapreduce.Mapper;

      import java.io.IOException;

      /**
      * 〈一句话功能简述〉<br>
      * 〈〉
      *
      * @author 15081
      * @create 2020/7/6
      * @since 1.0.0
      */
      //其中Text涉及序列化和反序列化 相当于String
      public class WordCounttMapper extends Mapper<LongWritable, Text,Text, IntWritable> {
      Text kkey = new Text();
      IntWritable vvalue = new IntWritable(1);
      @Override
      protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
      //获取第一行
      String line = value.toString();
      //划分
      String[] words = line.split(" ");
      for (String word : words) {
      kkey.set(word);
      //输出
      context.write(kkey,vvalue);
      }

      }

      }
    • reducer

      代码隐藏
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      /**
      * Copyright (C), 2015-2020, px有限公司
      * FileName: WordCountReducer
      * Author: 15081
      * Date: 2020/7/6 15:53
      * Description:
      * History:
      * <author> <time> <version> <desc>
      * px 修改时间 版本号 描述
      */
      package cn.org.sibd;

      import org.apache.hadoop.io.IntWritable;
      import org.apache.hadoop.io.Text;
      import org.apache.hadoop.mapreduce.Reducer;

      import java.io.IOException;

      /**
      * 〈一句话功能简述〉<br>
      * 〈〉
      *
      * @author 15081
      * @create 2020/7/6
      * @since 1.0.0
      */
      /*
      hadoop 1
      hadoop 1
      java 1
      会默认排序
      */
      public class WordCountReducer extends Reducer<Text, IntWritable,Text,IntWritable> {
      IntWritable v = new IntWritable();
      @Override
      protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
      int sum = 0;
      for (IntWritable value : values) {
      sum+=value.get();
      }
      v.set(sum);
      context.write(key,v);
      }
      }
    • driver

      代码隐藏
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      47
      48
      49
      50
      51
      52
      53
      54
      55
      56
      /**
      * Copyright (C), 2015-2020, px有限公司
      * FileName: WordCountDriver
      * Author: 15081
      * Date: 2020/7/6 15:53
      * Description:
      * History:
      * <author> <time> <version> <desc>
      * px 修改时间 版本号 描述
      */
      package cn.org.sibd;

      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.lib.input.FileInputFormat;
      import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

      import java.io.IOException;

      /**
      * 〈一句话功能简述〉<br>
      * 〈〉
      *
      * @author 15081
      * @create 2020/7/6
      * @since 1.0.0
      */
      public class WordCountDriver {
      public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
      //连接
      Configuration conf = new Configuration();
      //job实例对象
      Job job = Job.getInstance(conf);
      //把类联系起来
      job.setJarByClass(WordCountDriver.class);
      job.setReducerClass(WordCountReducer.class);
      job.setMapperClass(WordCounttMapper.class);
      //map的输出类型
      job.setMapOutputKeyClass(Text.class);
      job.setMapOutputValueClass(IntWritable.class);
      //最终的输出类型 不要加reduce
      job.setOutputKeyClass(Text.class);
      job.setOutputValueClass(IntWritable.class);
      //输入路径
      //FileInputFormat.setInputPaths(job,new Path("D:\\IntelliJ IDEA 2020.1.1\\WorkSpace\\mapreduce-project\\input\\wordcount.txt"));
      FileInputFormat.setInputPaths(job,new Path("./input/wordcount.txt"));
      //输出路径 不用我们去创建,会报错
      FileOutputFormat.setOutputPath(job,new Path("./output"));
      //执行
      boolean resout = job.waitForCompletion(true);
      System.out.println(resout?1:0);
      }
      }
  4. 输入文本

    1
    2
    3
    4
    hadoop java
    java zookeeper
    hive hadoop
    hive java
  5. 每次运行要删除output文件夹 当然可用代码删除

    代码隐藏
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    File file = new File("./output");

    if (file.exists()) {
    new FileDelete("./output");
    }
    //自行拆分

    /**
    * Copyright (C), 2015-2020, px有限公司
    * FileName: FileDelete
    * Author: 15081
    * Date: 2020/7/6 19:08
    * Description:
    * History:
    * <author> <time> <version> <desc>
    * px 修改时间 版本号 描述
    */
    package cn.org.sibd;

    import java.io.File;

    /**
    * 〈一句话功能简述〉<br>
    * 〈〉
    *
    * @author 15081
    * @create 2020/7/6
    * @since 1.0.0
    */
    public class FileDelete {
    public FileDelete(String path) {
    this.deleteFileAndFolder(path);
    }

    public boolean deleteFileAndFolder(String path){
    File file = new File(path);
    if (!file.exists()) {
    return false;
    }
    if (file.isFile()) {
    return file.delete();
    }
    File[] files = file.listFiles();
    for (File f : files) {
    if(f.isFile()){
    if(!f.delete()){
    System.out.println(f.getAbsolutePath()+" delete error!");
    return false;
    }
    }else{
    if(!this.deleteFileAndFolder(f.getAbsolutePath())){
    return false;
    }
    }
    }
    return file.delete();
    }
    }

新知识

移动

1
mv [-fiv] source destination

day07+day08+day09+day10

day07 java基础

真的基础,所以没记,看看。

day08 假hive

  1. 数据仓库 比mysql东西多

  2. mysql

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    下载yum库
    wget http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm
    yum -y install 包
    我使用的方式是:
    yum -y install http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm
    安装数据库
    yum -y install mysql-community-server
    重启mysql
    systemctl restart mysqld
    查找密码
    grep "password" /var/log/mysqld.log
    登录
    mysql -uroot -p密码
    修改密码强度
    set global validate_password_policy=0;
    set global validate_password_policy=low;
    set global validate_password_length=6;
    修改密码
    alter user 'root'@'localhost' identified by '123456';
    重启mysql
    mysql简单练习

day09 要假不假hive

  1. 使得不只本地可以连接数据库

    1
    2
    update user set host='%' where user='root';
    至于刷新flush privileges;他没执行。
  2. 解压

    1
    2
    tar -zxvf apache-hive-2.3.7-bin.tar.gz -C  /usr/local/
    他说配不配都可以 配置环境变量 到bin目录 /etc/profile 记得生效一下
  3. 到conf目录下

    1
    2
    3
    4
    5
    cp hive-env.sh.template  hive-env.sh
    vim hive-env.sh
    HADOOP_HOME=/usr/local/hadoop-2.9.2
    export HIVE_CONF_DIR=/usr/local/apache-hive-2.3.7-bin/conf
    export HIVE_AUX_JARS_PATH=/usr/local/apache-hive-2.3.7-bin/lib
    hive-site.xml隐藏
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    创建hive-site.xml
    vim hive-site.xml
    <configuration>我度出来修改的
    <property>
    <name>javax.jdo.option.ConnectionURL</name>
    <value>jdbc:mysql://localhost:3306/hive?createDatabaseIfNotExist=true</value>
    <description>
    JDBC connect string for a JDBC metastore.
    </description>
    </property>

    <property>
    <name>javax.jdo.option.ConnectionDriverName</name>
    <value>com.mysql.jdbc.Driver</value>
    <description>Driver class name for a JDBC metastore</description>
    </property>

    <property>
    <name>javax.jdo.option.ConnectionUserName</name>
    <value>root</value>
    <description>Username to use against metastore database</description>
    </property>

    <property>
    <name>javax.jdo.option.ConnectionPassword</name>
    <value>123456</value>
    <description>password to use against metastore database</description>
    </property>
    </configuration>
  4. 1
    2
    3
    4
    5
     上传mysql-connector-java-5.1.48.jar到../lib目录下
    他说 2点多和1点多不一样 1点多可以直接起动了 2点多要初始化
    schematool -dbType mysql -initSchema 如果没配环境变量,用./也可以
    注:他机子变了,但我机子没变,我在px02(020304)上改动.而且我的hdfs、yarn、zookeeper没关,他报错了,而我没报错,但这不能算好消息。他把HIVE_AUX_JARS_PATH注了,而我没注。
    他说他删了一个库,创建不上了。他在ConnectionURL里加了 &amp;useSSL=false(我没加),为了不看警告。
  5. 启动

    1
    2
    3
    hive
    测试show databases;
    我打错了,打成 show databses;报了atatat的错。打对就好了

day10 hive 注:他不用101了而用102,但还是连的101,应该是克隆后没改192.168.1.1

杂一

他重新搭建了hive。没配HIVE_AUX_JARS_PATH&amp;useSSL=false改为了; useSSL=false(字体颜色有问题,有些字符看不清。)&amp;是字符&报错了。他说没先start-dfs.shshow databases;没出来,他说其他地方没有权限,其实开了(%)。他说防火墙没关。还是。他一直有RunJar的进程,而我没有。他hadoop的``hadoop.tmp.dir值是/usr/local/hadoop/hadoop-2.9.2/tmp`,不是他原先教我门设置的,虽感觉在那都可。重搭了。

杂二

我还是在hive-site.xml 添加上了&amp;useSSL=false,不想看SSl的警告。

Hive SQL语法总结 可在web页面看一些东西

多命令隐藏
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# 创建数据库 可加上 if not exists # 在HDFS上/user/hive/warehouse
create database test;
# 创建管理表or内部表
create table st(id int,name string)
row format delimited fields terminated by '\t';
# 创建外部表
create external table dept(deptno int,dname string,loc int)
row format delimited fields terminated by '\t';
# 导入数据 也可以自己建
load data local inpath '文件' into table 表名;
# 查询 应该可以举一反三
select * from 表;
# 查看表格式化数据 可看类型
desc formatted dept;
# 创建分区表 单的
create table dept_partition(dno int,dname string,loc string)
partitioned by(month string)
row format delimited fields terminated by '\t';
# 加载数据
load data local inpath '/opt/dept.txt' into table dept_partition partition(month='202006');
# 查询
select * from dept_partition;
select * from dept_partition where month=202006;
# 增加分区表 可以跟多个partition,空格隔开 感觉本质是文件夹
alter table dept_partition add partition(month='202004');
# 注:通过hadoop fs -mkdir创建、-put上传,查不到;通过alter增加分区表、-put上传可以查到
# 删除
add换drop,多个partition用逗号隔开
# 创建多分区
by(month string,day string) 举一反三

day11+day12+day13

day11 续hive

多命令隐藏
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# 重命名表
alter table st rename to st01;
# 增加、修改、替换列信息
# 增加、替换
alter table st01 add|replace columns(age int);
# 更新
alter table st01 change age sex string;
# 删除表
drop table 表名;
# 通过查询语句插入数据
# 创建表
create table st(
> id int,name string)
> partitioned by(month string)
> row format delimited fields terminated by '\t';
# 插入基本的数据
insert into table st partition(month='202006')values(3,'zs'),(2,'ww');
# 查询单张表插入
insert overwrite table st partition(month='202007')
> select id,name from st;
# 查询语句中创建表并加入数据
create table st03
> as select id,name from st;
# 创建表时指定加载数据的路径
# 创建表,指定在HDFS的位置
create table st04(
> id int,name string)
> row format delimited fields terminated by '\t'
> location '/user/hive/warehouse/test.db/st04';
# 加载数据
load data local inpath '/opt/st.txt' into table st04;
# 注他未使用dfs -put /opt/st.txt /user/hive/warehouse/test.db/st05;
# insert导出 导出目录,目录里有文件 去掉local可导到HDFS
# 未格式化
insert overwrite local directory '/opt/st' select * from st05;
# 格式化
insert overwrite local directory '/opt/st' row format delimited fields terminated by '\t' select * from st05;
# 还有hadoop命令、Hive Shell命令等 感觉写脚本有用
hive -e 'select * from default.student;' > student4.txt;
# 查询类同mysql
group by
join 等值:join|inner join交集,left join左连接同右,右没左没,full join全连接,左右没,他说mysql不支持全连接,但我听说有方式

他使用的文档可在网络上找到 关键词:尚硅谷 [文档关键词,例如:hive]

day12 续hive

另一种启动hive

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
不管那种方式都要start-dfs.sh
修改core-site.xml
<!-- 如果不配置下列信息 hive的jdbc连接会报:User: root is not allowed to impersonate root -->
<!-- hadoop.proxyuser.root.hosts root 可以换成别的用户 -->
<property>
<name>hadoop.proxyuser.root.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.root.groups</name>
<value>*</value>
</property>
第一个窗口 hiveserver2
第二个窗口 beeline -u jdbc:hive2://localhost:10000 -n root
他说容易掉。
显示结果像mysql。第一个窗口会显示命令结果

集合数据类型

1
2
3
4
集合数据类型 struct、map、array 
array在创建表时要加上collection items terminated by ':'; 索引获取,包含:array_contains(列名,变量),大小用size(列名)
map在建表时要map<类型,类型>和map keys terminated by '#';获取:列名[key],取key:map_keys(列名),取value:map_values(列名)
struct建表要写struct<列名:类型,……>他加上了collection items terminated by ':';像map,用点获取

day13 python 豆瓣有反扒,注意

代码隐藏
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#! /usr/bin/env python  
#! -*- coding:utf-8 -*-  
#====#====#====#====  
#!@Author : px
#!@time : 2020/7/12 10:37
#!@File : 爬虫.py
#!License : (C)Copyright 2017-2018, Liugroup-NLPR-CASIA
#====#====#====#====
"""
┏┓ ┏┓
┏┛┻━━━━━━┛┻┓
┃ ┃
┃ ┳┛ ┗┳ ┃
┃ ┻ ┃
┗━┓ ┏━┛
┃ ┗━━━┓
┃ 神兽保佑 ┣┓
┃ 永无BUG!┏┛
┗┓┓┏━━━━┳┓┏┛
┃┫┫ ┃┫┫
┗┻┛ ┗┻┛
"""
#
import time
import requests
from lxml import etree
import csv
PRE_BOOK_PAGE_COUNT=20
def get_content(page):
url= 'https://book.douban.com/tag/%E5%90%8D%E8%91%97?start={}&type=T'.format((page-1)*PRE_BOOK_PAGE_COUNT)
headers={
'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
'Accept-Language':'zh-CN,zh;q=0.9',
'Cache-Control':'max-age=0',
'Connection':'keep-alive',
'Cookie':'自行查找',
'Host':'book.douban.com',
'Referer':'https',
'Sec-Fetch-Dest':'document',
'Sec-Fetch-Mode':'navigate',
'Sec-Fetch-Site':'same-origin',
'Sec-Fetch-User':'?1',
'Upgrade-Insecure-Requests':'1',
'User-Agent':'Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/83.0.4103.116Safari/537.36'
}
context=requests.get(url=url,headers=headers).text
#print(context)
return context


def get_date(context):
html=etree.HTML(context)
li_list=html.xpath('//*[@id="subject_list"]/ul/li')
#print(li_list)
book_list=[]
for li in li_list:
title=li.xpath('div[2]/h2/a/@title')[0]
#print(title)
#message="".join((li.xpath('div[2]/div[1]/text()')[0]).split())
message = (li.xpath('div[2]/div[1]/text()')[0]).replace('\n \n \n ','').replace('\n\n ','')
#print(message)
summary=li.xpath('div[2]/p/text()')
summary=summary[0] if summary!=[] else None
#print(summary)
score=li.xpath('div[2]/div[2]/span[2]/text()')
score=score[0] if score!=[] else None
#print(score)
with open('douban.csv', 'a', encoding='utf-8-sig', newline='') as f:
writer = csv.writer(f)
writer.writerow([title, message, summary, score])
with open('douban.csv','w',encoding='utf-8-sig',newline='') as f:
writer=csv.writer(f)
writer.writerow(['书名','信息','简介','评分'])
for page in range(1,63):
context=get_content(page)
get_date(context)
print(page)
time.sleep(3)


if __name__ == '__main__':
pass

day14 按照手册搭建+day15 又简单爬一边

day14

  1. 由于我们是本地克隆,需要修改ip。

    vim /etc/sysconfig/network-scripts/ifcfg-ens33

    1
    2
    3
    4
    5
    6
    dhcp改static
    IPADDR=192.168.100.200
    NETMASK=255.255.255.0
    GATEWAY=192.168.222.2
    DNS1=223.5.5.5
    DNS2=223.6.6.6

    最后要重启网络service network restart

    注:xshell的隧道钩去掉。VT模式里初始化数字键盘选设置为普通,可使用小键盘。

  2. 每台修改主机名。记忆hostname clt

    hostnamectl set-hostname master

    bash 生效一下

    未使用文档里的改文件的的方法

  3. 关闭防火墙。同理记忆。从windows的mysqld推测,服务的结尾都加了d

    systemctl stop firewalld

    对于开机重启,比赛 不需要 systemctl disable firewalld

  4. 映射

    1
    2
    3
    192.168.100.200 master
    192.168.100.201 slave1
    192.168.100.202 slave2

    他是每台写,我使用的分发。此时没配ssh ,要输密码等

    1
    scp -r /etc/hosts slave1:/etc/

    最后ping一下

  5. 时间同步

    1
    2
    3
    date 查看时间
    tzselect 选择时间,记忆梯子选择
    由于时间一样,暂时不管

    注:tzselect并不会改成功,需要执行它显示的TZ='Asia/Shanghai'; export TZ命令。使用后成功把EDT改成了CST,但还是感觉有问题,因为我用了timedatectl statusLinux —— 时间(tzselect、timedatactl命令,查看和修改时区,修改时区为东八区)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    每台下载ntp
    yum install -y ntp
    再master修改/etc/ntp.conf
    server 127.127.1.0
    fudge 127.127.1.0 stratum 10
    重启服务
    systemctl restart ntpd.service
    测试 我是在修改文件少的机子上用date -s 00:00,然后过了几分钟用(对当然也可以等)ntpdate master同步
    当然最好同步一下
  6. 配ssh

    1
    2
    3
    ssh-keygen -t rsa
    ssh-copy-id 地址
    他没有用手册里的dsa
  7. 由于要好几次修改/etc/profile,所以预先修改了。java

    1
    2
    3
    4
    5
    6
    7
    8
    9
    export JAVA_HOME=/usr/local/jdk1.8.0_251
    export HADOOP_HOME=/usr/local/hadoop-2.9.2
    export HIVE_HOME=/usr/local/apache-hive-2.3.7-bin
    export ZOOKEEPER_HOME=/usr/local/zookeeper-3.4.13
    export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$HIVE_HOME/bin:$ZOOKEEPER_HOME/bin
    所以上传相应文件并解压
    记得source生效
    我还分发里一下/etc/profile和java,和生效。
    记不住分发的命令可以用xftp
  8. zookeeper

    太多隐藏
    1
    2
    拷贝zookeeper-3.4.13/conf/zoo_sample.cfg
    cp zoo_sample.cfg zoo.cfg
    1
    2
    3
    4
    5
    创建文件夹
    /usr/local/zookeeper-3.4.13/data
    创建myid
    vim /usr/local/zookeeper-3.4.13/data/myid
    写1 修改23
    1
    2
    3
    4
    5
    6
    7
    配置zoo.cfg 
    修改dataDir=/usr/local/zookeeper-3.4.13/data
    他未添加dataLogDir
    添加,不知能否从0开始
    server.1=master:2888:3888
    server.2=slave1:2888:3888
    server.3=slave2:2888:3888
    1
    2
    3
    分发/usr/local/zookeeper-3.4.13/
    scp -r /usr/local/zookeeper-3.4.13/ 主机名:/usr/local/
    修改每台myid
    1
    2
    3
    4
    5
    配置环境变量,此处可以在上面提前写
    export ZOOKEEPER_HOME=/usr/local/zookeeper-3.4.13
    path后面加上:$ZOOKEEPER_HOME/bin
    分发记得生效
    他说每分发一个都要生效一下
    1
    2
    3
    4
    启动zkServer.sh start
    状态zkServer.sh status
    注意要都启动再看状态,否则会看到Connection refused (Connection refused) 误以为配错了
    启动顺序 master slave1 slave2 ,slave1会是leader
  9. hadoop

    太多隐藏
    1
    2
    解压配环境变量已经在上面做了
    他说lib没有必要,从来也没用
    1
    2
    配置/usr/local/hadoop-2.9.2/etc/hadoop/hadoop-env.sh
    修改export JAVA_HOME=/usr/local/jdk1.8.0_251
    core-site.xml隐藏
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    配置core-site.xml
    添加
    <property>
    <name>fs.default.name</name>
    <value>hdfs://master:9000</value>
    </property>
    <property>
    <name>hadoop.tmp.dir</name>
    <value>/usr/local/hadoop-2.9.2/hdfs/tmp</value>
    <--!他们直接在tmp下,没有hdfs-->
    </property>
    <property>
    <name>io.file.buffer.size</name>
    <value>131072</value>
    </property>
    <property>
    <name>fs.checkpoint.period</name>
    <value>60</value>
    </property>
    <property>
    <name>fs.checkpoint.size</name>
    <value>67108864</value>
    </property>
    hdfs-site.xml隐藏
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    配置hdfs-site.xml
    添加
    <property>
    <name>dfs.replication</name>
    <value>3</value>
    </property>
    <property>
    <name>dfs.namenode.name.dir</name>
    <value>file:/usr/local/hadoop-2.9.2/hdfs/name</value>
    <final>true</final>
    </property>
    <property>
    <name>dfs.datanode.data.dir</name>
    <value>file:/usr/local/hadoop-2.9.2/hdfs/data</value>
    <final>true</final>
    </property>
    <property>
    <name>dfs.namenode.secondary.http-address</name>
    <value>master:9001</value>
    </property>
    <property>
    <name>dfs.webhdfs.enabled</name>
    <value>true</value>
    </property>
    <property>
    <name>dfs.permissions</name>
    <value>false</value>
    </property>
    1
    2
    3
    4
    5
    编写slaves
    slave1
    slave2
    编写master,他不建议这样写
    master

    1
    2
    3
    他配了yarn-env.sh
    改了export JAVA_HOME=/usr/local/jdk1.8.0_251/
    都可以
    yarn-site.xml隐藏
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    配置yarn-site.xml
    <property>
    <name>yarn.resourcemanager.address</name>
    <value>master:18040</value>
    </property>
    <property>
    <name>yarn.resourcemanager.scheduler.address</name>
    <value>master:18030</value>
    </property>
    <property>
    <name>yarn.resourcemanager.webapp.address</name>
    <value>master:18088</value>
    </property>
    <property>
    <name>yarn.resourcemanager.resource-tracker.address</name>
    <value>master:18025</value>
    </property>
    <property>
    <name>yarn.resourcemanager.admin.address</name>
    <value>master:18141</value>
    </property>
    <property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
    </property>
    <property>
    <name>yarn.nodemanager.auxservices.mapreduce.shuffle.class</name>
    <value>org.apache.hadoop.mapred.ShuffleHandler</value> </property>
    1
    2
    3
    4
    5
    配置mapred-site.xml
    <property>
    <name>mapreduce.framework.name</name>
    <value>yarn</value>
    </property>
    1
    2
    3
    分发,我觉得可以都解压了,然后就只须分发hadoop目录了
    scp -r
    与此同时可以去搭hive
    1
    2
    3
    4
    5
    6
    启动
    master格式化 hadoop namenode -format
    start-all.sh
    查看
    master:50070
    master:18088
  10. hive

    太多隐藏
    隐藏slave2
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    slave2安装mysql server
    他先下了wget,用wget下载源安装包
    我觉得这样也可以yum -y install http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm
    yum -y install mysql-community-server
    systemctl start mysqld
    systemctl enable mysqld
    grep "password" /var/log/mysqld.log
    进入maysql
    set global validate_password_policy=0;
    set global validate_password_length=6;
    alter user 'root'@'localhost' identified by '123456';
    可以退出重进一下
    # 下面两个用其中一个,我第二个一直让我输入
    # update user set host='%' where user='root';
    # grant all privileges on *. * to 'root'@'% with grant option;
    flush privileges;

    上传connection包到slave1:/usr/local/apache-hive-2.3.7-bin/lib,比赛时应该会在某个地方,文档说/lib下
    1
    master作为client,slave1作为 hive server
    隐藏slave1
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    在slave1下conf
    cp hive-env.sh.template hive-env.sh
    vim hive-env.sh
    修改HADOOP_HOME=/usr/local/hadoop-2.9.2
    创建vim hive-site.xml
    <configuration>
    <property>
    <name>hive.metastore.warehouse.dir</name>
    <value>/user/hive_remote/warehouse</value>
    </property>
    <property>
    <name>javax.jdo.option.ConnectionURL</name>
    <value>jdbc:mysql://slave2:3306/hive?createDatabaseIfNotExist=true&amp;useSSL=false&amp;characterEncoding=UTF-8</value>
    <!--文档里没使用,但官方视频使用了&amp;useSSL=false又加上&amp;characterEncoding=UTF-8-->
    </property>
    <property>
    <name>javax.jdo.option.ConnectionDriverName</name>
    <value>com.mysql.jdbc.Driver</value>
    </property>
    <property>
    <name>javax.jdo.option.ConnectionUserName</name>
    <value>root</value>
    </property>
    <property>
    <name>javax.jdo.option.ConnectionPassword</name>
    <value>123456</value>
    </property>
    <property>
    <name>hive.metastore.schema.verification</name>
    <value>false</value>
    </property>
    <property>
    <name>datanucleus.schema.autoCreateAll</name>
    <value>true</value>
    </property>
    </configuration>
    隐藏master
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    在master下
    cp /usr/local/apache-hive-2.3.7-bin/lib/jline-2.12.jar /usr/local/hadoop-2.9.2/share/hadoop/yarn/lib/
    修改hive-env.sh,我情愿slave发过来
    HADOOP_HOME=/usr/local/hadoop-2.9.2
    修改hive-site.xml
    <configuration>
    <property>
    <name>hive.metastore.warehouse.dir</name>
    <value>/user/hive_remote/warehouse</value>
    </property>
    <property>
    <name>hive.metastore.local</name>
    <value>false</value>
    </property>
    <property>
    <name>hive.metastore.uris</name>
    <value>thrift://slave1:9083</value>
    </property>
    </configuration>
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    启动
    slave1下
    hive --service metastore
    master下
    hive
    测试show databases;
    # 报Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient
    有可能<name>hive.metastore.uris</name>值写错了
    # 报 Could not create ServerSocket on address 0.0.0.0/0.0.0.0:9083.
    可尝试把runjar杀掉

day 15 爬

  1. string(div/div[3]/a/em)可以获取下面的所以文字。
  2. time.time()时间戳
  3. 字典形的str,可用json.loads(str)转成字典