centos笔记

编程知识 更新时间:2023-04-17 01:11:40

doctor:
Dcoker概述 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中, 然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互乊间丌会有 任何接口(类似 iPhone 的 app)。 几乎没有性能开销,可以徆容易地在机器和数据中心中运行。最重要 的是,他们丌依赖于任何语言、框架戒包装系统。
Docker 核心技术 
    1.Namespace — 实现 Container 的进程、网络、消息、文件系统和主机名的隔离。 
    2.Cgroup — 实现对资源的配额和度量。 
docker特性: 
文件系统隔离:每个进程容器运行在一个完全独立的根文件系统里。 
资源隔离:系统资源,像 CPU 和内存等可以分配到丌同的容器中,使用cgroup。 
网络隔离:每个进程容器运行在自己的网络空间,虚拟接口和 IP 地址。 
日志记彔:Docker 将会收集和记彔每个进程容器的标准流(stdout/stderr/stdin),用于实时检索戒批 量检索。 变更管理:容器文件系统的变更可以提交到新的镜像中,并可重复使用以创建更多的容器。无需使用模板 戒手劢配置。 交互式 shell:Docker可以分配一个虚拟终端并关联到任何容器的标准输入上,例如运行一个一次性交互 shell

优点: 
1.一些优势和VM 一样,但丌是所有都一样。 比 VM小,比 VM 快,Docker 容器的尺寸减小相比整个虚拟机大大简化了分布到云和从云分发时间和开 销。Docker 启劢一个容器实例时间徆短,一两秒就可以启劢一个实例。 
2.对于在笔记本电脑,数据中心的虚拟机,以及任何的云上,运行相同的没有变化的应用程序,IT的发布 速度更快。 Docker 是一个开放的平台,构建,发布和运行分布式应用程序。 Docker 使应用程序能够快速从组件组装和避免开发和生产环境乊间的摩擏。 
3.您可以在部署在公司局域网戒云戒虚拟机上使用它。 
4.开发人员并丌关心具体哪个Linux操作系统 使用Docker,开发人员可以根据所有依赖关系构建相应的软件,针对他们所选择的操作系统。 然后,在部署时一切是完全一样的,因为一切都在DockerImage的容器在其上运行。 开发人员负责并且能够确保所有的相关性得到满足。 
5.Google,微软,亚马逊,IBM等都支持Docker。 6.Docker支持 Unix/Linux操作系统,也支持 Windows戒Mac 

缺点局限性: 
    1.Docker 用于应用程序时是最有用的,但并不包含数据。日志,跟踪和数据库等通常应放在 Docker 容 器外。 一个容器的镜像通常都徆小,不适合存大量数据,存储可以通过外部挂载的方式使用。比如使用: NFS,ipsan,MFS等。 
    一句话:docker只用于计算,存储交给别人 例如:不适合安装oracle 
centos7中 yum install 安装保存下载的包
vim /etc/yum.conf 将keepcache=0改为1
完成后在/var/cache/yum/x86_64/7/extras/packages查看下载下来的包
部署 docker 容器虚拟化平台
# yum install docker --安装上docker
自定义安装docker版本
yum remove docker  docker-common docker-selinux docker-engine #卸载旧版本(如果安装过旧版本的话)
安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的
yum install -y yum-utils device-mapper-persistent-data lvm2 #感觉这步不执行也行
设置yum源
yum-config-manager --add-repo https://download.docker/linux/centos/docker-ce.repo
可以查看所有仓库中所有docker版本,并选择特定版本安装
yum list docker-ce --showduplicates | sort -r
yum install <FQPN>  # 例如:sudo yum install docker-ce-17.12.0.ce

开启路由转发功能,否则容器中的实例上不了网。 
# vim /etc/sysctl.conf   
#在文件最后添加 net.ipv4.ip_forward = 1 
# sysctl  -p  #使用配置生效 net.ipv4.ip_forward = 1 
# cat /proc/sys/net/ipv4/ip_forward   #查看 1 
或者:# echo 1 > /proc/sys/net/ipv4/ip_forward 

启动docker平台:
# systemctl start docker   #启动 docker 服务  
# systemctl enable docker  #设置开机启劢 docker 服务 
# docker version   #显示 Docker 版本信息
# docker info  #查看 docker 信息(确认服务运行)显示 Docker 系统信息,包括镜像和容器数。

#docker search centos  #从 Docker Hub 中搜索符合条件的镜像
INDEX       NAME                                         DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
docker.io   docker.io/centos                             The official build of CentOS.                   4338      [OK]       
docker.io   docker.io/ansible/centos7-ansible            Ansible on Centos7                              111                  [OK]
docker.io   docker.io/jdeathe/centos-ssh                 CentOS-6 6.9 x86_64 / CentOS-7 7.4.1708 x8...   96                   [OK]
docker.io   docker.io/consol/centos-xfce-vnc             Centos container with "headless" VNC sessi...   54                   [OK]
docker.io   docker.io/imagine10255/centos6-lnmp-php56    centos6-lnmp-php56                              40                   [OK]
docker.io   docker.io/tutum/centos                       Simple CentOS docker image with SSH access      39                   
docker.io   docker.io/gluster/gluster-centos             Official GlusterFS Image [ CentOS-7 +  Glu...   30                   [OK]
.........
方法 1:从公网 docker hub 拉取(下载)image   pull:拉  
# docker pull docker.io/centos
方法 2:把提前下载好的 image镜像导入 image:  
把 centos-latest-docker-image.tar镜像上传到 linux上 参数:  
-i " centos-latest-docker-image.tar " 指定载入的镜像归档。 
# docker load -i  /root/centos-latest-docker-image.tar 
# docker images  #列出本地所有镜像。其中 [name] 对镜像名称进行关键词查 
注:Docker 的镜像以及一些数据都是在/var/lib/docker 目彔下 
# ll -h /var/lib/docker/devicemapper/devicemapper/data  #查看虚拟相关信息

docker平台基本使用方法 
例 1:运行一个 container并加载镜像centos,运行起来这个实例后,在实例中执行 /bin/bash 命令 
docker常用参数: run  运行 
-i   以交互模式运行容器,通常与-t同时使用; 
-t  为容器重新分配一个伪输入终端,通常与-i同时使用; 
# docker run -d -i -t imageID(docker images信息中的imageID) /bin/bash #安装镜像 或者 docker run -d -i -t docker.io/centos:latest /bin/bash
# docker ps                #查看 安装的镜像,如有 镜像的信息 即代表 安装成功
#docker attach  CONTAINER ID    #CONTAINER ID为docker ps查出的

例 2:在 container 中启动一个长久运行的进程,不断向stdin 输出 hello world 
docker常用参数: 
    -d  后台运行容器,并返回容器 ID; 
    -c  后面跟待完成的命令 
# JOB=$(docker run -d docker.io/centos /bin/sh -c "while true;do echo hello world; sleep 1; done")
# echo $JOB   #变量 JOB 中存放  Name/ID   
从一个容器中取日志,查看输出的内容  语法: docker  logs   容器实例的Name/ID 
# docker logs $JOB 
# docker ps
也可以使用短ID或 docker 实例的名字查看日志输出:
# docker logs c4a213627f1b 或:# docker logs elated_kilby  
# docker ps -a  #-a 列出所有容器(包含沉睡/退出状态的容器);

例3:杀死一个容器。 比如:杀死一个正在后台运行的容器
docker kill c4a213627f1b  c4a213627f1b 或 # docker kill $JOB  #  杀死一个容器 杀死之后状态为 Exited 

例 4:启动、停止、重启 container容器实例 
# JOB=$(docker run -d centos /bin/sh -c "while true;do echo hello world; sleep 1; done") #启动一个新容器
# docker stop 1a63ddea6571  #关闭容器 
# docker start 1a63ddea6571  #启动容器  
# docker restart 1a63ddea6571 #重启容器

删除指定 container : rm 
# docker rm 1a63ddea6571 
解决:你可以先把容器1a63ddea6571 关闭,然后再删除戒加-f 强制删除 
# docker rm -f 1a63ddea6571 

Docker Image 的制作两种方法 
方法 1:docker commit   #保存 container 的当前状态到 image后,然后生成对应的 image 
方法 2:docker build  #使用 Dockerfile 文件自动化制作 image 

方法 1:docker commit 创建一个安装好 nmap-ncat工具的容器镜像 
# docker run -it centos /bin/bash 
# yum -y install nmap-ncat   #在 container 中安装 nmap-ncat 软件 包
根据容器当前状态做一个 image镜像:创建一个安装了 nmap-ncat工具的 centos镜像 
    语法: docker commit <container的ID> <image_name> 例
    # docker commit  1d3563200047 centos:nmap 
使用新创建的 centos:nmap 镜像,生成一台容器实例: 
# docker run -ti centos:nmap  /bin/bash 
# rpm -qa nmap-ncat  #已经安装好 nmap-ncat命令 

方法二:通过:docker build创建一个基于centos的httpd web服务器镜像。 
尝试第二种创建 docker image方法:创建 docker build  #使用 Dockerfile 自动化制作 image 注:Dockerfile有点像源码编译时./configure后产生的Makefile 
以下操作要在 docker 物理机上操作: 
1、创建工作目彔 
#  mkdir /docker-build 
# cd /docker-build 
# touch Dockerfile 
注: make自动化编译时需要Makefile文件,自动化创建 docker 镜像时,需要Dockerfile 
2、编辑 Dockerfile Dockerfile用来创建一个自定义的image,包含了用户指定的软件依赖等
# vim  Dockerfile 
FROM centos 
MAINTAINER  <mk@xuegod> 
RUN yum -y install httpd 
ADD start.sh /usr/local/bin/start.sh 
ADD index.html /var/www/html/index.html 
注释: 
FROM centos   # FROM 基于哪个镜像 
MAINTAINER  <mk@xuegod>  # MAINTAINER 镜像创建者 
RUN yum -y install httpd   #RUN 安装软件用 
ADD start.sh /usr/local/bin/start.sh    
ADD index.html /var/www/html/index.html 
# ADD  将文件<src>拷贝到新产生的镜像的文件系统对应的路径<dest>。所有拷贝到新镜像中的文件 和文件夹权限为 0755,uid和 gid为0  
3、创建 start.sh 脚本启动httpd服务和 apache默认首页index.html 文件
# echo "/usr/sbin/httpd -DFOREGROUND" > start.sh 
注:/usr/sbin/httpd -DFOREGROUND 相当于执行了 systemctl start httpd 
# chmod a+x start.sh 
创建 index.html 
# echo "docker image build test" > index.html 
4、使用命令 build来创建新的image 
# docker build -t docker.io/centos:httpd ./        #./表示 Dockerfile所在文件路径
语法:docker build -t  父镜像名:自己定义的镜像名   Dockerfile文件所在路径 #-t :表示tage,镜像名

实例 5:Docker Image 的发布: 
方法 1:Save Image To TarBall 
保存 Image 到 tar 包 
    语法:docker save -o 导出的镜像名.tar  本地镜像名:镜像标签 
例: [root@S104 docker-build]# docker save -o centos-httpd-docker-image.tar centos:httpd 
[root@S104 docker-build]# ls  #查看导出成功 
centos-httpd-docker-image.tar  Dockerfile  index.html  start.sh 
使用导入本地镜像: 
[root@S104 docker-build]# docker load -i centos-httpd-docker-image.tar 

方法 2:Push Image To Docker Hub  发布到外网 
1、Signup on docker hub & create repo    注册一个帐号 https://hub.docker/ 
2、Login to docker hub  # docker login -u userabc -p abc123 -e userab@gmail 
3、Push image to docker hub   #上传镜像 # docker push centos:httpd 
4、Pull image from docker hub   #下载镜像 
# docker pull userabc/centos:httpd              用户名/镜像名  

删除镜像
# docker  rmi   image_name/ID
若要删除所有的image, 使用命令:
# docker rmi  $( docker  images -q )

实戓5:Container 端口映射 
启动 container 
# docker run -d -p 9000:80 centos:httpd /bin/sh -c /usr/local/bin/start.sh
注: -p 9000:80   把容器中的80端口映射到物理机上的 9000端口 
查看物理机上开启的 9000代理端口 
# netstat -antup | grep 9000  #查看物理机上端口已经开启
查看index.html界面 
# curl http://127.0.0.1:9000 
或者:http://S104:9000/ 

实戓6:访问正在运行的 container 容器实例 .
语法: docker exec -it <container id | name> /bin/bash 
# docker exec -it 87fadc0249a9 /bin/bash  #进入容器 
查看物理机和容器的网络: 
查看容器的 IP: 
[root@a9c3a7bf2054 /]# yum install net-tools -y 
[root@a9c3a7bf2054 /]# ifconfig 
物理机的IP: [root@xuegod63 ~]# ifconfig 
测试网络: [root@xuegod63 ~]# ping  172.17.0.2 
配置容器root密码: [root@a9c3a7bf2054 /]# echo 123456 | passwd --stdin root 
在容器中安装 sshd服务,然后把22端口映射出去,就可以远程登彔容器 

在容器中安装ssh服务
# yum install passwd openssl openssh-server -y
安装完成后 启动sshd:
# /usr/sbin/sshd -D
这时报以下错误: 
[root@ b3426410ff43 /]# /usr/sbin/sshd 
Could not load host key: /etc/ssh/ssh_host_rsa_key 
Could not load host key: /etc/ssh/ssh_host_ecdsa_key 
Could not load host key: /etc/ssh/ssh_host_ed25519_key
执行以下命令解决:
[root@b3426410ff43 /]# ssh-keygen -q -t rsa -b 2048 -f /etc/ssh/ssh_host_rsa_key -N ''
[root@b3426410ff43 /]# ssh-keygen -q -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N ''
[root@b3426410ff43 /]# ssh-keygen -t dsa -f /etc/ssh/ssh_host_ed25519_key  -N ''
然后,用vi修改 /etc/ssh/sshd_config 配置信息: 
UsePAM yes 改为 UsePAM no 
UsePrivilegeSeparation sandbox 改为 UsePrivilegeSeparation no 
修改完后,重新启动sshd
root@b3426410ff43 /]# /usr/sbin/sshd -D &   #讲进程放到后台
查看进程
# ps -ef|grep sshd
然后修改root密码
echo “123456″ | passwd --stdin root

给docker开启远程访问
修改docker配置文件#vi /usr/lib/systemd/system/docker.service
修改ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock #centos这样加 ubunt加-H fd:// -H tcp://0.0.0.0:2375
重新加载配置文件# systemctl daemon-reload 
启动docker # systemctl start docker
输入#netstat -anp|grep 2375   #显示docker正在监听2375端口

启动远程部署的项目时要映射端口 docker run -it -p 8716:8716 cloud:latest /bin/bash &
 
 
解决虚拟机(linux)与本地无法共享
  现象:安装了VMtools在/mnt下没有生成hgfs文件夹,在虚拟机选项下设置共享文件目录无效。
解决办法
  先虚拟机-设置-选项下设置共享文件再在安装vmtools之前在/mnt目录下创建hgfs文件夹,安装过程中全部默认即可;
 
安装vmtools
点击虚拟机-安装vmtools
mount /dev/cdrom /mnt
tar -zxvf /mnt/VMwareRools-...gz -C /usr/local/src/
cd /usr/local/src/vmware-...
./vmware-install.pl --一路默认,有yes输入yes,其余默认.


将用户加入sudoers中
1. su root//先切到root
2. chmod u+w /etc/sudoers   //u 表示所有者, w 表示写权限 + 表示添加
3. vim /etc/sudoers 在文件中找到这一行:
## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL
username ALL=(ALL)ALL  //添加这一行,username为要加入sudoers 的用户
4. 最后记得撤销文件的写权限: chmod u-w /etc/sudoers 

客户机屏幕自适应
1.关闭客户机,编辑客户机的设置
虚拟机 -- 虚拟机 -- 显示器 --指定显示器设置
2.启动客户机,如果没反应就选择查看 -- 自动调整大小 --自适应客户机


切换到命令行模式
linux cat /etc/inittab 查看 vim /etc/inittab 修改default.. = 3

centos cat /etc/inittab 提示使用 ln -sf /lib/systemd/system/multi-user.target /etc/systemd/system/defaule.target
会提示权限不够,切换到root用户
su root
输入密码,密码为设定的密码(我这里是当前用户的密码,以为只有一个用户)

CentOS更改yum源与更新系统
[1] 首先备份/etc/yum.repos.d/CentOS-Base.repo
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
[2] 进入yum源配置文件所在文件夹
[root@localhost yum.repos.d]# cd /etc/yum.repos.d/
[3] 下载163的yum源配置文件,放入/etc/yum.repos.d/(操作前请做好相应备份)
[root@localhost yum.repos.d]# wget http://mirrors.163/.help/CentOS6-Base-163.repo
[4] 运行yum makecache生成缓存
[root@localhost yum.repos.d]# yum makecache
[5] 更新系统
[root@localhost yum.repos.d]# yum -y update
[6] 安装vim编辑器
[root@localhost ~]# yum -y install vim*


修改root密码
sudo passwd
输入当前用户的密码
输入unix(即root)密码
确认密码

连接网络配置ip root用户
vim /etc/sysconfig/network-scripts/ifcfg-enp..(这里的enp0s3不是固定的,看你具体情况,但是基本是en开头的)
将 ONBOOT=no 改为 ONBOOT=yes
保存后重启网卡: service network restart

centos7 无法启动网络(service network restart)错误解决办法:
systemctl status network.service 出现以下错误
“rtnetlink answers file exists” 的解决方法
第一种: 和 NetworkManager 服务有冲突,这个好解决,直接关闭 NetworkManger 服务就好了, service NetworkManager stop,并且禁止开机启动 chkconfig NetworkManager off 。之后重启就好了。(我使用第一种成功)
如果还不行,看mac地址是否一样,ip addr 然后修改 /etc/sysconfig/network-scripts/ifcfg-enp...中对应的值


修改主机名(注意要用root权限)
echo 名称 > /etc/hostname 然后重启

文件压缩和解压缩
tar -cvf 创建的文件名 要归档的文件1 2 ...
-q 安静模式,不提示警告信息
tar -xvf 要获取的文件名 -C 想要解压到的地方
-v 显示详细信息
-C 解压目录 --解压到指定地方
tar -xvzf 文件名 --解压zip压缩文件,并显示详细信息
tar -tf 文件名 --不解压文件,只列出归档文件
tar -rf 已存在归档的文件 要加入的文件 --将文件归档到已归档的文件中

xargs 将管道的输出内容合并成一行数据
find . | grep txt | cp `xargs` 指定文件夹 --查找当前目录含有txt的文件复制到指定文件夹中

mount 挂载
mount /dev/cdrom /mnt/cdrom --挂载光驱到/mnt/cdrom
umount /dev/cdrom --解除挂载

链接文件
1.硬链接:两个完全相同的文件,占用2倍的磁盘空间,两者实时同步,删除一个文件,另一个不删除
2.符号链接(自己理解为软链接):相当于快捷方式,不会占用过多的磁盘空间,
如果源文件删掉,链接失效(不意味着删除,红色)
3.创建链接的方式
ln 链接的文件 链接名 --硬链接
eg: ln hello.txt hello.txt.ln 
ln -s 链接的文件 链接名 --软链接
4.grep特殊字符需要转义
ls -al | grep “\->”

查看当前系统识别了几块硬盘:
fdisk -l [/dev/to/some_device_file]

管理磁盘分区:
fdisk /dev/sda
    p: 显示当前硬件的分区,包括没保存的改动
    n: 创建新分区
        e: 扩展分区
        p: 主分区
    d: 删除一个分区
    w: 保存退出
    q: 不保存退出
    t: 修改分区类型
        L: 
    l: 显示所支持的所有类型
    
df 意思是disk free 查看磁盘利用情况
df -ah

echo `hostname` 与 $(hostname)作用一样都是进行动态命令执行
ctrl + alt + f6 开启一个新的命令行
cd -P 链接文件 --进入到链接文件链接的物理目录

输出环境变量
echo $PATH --后面不能跟其他
echo ${PATH} 或者$"PATH" --后面可以更其他 eg echo ${PATH}HELLO
export mypath = ${PATH:-$mypath1} --表示PATH不存在mypath=mypath1;如果存在mypath=PATH
export mypath =                   --表示删除环境变量mypath
export mypath = /home/.. -- 导入环境变量,只在当前会话有效
可以修改 /etc/enviroment

nc 意思是NetCat
nc -l 端口号 & --在机器上开一个端口号的服务 “&”是起放在后台运行 ctrl + z 将前台程序放到后台
jobs命令查看后台运行的程序,
bg %作业编号 --激活后台作业编号的程序
fg %后台运行号 --将后台运行的程序调到前台 
nc ip 端口号 --连接到ip地址那台机器的端口号的端口上
nc ip -z port1-portn --指定需要扫描的主机ip和端口区间
使用nc传递文件
nc -l 8888 > ccc.txt
nc localhost 8888 < hello.txt
nc -v -w 2 ip -z 2000-4000 -- -v 详细信息 -w 超时数(秒)-z 端口号

修改目录属主属组
chown centos7:centos7 文件夹或文件
chown -R centos7:centos7 文件夹 --将文件夹下面所有的文件属主属组修改为centos7
修改目录权限
chmod ugoa +wrx 文件名或目录 -- 给文件或者文件夹赋予权限 ”-“ 是消除权限
chmod ugoa 777 文件名或目录
chmod -R ugoa 777 文件夹 -- 递归文件夹里面的文件全部进行修改

用户添加
useradd 不推荐,底层命令
adduser --home /home/centos8 --gid 1000 centos8 --systemd
--home 指定家目录
--gid 指定组
--system 系统用户

/etc/passwd:
用户名:密码:UID:GID:注释:家目录:默认SHELL

/etc/group:
组名:密码:GID:以此组为其附加组的用户列表

/etc/shadow:
用户名:密码:最近一次修改密码的时间:最短使用期限:最长使用期限:警告时间:非活动时间:过期时间:

用户管理:
    useradd, userdel, usermod, passwd, chsh, chfn, finger, id, chage


useradd  [options]  USERNAME 
    -u UID
    -g GID(基本组)
    -G GID,...  (附加组)
    -c "COMMENT"
    -d /path/to/directory
    -s SHELL
    -m -k
    -M
    -r: 添加系统用户

userdel:
userdel [option] USERNAME
    -r: 同时删除用户的家目录

id:查看用户的帐号属性信息
    -u
    -g
    -G
    -n

finger: 查看用户帐号信息
finger USERNAME

修改用户帐号属性:
usermod
    -u UID 
    -g GID
    -a -G GID:不使用-a选项,会覆盖此前的附加组;
    -c
    -d -m:
    -s
    -l
    -L:锁定帐号
    -U:解锁帐号
    
chsh: 修改用户的默认shell

chfn:修改注释信息

密码管理:
passwd [USERNAME]
    --stdin
    -l
    -u
    -d: 删除用户密码

pwck:检查用户帐号完整性


组管理:
创建组:groupadd
groupadd 
    -g GID
    -r:添加为系统组
    
groupmod
    -g GID
    -n GRPNAME

groupdel

gpasswd:为组设定密码

网络连接模式
桥接:
完全模拟网络中的真实电脑,可配置ip,访问互联网,局域网内的互访。如果无网络,彼此无法连通。
net:
和Host形成局域网,由Host做Nat和DNS,可访问互联网,局域网内的主机无法访问客户机。没有网络时,Host和客户机之间任能连通。
 
配置静态ip
1.查看NAT的网关
    网络地址编辑器->NAT -> NAT设置 -> 查看网关(192.168.231.2)
2.查看网段
    网络地址编辑器->NAT -> DHCP设置 ->起始网段(192.168.231.100),结束网段(192.168.231.254)
4.编辑客户机网络设置
    将网关改为查看的NAT网关,DNS解析也改为NAT网关。
    BOOTPROTO="static" #dhcp改为static  
    IPADDR=192.168.7.106 #静态IP  
    GATEWAY=192.168.7.1 #默认网关  
    NETMASK=255.255.255.0 #子网掩码  
    DNS1=192.168.7.1 #DNS 配置  
5.service network restart

客户机环境处理
    ip 100-104
    主机名 s100
修改主机名
    /etc/hostname s100
    windows C:\Windows\System32\drivers\etc
修改dns解析
    /etc/hosts
    127.0.0.1 localhost
    192.168.231.100 s100
    192.168.231.101 s101
        ....

hadoop简介:
    1.Hadoop Common:
        支持其他模块的工具模块
    2.Hadoop Distributed File System(HDFS):
        分布式文件系统,提供了对应程序数据的高吞吐量访问
        【进程】
            2.1:NameNode            //名称节点 --NN
            2.2:DataNode            //数据节点 --DN
            2.3:SecondaryNamenode    //辅助名称节点 --2ndNN            
    3.Hadoop YARN(yet another resource negotiate):
        作业调度与集群资源管理的框架
        【进程】
            3.1:ResourceManager    //资源管理器 --RM
            3.2:NodeManager        //节点管理器 -- NM
    4.Hadoop MapReduce:
        基于yarn系统的对大数据进行并行处理的
        
hadoop的安装
    1.安装jdk 用hadoop用户装
        1.1:复制jdk-xx.tar.gz 到想要放的目录
        1.2:tar -zxvf jdk-xx.tar.gz -C 目录 --解压到指定目录
        1.3: ln -sf jdk-xx jdk --创建软链接
        1.4:chown -R hadoop:hadoop 目录 --改变解压到的目录及子目录的属主属组
        1.5:ubuntu
            vim /etc/enviroment --配置环境变量 
            增加 JAVA_HOME=目录路径/jdk
            PATH=$PATH:/目录路径/jdk/bin
        centos:
            在profile.d目录下创建一个 java.sh 文件 里面如下配置即可:
            JAVA_HOME=你的JAVA_HOME的具体目录
            #如果你只是想要配置一下java的家目录的话是不需要添加这一行的,除非你无法随处使用java命令。
            PATH=$PATH:$JAVA_HOME/bin
        
        1.6重启配置文件 
            ubuntu
                source enviroment
            centos:
                 source /etc/profile
        1.7:验证是否安装完成
            java -version
        2.hadoop安装
            2.1:将文件解压 到指定目录
            2.2:创建软链接
            2.3:配置HADOOP_HOME=指定目录
                PATH=$PATH:/$HADOOP_HOME/bin:$HADOOP_HOME/sbin
                修改hadoop解压目录/etc/hadoop/haoop-env.sh 将export JAVA_HOME = 指定目录/bin
            2.4重启配置文件,重启机器
            2.5验证是否安装完成
                hadoop version
hadoop配置

    hadoop-env.sh: 用于定义hadoop运行环境相关的配置信息,比如配置JAVA_HOME环境变量、为hadoop的JVM指定特定的选项、指定日志文件所在的目录路径以及master和slave文件的位置等;
    core-site.xml: 用于定义系统级别的参数,如HDFS URL、Hadoop的临时目录以及用于rack-aware集群中的配置文件的配置等,此中的参数定义会覆盖core-default.xml文件中的默认配置;
    hdfs-site.xml: HDFS的相关设定,如文件副本的个数、块大小及是否使用强制权限等,此中的参数定义会覆盖hdfs-default.xml文件中的默认配置;
    mapred-site.xml:HDFS的相关设定,如reduce任务的默认个数、任务所能够使用内存的默认上下限等,此中的参数定义会覆盖mapred-default.xml文件中的默认配置;
    masters: hadoop的secondary-masters主机列表,当启动Hadoop时,其会在当前主机上启动NameNode和JobTracker,然后通过SSH连接此文件中的主机以作为备用NameNode; 
    slaves:Hadoop集群的slave主机列表,master启动时会通过SSH连接至此列表中的所有主机并为其启动DataNode和taskTracker进程;
        模式:
        1.Standalone/local     --独立/模式,没有启动任何java进程,用于测试和开发环境,不用配置
            hadoop fs -ls     --查看文件系统的方式
            jps                --查看系统进程
        2.Pseudodistibuted mode --伪分布模式
            【配置】hdfs://localhost/ --hdfs协议 localhost 域名 默认端口为8020
            2.1:core-site.xml
                <?xml version-"1.0" ?>
                <configuration>
                    <property>
                        <name>fs.defaultFS</name>
                        <value>hdfs://localhost/</value> 
                    </property>
                </configuration>
            2.2:hdfs-site.xml
                <?xml version-"1.0" ?>
                <configuration>
                    <property>
                        <name>dfs.replication</name>
                        <value>1</value> 
                    </property>
                </configuration>
            2.3:mapred-site.xml        --复制mapred-site.xml.temple --> mapred-site.xml
                <?xml version-"1.0" ?>
                <configuration>
                    <property>
                        <name>mapreduce.framework.name</name>
                        <value>yarn</value> 
                    </property>
                </configuration>
            2.4:yarn-site.xml
                <?xml version-"1.0" ?>
                <configuration>
                    <property>
                        <name>yarn.resourcemanager.hostname</name>
                        <value>localhost</value> 
                    </property>
                    <property>
                        <name>yarn.nodemanager.aux-services</name>
                        <value>mapreduce_shuffle</value> 
                    </property>
                </configuration>
        3.Fully Distributed mide --完全分布式模式
            1.准备5台安装好jdk、hadoop、ssh的客户机
    2.配置文件
        2.1:core-site.xml
                <?xml version-"1.0" ?>
                <configuration>
                    <property>
                        <name>fs.defaultFS</name>
                        <value>hdfs://S100</value> 
                    </property>
                </configuration>
        2.2:yarn-site.xml
                <?xml version-"1.0" ?>
                <configuration>
                    <property>
                        <name>yarn.resourcemanager.hostname</name>
                        <value>S100</value> 
                    </property>
                    <property>
                        <name>yarn.nodemanager.aux-services</name>
                        <value>mapreduce_shuffle</value> 
                    </property>
                </configuration>
        2.3:hdfs-site.xml
                <?xml version-"1.0" ?>
                <configuration>
                    <property>
                        <name>dfs.replication</name>
                        <value>3</value> 
                    </property>
                </configuration>
            编辑slaves:配置数据节点
                S101
                S102
                S103
        2.4配置辅助节点 hdfs-site.xml中增加
            <property>
              <name>dfs.namenode.secondary.http-address</name>
              <value>S104:50090</value>
            </property>
        2.5将临时目录改为本地 core-site.xml
        <property>
          <name>hadoop.tmp.dir</name>
          <value>/tmp/hadoop-${user.name}</value>
        </property>
        将/tmp/hadoop-hadoop文件夹删除还有/soft/hadoop/logs。
    注意造成datanode启动不起来的原因最常见的是多次格式化namenode造成的即/tmp/hadoop-hadoop/dfs/目录下data和name中VERSION的namespaceID不一致。这种情况清空logs,重启启动有时候甚至有时候        都没有datanode的日志产生。
    解决方法:找到不一致的 VERSION 修改  namespaceID
或者
    将所有节点删除 /tmp/hadoop-hadoop/ 中全部文件,重新初始化namenode,这样做数据就全部没了(看到的结果是这样)

让两个保持一致

    ssh:无密码登录
        1.先安装ssh
            sudo yum install ssh
            sudo apt-get install ssh
        2.生成ssh公钥和私钥
            ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
                -- -t 加密方式 -P 加密密码 -f 秘钥存放位置
        3.导入公钥数据到授权库中,并修改authorized_keys的权限为600 .ssh的权限为700
            cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
            chmod 600 ~/.ssh/authorized_keys
            chmod 700 ~/.ssh 
        4.检验是否安装成功,登录到本机
            ssh localhost
        5.格式化hdfs文件系统
            hadoop namenode -format
        6.启动所有进程(start-all.sh = start-dfs.sh+start + yarn.sh)
            start-all.sh
            如果进程数不对,关闭所有进程
            stop-all.sh
        7.查看进程
            jps  //5个进程RM NM NN DN 2NN(每个节点启动不同的进程)
        8.查看文件系统
            hadoop fs -ls /
        9.创建文件系统
            hadoop fs -mkdir -p /usr/centos7/data
            hadoop fs -ls -R /            ---lsr
            
    ssh 其他功能
        scp:跨主机安全复制工具,缺点:符号链接会转变为目录
            scp SRC DEST
                -r
                -a
            scp USERNAME@HOST:/path/to/somefile  /path/to/local
            scp /path/to/local  USERNAME@HOST:/path/to/somewhere
            scp - 3  USERNAME@HOST:/path/to/somewhere     USERNAME@HOST:/path/to/somewhere 通过本机实现两个远程主机直接的拷贝
    rsync linux自带的远程同步工具,主要用于备份和镜像
        支持连接、设备等;速度快,避免复制相同内容的文件数据
        rsync -rlv 源文件路径(/soft/*) USERNAME@HOST:/path/to/somewhere
            -r 遍历目录中的文件
            -l 符号连接(不加此选项,符号链接拷贝不过去)
            -v 显示拷贝信息
【xsync脚本】--用于复制文本到其他服务器
#!/bin/bash

pcount=$#
if (( pcount<1 )) ; then
    echo no args;
    exit;
fi

p1=$1
fname = `basename $p1`

pdir = `cd -P $(dirname $p1) ; pwd`
cuser = `whoami`
for(( host=100;host<106;host=host+1 ));do
    echo ----------------------------------s$host-----------------------------
    rsync -rvl $pdir/$fname $cuser@S$host:$pdir
done

【xcall脚本】--查看命令
#!/bin/bash

pcount=$#

if (( pcount<1 )) ; then
    echo no args;
    exit;
fi
echo ----------------------localhost---------------------------------------
$@
for(( host=100;host<106;host=host+1 ));do
    echo ----------------------------------s$host-----------------------------
    ssh s$host $@
done

        
查看进程 ps -af 
查看端口使用情况:netstat -ano 

首次启动hadoop
            1.格式化文件系统
                hadoop namenode -format
            2.启动所有进程
                start-all.sh
            3.查询进程
                jps
            4.停止所有进程
                stop-all.sh

    1.hdfs webui
        http://ip地址(或者域名):50070/ 
    2.data node
        http://ip地址(或者域名):50075/ 
    3.2nn
        http://ip地址(或者域名):50090/ 

hadoop命令详解
    hadoop-deamon.sh start[stop] namenode --启动[关闭]名称节点
    hadoop-deamons.sh start[stop] datanode    --启动[关闭]所有数据节点
    hadoop-deamon.sh start[stop] datanode    --启动[关闭]本机数据节点
    hadoop namenode -format                    --格式化文件系统
    put === copyFormLocal 
        hadoop fs -put //hdfs dfs -put         --上传文件
    hdfs dfs -mv from to                     --重命名,移动文件从from移动到to
    hdfs dfs -get hadoop文件    本地文件    --将hadoop文件下载到本地 == hdfs dfs -copyToLocal
    hdfs dfs -moveFromLocal 本地文件  hadoop文件    --将本地文件移动到hadoop
    hdfs dfs -rm -r -skipTrash                 --删除文件 -r 遍历 -skipTrash 跳过回收站
    hdfs dfs -rmdir 目录                    --删除目录,目录必须为空
    
    
    
    hadoop fs [commands]
    [-appendToFile <localsrc> ... <dst>]
    [-cat [-ignoreCrc] <src> ...]
    [-checksum <src> ...]
    [-chgrp [-R] GROUP PATH...]
    [-chmod [-R] <MODE[,MODE]... | OCTALMODE> PATH...]
    [-chown [-R] [OWNER][:[GROUP]] PATH...]
    [-copyFromLocal [-f] [-p] [-l] <localsrc> ... <dst>]
    [-copyToLocal [-p] [-ignoreCrc] [-crc] <src> ... <localdst>]
    [-count [-q] [-h] <path> ...]
    [-cp [-f] [-p | -p[topax]] <src> ... <dst>]
    [-createSnapshot <snapshotDir> [<snapshotName>]]
    [-deleteSnapshot <snapshotDir> <snapshotName>]
    [-df [-h] [<path> ...]]
    [-du [-s] [-h] <path> ...]
    [-expunge]
    [-find <path> ... <expression> ...]
    [-get [-p] [-ignoreCrc] [-crc] <src> ... <localdst>]
    [-getfacl [-R] <path>]
    [-getfattr [-R] {-n name | -d} [-e en] <path>]
    [-getmerge [-nl] <src> <localdst>]
    [-help [cmd ...]]
    [-ls [-d] [-h] [-R] [<path> ...]]
    [-mkdir [-p] <path> ...]
    [-moveFromLocal <localsrc> ... <dst>]
    [-moveToLocal <src> <localdst>]
    [-mv <src> ... <dst>]
    [-put [-f] [-p] [-l] <localsrc> ... <dst>]
    [-renameSnapshot <snapshotDir> <oldName> <newName>]
    [-rm [-f] [-r|-R] [-skipTrash] <src> ...]
    [-rmdir [--ignore-fail-on-non-empty] <dir> ...]
    [-setfacl [-R] [{-b|-k} {-m|-x <acl_spec>} <path>]|[--set <acl_spec> <path>]]
    [-setfattr {-n name [-v value] | -x name} <path>]
    [-setrep [-R] [-w] <rep> <path> ...]
    [-stat [format] <path> ...]
    [-tail [-f] <file>]
    [-test -[defsz] <path>]
    [-text [-ignoreCrc] <src> ...]
    [-touchz <path> ...]
    [-truncate [-w] <length> <path> ...]
    [-usage [cmd ...]]
hadoop配置信息
    1.namenode的本地目录配置成多个,则每个目录存放相容内容,可靠性
        [hdfs-site.xml]
        dfs.namenode.name.dir = file:///${hadoop.tmp.dir}/dfs/name1,file:///${hadoop.tmp.dir}/dfs/name2
    2.datanode也可以配置多分目录,不是副本
        [hdfs-site.xml]
        dfs.datanode.data.dir = file:///${hadoop.tmp.dir}/dfs/data1,file:///${hadoop.tmp.dir}/dfs/data2
hadoop文件系统
    hadoop getconf --获取文件参数的信息
    
自定义机架感知
    1.创建类实现DNSToSwitchMapping接口
    2.配置文件core-site.xml
    <property>
      <name>net.topology.node.switch.mapping.impl</name>
      <value>con.test.MyDNSToSwichMapping</value>
    </property>
    3.分发core-site.xml
    4.编译程序,打成jar,分发所有节点的hadoop的classpath下
        /soft/hadoop/share/hadoop/common/lib
        
hdfs架构
    namenode:存放元数据(名称,副本数,权限快列表)不保护数据节点
    使用oie和oev查看namenode的镜像文件和编辑日志文件(离线工具)
        $>hdfs oiv -p XML -i xxx -o ~/xxx.xml    //fsimage
        $>hdfs oev -p XML -i xxx -o ~/xxx.xml    //edit log
        
hadoop集群启动时首先进入安全模式
        如果集群处于安全模式,不能执行重要操作(写操作)。
        集群启动完成后,自动退出安全模式。
        1.安全模式操作
            $>hdfs dfsadmin -safemode get //查看安全模式状态
            $>hdfs dfsadmin -safemode enter //进入安全模式状态
            $>hdfs dfsadmin -safemode leave //离开安全模式状态
            $>hdfs dfsadmin -safemode wait //等待安全模式状态
        2.保存名字空间/融合镜像和编辑日志
            1.进入安全模式
                $>hdfs dfsadmin -safemode enter
            2.进行保存
                $>hdfs dfsadmin -saveNamespace
            3.退出安全模式
                $>hdfs dfsadmin -safemode leave
一致性模型
    写入数据时,如果希望数据被其他client立即可见,调用如下方法:
        FSDataOutputStream.hflus();    //清理客户缓冲区数据,被其他client立即可见
        FSDataOutputStream.sync();    //清理客户缓冲区数据,并写入磁盘(不推荐使用)    
        FSDataOutputStream.hsync();    //清理客户缓冲区数据,并写入磁盘,不能立即可见
        
distcp:实现两个hadoop集群之间的递归数据复制
    $>hadoop distcp hdfs://s101:8020/user/ubuntu/hello.txt  hdfs://s102:8020/user/home/kk.txt
                
hadoop归档:对小文件进行处理,减少小文件占的磁盘空间(每个快128M)要在yarn上进行操作
    hadoop archive -archiveName 归档文件名.har -p 要归档的目录    归档到那个目录
    $>hdfs dfs -lsr har:///归档文件路径/归档文件名.har    查看归档文件夹
解归档
    $>hdfs dfs -cp har:///归档文件路径/归档文件名.har    解压到文件夹
                                
在ubuntu上安装eclipse
    1.下载eclipse-jee-mars-R-linux-gtk-x86_64.tar.gz
    2.tar开到ubuntu /soft下
        $>tar -xzfv eclise-xxx.tar.gz -C /soft/
    3.配置环境变量
        [/etc/enviroment]
        PATH=....:/soft/eclipse
        $>source /etc/enviroment //即可生效环境变量
    4.把hadoop/lib/native/* 复制到/lib目录下,能够正确加载hadoop的本地库文件

使用hadoop的checknative命令检查本地库安装情况
        1.命令
            $>hadoop checknative -a
安装lzo-2.06版(LZO 是致力于解压速度的一种数据压缩算法)
    注意:该版本安装测试是ok的
    1.下载并tar开lzo-2.06.tar.gz
    2.编译安装lzo
        $>./configure --enable-shared
        $>make
        $>sudo make install (when logged in as root)
    3.检查是否生成lzo库文件
        $>find /usr/local/lin | grep lzo
maven的安装和使用
    1.下载并解压apache-maven-3.3.9-bin.tar.gz到/soft/下
    2.创建符号链接
        $>cd /soft
        $>ln -s apache-apache-maven-3.3.9 maven
    3.配置maven的环境变量
        [/etc/enviroment]
        M2_HOME=/soft/maven
        PATH=....:/soft/maven/bin
        
在win7宿主机上搭建maven本地仓库服务器    
    1.安装tomcat
    2.安装nexus.war文件(相当于tomcat里面的一个项目)
        a.复制nexus.war到${tomcate_home}/webapps/
        b.启动tomcat
        c.http://localhost:8080/nexus/
maven基础
    1.pom: project object model 项目对象模型
    2.mvn    help:system    //输出环境变量,下载help插件到本地仓库(~/,m2目录中)
    3.eclipse已近集成maven插件
    4.配置maven插件
        eclipse->windows->首选项->maven->user setting->右侧进行设置
        user setting    :/maven安装路径/conf/setting.xml
        local repository :/当前用户/.m2/repository
    5.使用mvaen
        a)创建hello-world项目所在地文件夹
        b)在hello-world文件夹下创建pom.xml
            <?xml version="1.0"?>
            <project xmlns="http://maven.apache/POM/4.0.0" xmlns:xsi="http://www.w3/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache/POM/4.0.0 http://maven.apache/maven-v4_0_0.xsd">
                <modelVersion>4.0.0</modelVersion>
                <groupId>com.hello-world</groupId>
                <artifactId>hello-word</artifactId>
                <version>1.0-SNAPSHOT</version>
                <name>maven hello world project</name>
             </project>
             </project>
        c)创建文件夹
            d:/>cd hello-word
            d:/mkdir src/main/java
        d)创建HelloWorld.java文件
            package com.helloworld;
            public class HelloWord{
                public static void main(String[] args){
                    System.out.println("helloworld");
                }
            }
        e)在pom.xml文件所在目录运行mvn clean compile
            d:/>cd hello-world
            d:/>mvn clean compile    //clean:删除target文件夹,compile编译源代码
        f)创建测试目录
            d:/>mkdir hello-word\src\test\java
        g)编写pom.xml,添加junit的依赖
            <?xml version="1.0"?>
            <project xmlns="http://maven.apache/POM/4.0.0" xmlns:xsi="http://www.w3/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache/POM/4.0.0 http://maven.apache/maven-v4_0_0.xsd">
                <modelVersion>4.0.0</modelVersion>
                <groupId>com.hello-world</groupId>
                <artifactId>hello-word</artifactId>
                <version>1.0-SNAPSHOT</version>
                <name>maven hello world project</name>
                <dependencies>
                    <dependency>
                        <groupId>junit</groupId>
                        <artifactId>junit</artifactId>
                        <version>3.8.2</version>
                        <scope>test</scope>
                    </dependency>
                </dependencies>
             </project>
        h)创建测试类包
            d:/>cd hello-word
            d:/>mkdir src\test\java\com\test\TestHelloWorld.java
                pakage com.test;
                import org.junit.Test;
                public class TestHelloWorld{
                    @Test
                    public void testHello(){
                        System.out.println("hello-world");
                    }
                }
        i)执行mvn clean test;
            d:/>mvn clean test
        j)执行package命令进行打包,生成/target/hello-word-1.0-snapshot.jar文件
            d:/>mvn clean package
        k)执行install将项目上传到maven
            d:/>mvn clean install  //在c盘c:\user\用户\.m2\repository\com\....中
maven:项目管理工具
    mvn    clean    //删除target目录
    mvn test    //测试
    mvn    compile    //编译
    mvn package    //打包
    mvn install    //安装到本地
maven交换式创建maven项目
    mvn archetype : generate    //生成项目的maven的骨架
        输入groupId
        输入artifactId
        输入version
在eclipse中导入maven项目
    1.配置maven首选项指定setting为${maven_home}/conf/setting.xml
        eclipse -> windows -> 首选项 -> maven -> user setting -> 右侧user setting=C:\myprograms\apache-maven-3.3\conf\setting.xml
    2.import mvn项目
    3.run as : mvn clean package

hdfs dfsadmin(hdfs管理命令)
    条件:1.对目录进行设置
          2.值必须是正整数
          3.具有管理员权限
    1.设置配额管理
        [目录配额] 控制的目录所有文件/文件夹的个数,1表示空目录,包含子文件
        $>hdfs dfsmain -setQuota 1 /user/hadoop/data     //设置配额
        $>hdfs dfsmain -clrQuota  /user/hadoop/data        //清除配额
        
        [空间配额] 副本数计算在内,控制的所有文件总大小,值至少大于284M,磁盘空间最少消耗就是384m
        $>hdfs dfsadmin -help setSpaceQuota            //查看空间配额
        $>hdfs dfsadmin -setSpaceQuota 20m data        //设置空间配额
        $>hdfs dfsadmin -clrSpaceQuota data            //清除空间配额
        
    2.快照
        快照相当于对目录做一个备份。 
        $>hdfs dfs -help createSnapshot                                //查看快照
        $>hdfs dfsadmin -allowSnapshot /usr/hadoop/data                //开启指定目录快照功能,默认是关闭的
        $>hdfs dfsadmin -disallowSnapshot /usr/hadoop/data          //禁用快照
        
        $>hdfs dfs -createSnapshot /usr/hadoop/data                    //对目录创建快照
            hdfs://s100:8020/usr/hadoop/data/.snapshot/xxxx/....    //快照和源文件使用相同的数据块
            
        $>hdfs dfs -createSnapshot /usr/hadoop/data hadoop_17_09_18    //指定名称命名快照
        $>hdfs dfs -renameSnapshot data hadoop_17_09_18 centos        //重命名快照
        
        $>hdfs lsSnapshottableDir    //列出当前用户所有可快照的目录
        $>hdfs diffSnapshot         //比较两个快照目录的不同之处
        
    3.回收站
        trash对应的一个文件夹
            fs.trash.initerval=0            //分钟数,0表示禁用回收站,删除文件的存活时间
            fs.trash.checkpoint.initerval    //检查回收站间隔时间,应该<=存活时间,0表示和存活时间一致
        1.启用回收站
            【core-site.xml】
                fs.trash.interval=1
        2.分发文件,立即生效
            回收站位置:/usr/hadoop/.Trash/.....
        3.通过程序删除的文件不会经过回收站,需要调用moveToTrash()才进入回收站
            Trash trash = New Trash(conf);
            trash.moveToTrash(path);
        4.丢弃回收站
            hdfs dfs -expunge //情况回收站
    修改hdfs的webui的静态用户的名称
        【core-site.xml】
            <property>
                <name>hadoop.http.staticuser.user</name>
                <value>hadoop</value>
            </property>
            
简单的mapper-reducer程序
    1.创建mapper类
    package com;
    import java.io.IOException;
    import org.apache.hadoop.io.IntWritable;
    import org.apache.hadoop.io.LongWritable;
    import org.apache.hadoop.io.Text;
    import org.apache.hadoop.mapreduce.Mapper;
    public class myMap extends Mapper<LongWritable, Text, Text, IntWritable>{
        private static final int MISSING = 9999;    
        @Override
        protected void map(LongWritable key, Text value,Mapper<LongWritable, Text, Text, IntWritable>.Context context)
                throws IOException, InterruptedException {
            //将一行转化为字符串
            String line = value.toString();
            //提取年份
            String year = line.substring(15,19);
            //气温
            int airTemperature;
            //提取气温值
            if(line.charAt(87)=='+'){
                airTemperature = Integer.parseInt(line.substring(88,89));
            }else{
                airTemperature = Integer.parseInt(line.substring(87,92));
            }
            String quality = line.substring(92,93);
            if(airTemperature != MISSING && quality.matches("[01459]")){
                context.write(new Text(year), new IntWritable(airTemperature));
            }
        }
    }
    2.创建reducer类
        package com;
        import java.io.IOException;
        import org.apache.hadoop.io.IntWritable;
        import org.apache.hadoop.io.Text;
        import org.apache.hadoop.mapreduce.Reducer;
        public class MyReduce extends Reducer<Text, IntWritable, Text, IntWritable> {
            protected void reduce(Text keyIn, Iterable<IntWritable> values,Reducer<Text, IntWritable, Text, IntWritable>.Context context)
                    throws IOException, InterruptedException {
                //最小值
                int maxValue = Integer.MIN_VALUE;
                //比较取最大值
                for(IntWritable value:values){
                    maxValue = Math.max(maxValue, value.get());
                }
                context.write(keyIn, new IntWritable(maxValue));
            }
        }
    3.创建一个App运行作业
    package com;
    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;

    public class MyApp {
        public static void main(String[] args) throws Exception {
            if(args.length != 2){
                System.err.println("Usage:MaxTemperature<input path> <input path>");
                System.exit(-1);
            }
            Job job =Job.getInstance();
            job.setJarByClass(MyApp.class);
            
            job.setJobName("Max temp");                                //设置作业名称
            FileInputFormat.addInputPath(job, new Path(args[0]));    //输入路径
            
            FileOutputFormat.setOutputPath(job, new Path(args[1]));    //输出路径
            job.setMapperClass(MyMap.class);                        //设置mapper类型
            job.setReducerClass(MyReduce.class);                    //设置reduce类型
            job.setOutputKeyClass(Text.class);                        //设置输出key类型
            job.setOutputValueClass(IntWritable.class);                //设置输出value类型
            System.exit(job.waitForCompletion(true)?0:1);
            
        }
    }
导出jar包: mvn clean package
在ubuntu上提交作业: hadoop jar xxx.jar com.xxx.xxx.XxxApp /user/hadoop/data/ncdc /usr/hadoop/out
eclipse中的maven项目需要查看源代码时,项目不能够正常下载可以使用手动命令强行下载源代码
    $>mvn dependency:sources -DdownloadSources=true

mapreduce作业决定使用LocalJobRunner还是YARNRunner取决于配置文件mapred-site.xml
    maprdeuce.framework.name=local    //使用LocalJobRunner
    maprdeuce.framework.name=yarn    //使用YARNRunner
    
远程调试【远端(s100 namenode)】
    1.查看java远程调试的帮助
        c:/>java -agentlib:jdwp=help
    2.设置java虚拟机的远程调试
        java -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=8000        //设置java虚拟机的参数,启用远程调试
    3.给namenode启动时增加jvm的远程调试
        第一种方法:修改bin/hdfs启动脚本,永久有效,一般不用
            HADOOP_NAME_OPTS=$HADOOP_NAME_OPTS -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=8000
        第二种方法:在shell当中直接设置环境变量
            $>export HADOOP_NAMENODE_OPTS="$HADOOP_NAME_OPTS -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=8000"
        完成远程调试后,关闭远程调试功能
            $>export HADOOP_NAMENODE_OPTS=
    4.启动名称节点
        $>hadoop-deamon.sh start namenode
    
【客户端】
    1.找namenode类,在main函数上打断点
    2.eclipse右键调试->remote java application
        项目:myhadoop
        connectionType:standard(socket attach)
        host:s100
        port:8000
    3.调试

在win和ubuntu上通过远程调试查看job在hadoop集群上的执行过程
    【远端s100,,ubuntu】
    1.传递jar到ubuntu
    2.设置HADOOP_CLIENT_OPTS环境变量
        $>export HADOOP_CLIENT_OPTS="$HADOOP_NAME_OPTS -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=8000"
    3.启动job提交命令
        $>hadoop jar com.it18zhang.myhadoop.mr.MyMaxTempApp data/ncdc out3
    4.等待客户端发起连接,进行调试
    
    【客户端,win7,eclipse】
    1.在源代码中设置断点
        App.main()...
    2.eclipse右键调试->remote java application
        项目:myhadoop
        connectionType:standard(socket attach)
        host:s100
        port:8000
    3.调试
    
IPC:inter process communication,进程间通信
RPC:remote procedure call,远程过程调用

hadoop底层ipc通信
    1.创建java程序:客户端和服务器端
    2.创建接口HelloWorldservice.java
        package ipc;
        import org.apache.hadoop.ipc.VersionedProtocol;
        public interface HelloWordService extends VersionedProtocol {
            public String sayHello(String msg);            
        }
    3.实现接口
        package ipc;
        import java.io.IOException;
        import org.apache.hadoop.ipc.ProtocolSignature;
        public class HelloWordServiceImp implements HelloWordService {

            public long getProtocolVersion(String protocol, long clientVersion)
                    throws IOException {
                return versionID;
            }
            public ProtocolSignature getProtocolSignature(String protocol,
                    long clientVersion, int clientMethodsHash) throws IOException {
                try {
                    return ProtocolSignature.getProtocolSignature(protocol, versionID);
                } catch (ClassNotFoundException e) {
                    e.printStackTrace();
                }
                return null;
            }
            public String sayHello(String msg) {
                System.out.print(msg);
                return "hello "+msg;
            }
        }
    4.创建MyServer服务器
        package ipc;
        import org.apache.hadoop.conf.Configuration;
        import org.apache.hadoop.ipc.RPC;
        import org.apache.hadoop.ipc.Server;
        /**
         * 服务器断
         * @author VULCNAVSeries
         *
         */
        public class MyServer {            
            public static void main(String[] args) {
                try {
                    Configuration conf = new Configuration();
                    Server server = new RPC.Builder(conf).setProtocol(HelloWordService.class)
                            .setInstance(new HelloWordServiceImp())
                            .setBindAddress("localhost")
                            .setPort(8888).build();
                    server.start();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    5.创建客户端
    package ipc;
    import java.InetSocketAddress;
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.ipc.RPC;
    public class MyClient {
        
        public static void main(String[] args) {
            try {
                Configuration conf = new Configuration();
                HelloWordService proxy = RPC.getProxy(HelloWordService.class, 
                        HelloWordService.versionID,
                        new InetSocketAddress("localhost",888),
                        conf);
                String result = proxy.sayHello("world");
                System.out.println(result);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    6.运行:启动服务器端,在客户端

切片大小和block相当
        优化策略(map)
        1.数据本地化
        2.机架本地化
        3.不同机架
    
启动mr作业历史服务器进程(启动那个节点就在那个节点上执行mr-jobhistoryserver start historysever)
        1.启动【xcall是已经写好的一个shell脚本】
            $>xcall mr-jobhistoryserver start historysever
        1.停止
            $>xcall mr-jobhistoryserver stop historysever
        

大数据连接mysql F:\BaiduYunDownload\03.老男孩IT教育_徐培成_大数据课程Hadoop\【IT十八掌徐培成】Hadoop第11天\【IT十八掌徐培成】Hadoop第11天-07.inputformat-DB

maven项目package(打包)时跳过测试
    1.mvn -DskipTests=true    //跳过测试
    2.mvn -Dmaven.test.skip=true
    3.pom.xml
        <build>
            <plugins>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <skipTests>true</skipTests>
                </configuration>
            </plugins>    
        </build>
    
    4.使用antrun插件实现文件的复制
        <build>
            <plugins>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.12.4</version>
                <configuration>
                    <skipTests>true</skipTests>
                </configuration>
            </plugins>
            <plugins>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-antrun-plugin</artifactId>
                <version>1.8</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>run</goal>
                        </goals>
                        <configuration>
                            <tasks>
                                <echo>-------------开始复制jar包到共享目录下-------</echo>
                                <delete file="D:/dwnloads/myhadoop-0.0.1-SXXX.jar"></delete>
                                <copy file="target/myhadoop-0.0.1-SXXX.jar" toDir="D:/dwnloads/myhadoop-0.0.1-SXXX.jar"></copy>
                            </tasks>
                        </configuration>
                    </execution>
                </executions>
            </plugins>
        </build>        
                
                            
    --------------hive--------------
    数据仓库:OLAP,分析处理,注重存储和分析,延迟较高
    数据库:OLTP,在线事务处理,低延迟,事务支持
一、安装
    1.安装jdk
    2.安装hadoop
    3.解压下载的安装包
        tar -zxvf apach-hive-xxx.tar.gz -C /soft/
    4.建立软连接
        ln -s apache-hive-2.1.1-bin hive
    5.环境变量配置(注意root用户)
        cd /etc/profile.d/
        vim hive.sh
            HIVE_HOME=/soft/hive
            PATH=$PATH:$HIVE_HOME/bin
    6.source /etc/profile   //使配置文件生效
    7.hive --version     //检验是否安装成功

二、配置hive的元数据库
    1.hive使用rdbms存取元数据,内置derby数据库
        /soft/hive/conf/hive-default.xml.template //hive的默认配置、不要修改
    2.创建hive-site.xml
        $>cp hive-default.xml.template hive-site.xml
    3.修改hive-site.xml配置
        替换${system:java.io.tmp.dir}=/home/hadoop/hive/hadoop
        ${system:user.name}=hadoop0
    4.在/home目录下创建hadoop/hive/hadoop
        $>mkdir -p hadoop/hive/hadoop
    
二、使用
    1.启动hadoop
    2.初始化schema库
        $>hive/bin/schematool -initSchema -dbType derby     //在哪个目录下执行的,登录hive时必须在哪个文件下面
    3.完成进程后,会在当前目录下创建一个文件夹metastore_db(元数据)
    4.进入hvie
        $>hive
    5.hive常用命令,hive的语法类型与mysql
        1.hive>show databases; //显示库 
        2.hive>create database db_test; //创建库
        3.hive>show tables; //显示表
        4.hive>create table if not exists db_test.employee(eid int comment '主键',name String,salary String,des String) comment '员工信息表' row format delimited fields terminated by '\t' lines terminated by '\n' stored as textfile; //创建表,规定字段之间用制表符隔开,行之间用换行符隔开
        5.hive>load data [local] inpath 'filepath' [overwrite] into table tablename [parition (partcol1=val1,partcol2=val2 .......)] //向表中添加数据,也可以把按规则弄好数据的文本之间放置在/user/hive/warehouse/db_test.db/employee目录下,也可以用insert into employee(eid,name,salary,des) values(21,'李四','13600','测试55');不推荐使用,hive不支持更新和删除
        6.hive>!clear             //执行hive中的清屏操作
        7.hive>dfs -lsr /       //执行hive中dfs命令
        8.hive>hive -f /path/to/file/xx.sql    //执行sql脚本
        9.hive>-- this is a comments;    //在脚本中添加注释
        10.hive>set hive.cli.print.header=true //查询时显示表头
        11.create table employees(name String,salary float,subordinates array<String>,deuctions map<String,float>,address struct<stree:string,city:string,state:String>) //创建数据结构表
        12.hive>drop database xxx cascde;    //xxx下面表是drop 不了的,可以通过级联来删除
        13.hive>desc formatted hive.employee; //格式化显示表信息,方便查看
        14.hive>show tables in hive;    //显示hive下面所有的表

mysql创建用户;
 1.cmd窗口 Admin...>mysql -uroot -p  //回车然后输入密码
 2.mysql>create user hive@'%' IDENTIFIED BY '123456'; //没有@'%'不写默认localhost;%默认所有ip地址
 3.mysql>create database myhive;
 4.mysql>GRANT ALL PRIVILEGES ON *.* TO 'hive'@'%'; //赋予所有权限给hive如果只赋予myhive.* to hive,初始化元数据(/soft/hive/bin/schematool -initSchema -dbType mysql)会失败
 5.mysql>FLUSH PRIVILEGES; //刷新权限

        
mysql替换derby
    1.替换hive-site.xml中的参数
          <property>
            <name>javax.jdo.option.ConnectionDriverName</name>
            <value>com.mysql.jdbc.Driver</value>
          </property>
          <property>
            <name>javax.jdo.option.ConnectionURL</name>
            <value>jdbc:mysql://192.168.67.1:3306/myhive</value>
          </property>
          <property>
            <name>javax.jdo.option.ConnectionUserName</name>
            <value>hive</value>
          </property>
          <property>
            <name>javax.jdo.option.ConnectionPassword</name>
            <value>123456</value>
          </property>
    2.在mysql中创建hive表空间
        mysql>create database hive;
    3.将mysql驱动包放到hive安装目录下面
    4.重新初始化hive的schema元数据库
        $>/soft/hive/bin/schematool -initSchema -dbType mysql
        
代码连接数据库
    1.修改配置hive-site.xml
        hive.server2.enable.doAs=false
        hive.metastore.sasl.enabled=false
        hive.server2.authentication=false
        
    1.启动hiveserver2服务,接收多个客户端连接请求,使得client通过jdbc连接操作hive数据仓库
    $>/soft/hive/bin/hive --service hiveserver2 start; //启动服务器端,在客户端 ctrl+z放到后台,不过停止了,查看jobid号:jobs 。让其运行bg %jobid;
    $>netstat -ano | grep 10000;  //查看端口

托管表:hive创建的表默认都是托管表。hive控制其生命周期,删除托管表时,元数据和数据都会被删除
外部表:hive控制元数据,删除托管表时,数据不被删除。语句为
    hive>create external table hive.user like hive.employee;    //只复制表结构,不复制数据
    hive>create external table hive.user as select * from employee;    //即复制表结构又复制数据。
分区表:
    1.hive>create table test(id int,name string,age int) partitioned by (province string,city string);    //按照省份和城市分区
    2.hive>load data local inpath '/home/ubuntu/employee.txt' into table hive.test partition(province='hebei',city='baoding');    //插入分区表
    3.$>/usr/hive/warehouse/hive.db/test/province=hebei/city=baodi/employees.txt;    //对应的hdfs目录
    4.hive>select * from hive.test where province = 'hebei' and city = 'baoding';    //分区表查询
    5.区分严格模式和非严格模式,默认为费严格模式,严格模式查询必须写区分条件
        方式:$hive>set hive.mapred.mode=strict
    6.hive>show partition hive.test;    //        查看分区信息 show partition hive.test partitiong (province='hebei')
    7.alter table hive.test change column name t_name String after eid;    //修改字段
    8.alter table hive.test add column(xxx String);
桶表:
    hive>create table test(id int,name string,age int) clustered by(fieldName) into n buckets;
    hive>create table test(id int,name string,age int) clustered bu (age) into 3 buckets row format delimited fields terminated by '\t' lines terminated by '\n' stored as textfile;

导出数据到本地
    $hive>insert overwrite local directory '/home/hadoop/employee' select * from employee;
导出到hdfs文件系统
    insert overwrite directory 'hdfs://s100:8020/usr/hive/xxx' select * from employee;
    
*******合适hive可以避免MR操作*****
不是mr的job就是本地模式
1.全表扫描:没有where子句。
2.where子句作用只有分区字段,也不需要mr
    select * from test where province='hebei'
3.设置hive.exec.model.local.auto=true 该属性hive会尽量使用local模式查询
4.其余的所有查询都会转换成MR

hive查询优化
1.查询连接数据量的大小从左到右一次递增
2.使用/*streamtable(s)*/查询暗示
    select /* +streamtable(s)*/ * from test s inner join test1 t on s.id =  t.cid

1.左半连接,select和where子句不能引用右边表字段
2.左表的记录在右表中一旦找到对应的记录,右侧表即停止扫描,效率比左连接要高效,但是数据不全
$>select c.id ,c.name from employee c left semi join orders o on c.id = o.eid
                
--排序
order by 全排序,对所有数据通过一个reduce进行排序
如果开启了hive.mapred.mode=strict,在排序时必须结合limit使用,现在推荐使用hive.strict.checks.*属性
hive>select * from orders by cid asc ,price desc;

sort by 每个reduce进行排序(局部排序)
hive>select * from orders sort by cid asc ,price desc;

distribute by 等价于自定义分区函数,把对应相同的值分到一个reduce中进行排序
hive>select * from orders distribute by cid, sort by price desc;

hive没有key(primary key和auto_increment)
创建索引 DEFERRED REBUILD该选项时,索引为空白,需要rebulit才能够初始化
hive>create index idx_employee_id on table employee(eid) as 'org.apache.hadoop.hive.ql.indexpact.CompactIndexHandler' WITH DEFERRED REBUILD IDXPROPERTIES
('creator'='me') IN TABLE empoyee_idx comment '员工索引'; //org.apache.hadoop.hive.ql.indexpact.CompactIndexHandler 索引解释器 empoyee_idx索引表名称

hive>create index idx_employee_id on table employee(eid) as 'org.apache.hadoop.hive.ql.indexpact.CompactIndexHandler' WITH DEFERRED REBUILD IN TABLE empoyee_idx comment '员工索引';

hive>alter index idx_employee_id on employee rebuild;  --重建索引(hdfs文件系统中的一个文件夹)

调优
-----------------------
1.explain:解释执行计划
    hive>explain select sum(age) from test;
    hive>explain extends select sum(age) from test; -- 更加详细信息
2.启用limit调优,避免全表扫描,使用抽样机制
    hive.limit.optimize.enable=true
3.join: 
    1.连接查询表的大小是从左至右依次增长
    2.使用map端连接(/*+ streamtable(table)*/)
4.设置本地模式:在单台机器上执行所有任务,适用于较小数据情况
    hive>set hive.exec.mode.local.auto=true  //默认false
    hive>set mapreduce.framework.name=local 
5.并行执行job:如果job之间没有依赖关系,可以并发执行,缩短执行时间
    hive>set hive.exec.parallel=true    //默认为false
    
    
        

对分区进行归档(只能对内部分区表进行归档,外部表不可以)
--------------------------------------
1.启用hive进行归档
    hive> set hive.archive.enable=true    //是否允许进行归档
2.对标的指定分区进行归档
    hive>alter table test3 archive partition(province='hebei',city='baoding')
注意:运行时缺少hadoopArchive.class类,查看日志/tmp/centos/hive/hive/log可见    具体看你安装的地方
    复制${hadoop_home}/shared/hadoop/tools/hadoop-archive-xxx.jar /hive/auxlib/        //如果没有auxlib目录可手工创建
    复制${hadoop_home}/shared/hadoop/tools/hadoop-archive-xxx.jar /hive/lib/        //如果上述不生效,就移动到这个目录

函数
-----------------------------------------

                
                
        
                
                
                
                
                
                

更多推荐

centos笔记

本文发布于:2023-04-13 15:31:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/ef38e40899b22d258f40ed6dfc1f4d58.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:笔记   centos

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!

  • 72998文章数
  • 14阅读数
  • 0评论数