
清华大学硕士研究生,专注于云计算、大数据和Docker容器技术,参与多个军工保密单位和国家级课题的研究,拥有丰富的教学讲解经验,出品多套系列课程,课程生动形象,风格通俗易懂。
虚拟机软件:VMware Workstaion12 操作系统:Ubuntu14.04 1、修改Ubuntu14.04的apt源为国内的阿里源: cp /etc/apt/sources.list /etc/apt/sources.list.back vi /etc/apt/sources.list deb http://mirrors.aliyun.com/ubuntu/ raring main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ raring-security main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ raring-updates main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ raring-proposed main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ raring-backports main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ raring main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ raring-security main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ raring-updates main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ raring-proposed main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ raring-backports main restricted universe multiverse 注:若出现:W: Unknown Multi-Arch type 'no' for package 'compiz-core'则说明ubuntu版本与apt版本不匹配,所以升级一下apt版本就行 apt-get install -f apt 配置DNS服务器: vi /etc/resolv.conf nameserver 8.8.8.8 nameserver 8.8.4.4 更新软件源和软件: apt-get update apt-get upgrade 2、配置网络接口: vim /etc/network/interfaces auto ens33 iface ens33 inet static address 192.168.213.131 netmask 255.255.255.0 gateway 192.168.213.2 dns-nameserver 192.168.213.2 3、安装pip并修改pip源: apt-get install python-pip mkdir ~/.pip vi ~/.pip/pip.conf 添加 [global] index-url = http://pypi.douban.com/simple/ trusted-host = pypi.douban.com 4、安装git: apt-get install git 5、下载Devstack: git clone http://git.trystack.cn/openstack-dev/devstack.git -b stable/ocata 6、创建stack用户: devstack/tools/create-stack-user.sh mv devstack /opt/stack chown -R stack:stack /opt/stack/devstack 7、切换到stack用户并修改pip源: su stack mkdir ~/.pip vi ~/.pip/pip.conf 添加 [global] index-url = http://pypi.douban.com/simple/ trusted-host = pypi.douban.com 8、设置Devstack配置文件: cd /opt/stack/devstack vi local.conf [[local|localrc]] # Credentials ADMIN_PASSWORD=admin MYSQL_PASSWORD=secret RABBIT_PASSWORD=secret SERVICE_PASSWORD=secret SERVICE_TOKEN=abcdefghijklmnopqrstuvwxyz # use TryStack git mirror GIT_BASE=http://git.trystack.cn NOVNC_REPO=http://git.trystack.cn/kanaka/noVNC.git SPICE_REPO=http://git.trystack.cn/git/spice/spice-html5.git HOST_IP=192.168.213.131 # Define images to be automatically downloaded during the DevStack built process. DOWNLOAD_DEFAULT_IMAGES=False IMAGE_URLS=http://download.cirros-cloud.net/0.3.4/cirros-0.3.4-x86_64-disk.img # only support IP v4 SERVICE_IP_VERSION=4 # only support keystone v2 ENABLE_IDENTITY_V2=True #not create default network NEUTRON_CREATE_INITIAL_NETWORKS=False # instead of default network FLOATING_RANGE="192.168.213.0/24" FIXED_RANGE="10.0.0.0/24" Q_FLOATING_ALLOCATION_POOL=start=192.168.213.132,end=192.168.213.150 PUBLIC_NETWORK_GATEWAY="192.168.213.2" # Branches KEYSTONE_BRANCH=stable/ocata NOVA_BRANCH=stable/ocata NEUTRON_BRANCH=stable/ocata SWIFT_BRANCH=stable/ocata GLANCE_BRANCH=stable/ocata CINDER_BRANCH=stable/ocata # Enabling Neutron (network) Service disable_service n-net enable_service q-svc enable_service q-agt enable_service q-dhcp enable_service q-l3 enable_service q-meta enable_service q-metering enable_service neutron # VLAN configuration. Q_PLUGIN=ml2 ENABLE_TENANT_VLANS=True TENANT_VLAN_RANGE=1100:2999 #Logging LOGFILE=/opt/stack/logs/stack.sh.log VERBOSE=True LOG_COLOR=True SCREEN_LOGDIR=/opt/stack/logs # Work offline #OFFLINE=True # Reclone each time RECLONE=no 9、开始部署: ./stack.sh 若安装失败,则执行./unstack.sh脚本和./clean.sh脚本,并重复上一步骤。 本文为博主原创文章,未经允许不得转载。转载请注明出处:https://www.cnblogs.com/lijinze-tsinghua/
今天查看了一下自己电脑里的ubuntu14.04系统,发现无法上网,于是ping了一下百度,出现unknown host,查了一下/etc/resolv.conf中的DNS地址,却发现我之前的修改被清空了: 继续在该文件上添加DNS配置信息: nameserver 114.114.114.114 nameserver 8.8.8.8 nameserver 8.8.4.4 重启系统,再打开DNS配置文件,发现之前的添加“诡异”的消失了。 在网上浏览了大量的博客,找到了两个解决办法: 方法一: 在/etc/resolvconf/resolv.conf.d/base文件中添加DNS服务器地址: vim /etc/resolvconf/resolv.conf.d/base nameserver 114.114.114.114 nameserver 8.8.8.8 nameserver 8.8.4.4 方法二: 直接将DNS服务器地址写入/etc/network/interfaces中: 在该文件中加入 dns-nameservers 114.114.114.114 8.8.8.8 8.8.4.4 通过以上两种方法都可以将DNS服务器地址永久添加进/etc/resolv.conf文件中,不会再诡异消失了。 本文为博主原创文章,未经允许不得转载。转载请注明出处:https://www.cnblogs.com/lijinze-tsinghua/
1、安装Chrome浏览器 wget http://www.linuxidc.com/files/repo/google-chrome.list -P /etc/apt/sources.list.d/ wget -q -O - https://dl.google.com/linux/linux_signing_key.pub | sudo apt-key add - apt-get updateapt-get install google-chrome-stable 2、启动Chrome浏览器 google-chrome 这时会报错: [31560:31560:0207/085601.085852:ERROR:zygote_host_impl_linux.cc(90)] Running as root without --no-sandbox is not supported. See https://crbug.com/638180. google-chrome --no-sandbox 仍会报错: root@node00:~# [0207/085735.495265:ERROR:nacl_helper_linux.cc(310)] NaCl helper process running without a sandbox!Most likely you need to configure your SUID sandbox correctly whereis google-chrome google-chrome: /usr/bin/X11/google-chrome /usr/share/man/man1/google-chrome.1.gz vim /usr/bin/X11/google-chrome 将 exec -a "$0" "$HERE/chrome" "$@" 改为 exec -a "$0" "$HERE/chrome" "$@" --user-data-dir --no-sandbox 以后就可以在ubuntu系统中正常打开Chrome了。
一、安装HBase: 我这里选择的是hbase-1.3.1-bin.tar.gz版本解压HBase: tar -zxvf hbase-1.3.1-bin.tar.gz -C ~/training 配置HBase的环境变量: export HBASE_HOME=/root/training/hbase-1.3.1 export PATH=$HBASE_HOME/bin:$PATH 生效环境变量: source ~/.bash_profile 二、HBase的安装模式: 1、本地模式: 特点:只有HMaster ,没有Hregionserver 修改两个配置文件: 1)hbase-env.sh export JAVA_HOME=/root/training/jdk1.8.0_144 2)hbase-site.xml <configuration> <!--配置HBase在本地磁盘中数据存放路径--> <property> <name>hbase.rootdir</name> <value>file:///root/training/hbase-1.3.1/data</value> </property> </configuration> 2、伪分布式模式: 特点:具备HBase的所有功能 修改两个配置文件: 1)hbase-env.sh 添加java环境变量: export JAVA_HOME=/root/training/jdk1.8.0_144 配置HBase管理Zookeeper的方式: HBASE_MANAGES_ZK=true 注:默认使用HBase自带的一个zookeeper 2)hbase-site.xml <property> <name>hbase.rootdir</name> <value>hdfs://bigdata11:9000/hbase</value> </property> <!--配置HBase在HDFS中数据备份的个数--> <property> <name>dfs.replication</name> <value>1</value> </property> <!--配置HBase集群分布式模式--> <property> <name>hbase.cluster.distributed</name> <value>true</value> </property> <!--配置HBase的zookeeper地址--> <property> <name>hbase.zookeeper.quorum</name> <value>localhost</value> <!--配置HBase的zookeeper数据存放路径--> <property> <name>hbase.zookeeper.property.dataDir</name> <value>/home/zk</value> </property> 3、全分布式模式: 特点:至少三台机器以上 原因:主从架构 修改三个配置文件: 1)hbase-env.sh 添加java环境变量: export JAVA_HOME=/root/training/jdk1.8.0_144 配置HBase管理Zookeeper的方式: HBASE_MANAGES_ZK=true 注:默认使用HBase自带的一个zookeeper 2)hbase-site.xml <!--配置HBase在HDFS中数据存放路径--> <property> <name>hbase.rootdir</name> <value>hdfs://bigdata12:9000/hbase</value> </property> <!--配置HBase在HDFS中数据备份的个数--> <property> <name>dfs.replication</name> <value>2</value> </property> <!--配置HBase集群分布式模式--> <property> <name>hbase.cluster.distributed</name> <value>true</value> </property> <!--配置HBase的zookeeper地址--> <property> <name>hbase.zookeeper.quorum</name> <value>bigdata12</value> </property> <!--配置HBase主节点最大时钟偏离--> <property> <name>hbase.master.maxclockskew</name> <value>180000</value> </property> 3)slaves:配置从节点的地址 bigdata13 bigdata14 4、HA模式: 特点:添加一个新的HMaster HA的思想:多几个主节点 在HBase的全分布式模式安装完成以后,再在某一个从节点上:bigdata13/bigdata14手动启动一个Hmaster hbase-daemon.sh start master 三、操作HBase: hbase shell:Hbase的命令行工具:一种客户端 创建HBase表: create 'students','info','grade' 添加数据: put 'students','stu001','info:name','Tom' put 'students','stu001','info:age','18' put 'students','stu001','info:gender','M' put 'students','stu002','info:name','Mary' put 'students','stu002','info:boy friend','Peter' 查看stu001的所有信息: get 'students','stu001' 版权声明:本文为博主原创文章,未经博主允许不得转载。http://www.cnblogs.com/lijinze-tsinghua/
一、集群的规划 Zookeeper集群: 192.168.182.12 (bigdata12)192.168.182.13 (bigdata13)192.168.182.14 (bigdata14) Hadoop集群: 192.168.182.12 (bigdata12) NameNode1主节点 ResourceManager1主节点 Journalnode192.168.182.13 (bigdata13) NameNode2备用主节点 ResourceManager2备用主节点 Journalnode192.168.182.14 (bigdata14) DataNode1 NodeManager1192.168.182.15 (bigdata15) DataNode2 NodeManager2 二、准备工作 1、安装JDK:每台机器都需要安装 我这里使用的是jdk-8u152-linux-x64.tar.gz安装包 解压JDK: tar -zxvf jdk-8u144-linux-x64.tar.gz -C ~/training 2、配置环境变量: 1)配置java环境变量: vi ~/.bash_profile export JAVA_HOME=/root/training/jdk1.8.0_144 export PATH=$JAVA_HOME/bin:$PATH 2)生效环境变量: source ~/.bash_profile 3)验证是否安装成功: java -version 3、配置IP地址与主机名的映射关系 原因:方便SSH调用 方便Ping通 vi /etc/hosts 输入: 192.168.182.13 bigdata13 192.168.182.14 bigdata14 192.168.182.15 bigdata15 4、配置免密码登录 1)在每台机器上产生公钥和私钥 ssh-keygen -t rsa 含义:通过ssh协议采用非对称加密算法的rsa算法生成一组密钥对:公钥和私钥 2)在每台机器上将自己的公钥复制给其他机器 注:以下四个命令需要在每台机器上都运行一遍 ssh-copy-id -i .ssh/id_rsa.pub root@bigdata12 ssh-copy-id -i .ssh/id_rsa.pub root@bigdata13 ssh-copy-id -i .ssh/id_rsa.pub root@bigdata14 ssh-copy-id -i .ssh/id_rsa.pub root@bigdata15 三、安装Zookeeper集群(在bigdata12上安装) 在主节点(bigdata12)上安装和配置ZooKeeper 我这里使用的是zookeeper-3.4.10.tar.gz安装 1、解压Zookeeper: tar -zxvf zookeeper-3.4.10.tar.gz -C ~/training 2、配置和生效环境变量: export ZOOKEEPER_HOME=/root/training/zookeeper-3.4.10 export PATH=$ZOOKEEPER_HOME/bin:$PATH source ~/.bash_profile 3、修改zoo.cfg配置文件: vi /root/training/zookeeper-3.4.10/conf/zoo.cfg 修改: dataDir=/root/training/zookeeper-3.4.10/tmp 在最后一行添加: server.1=bigdata12:2888:3888 server.2=bigdata13:2888:3888 server.3=bigdata14:2888:3888 4、修改myid配置文件 在/root/training/zookeeper-3.4.10/tmp目录下创建一个myid的空文件: mkdir /root/training/zookeeper-3.4.10/tmp/myid echo 1 > /root/training/zookeeper-3.4.10/tmp/myid 5、将配置好的zookeeper拷贝到其他节点,同时修改各自的myid文件 scp -r /root/training/zookeeper-3.4.10/ bigdata13:/root/training scp -r /root/training/zookeeper-3.4.10/ bigdata14:/root/training 进入bigdata13和bigdata14两台机器中,找到myid文件,将其中的1分别修改为2和3: vi myid 在bigdata13中输入:2在bigdata14中输入:3 四、安装Hadoop集群(在bigdata12上安装) 1、修改hadoop-env.sh export JAVA_HOME=/root/training/jdk1.8.0_144 2、修改core-site.xml <configuration> <!-- 指定hdfs的nameservice为ns1 --> <property> <name>fs.defaultFS</name> <value>hdfs://ns1</value> </property> <!-- 指定HDFS数据存放路径,默认存放在linux的/tmp目录中 --> <property> <name>hadoop.tmp.dir</name> <value>/root/training/hadoop-2.7.3/tmp</value> </property> <!-- 指定zookeeper的地址 --> <property> <name>ha.zookeeper.quorum</name> <value>bigdata12:2181,bigdata13:2181,bigdata14:2181</value> </property> </configuration> 3、修改hdfs-site.xml(配置这个nameservice中有几个namenode) <configuration> <!--指定hdfs的nameservice为ns1,需要和core-site.xml中的保持一致 --> <property> <name>dfs.nameservices</name> <value>ns1</value> </property> <!-- ns1下面有两个NameNode,分别是nn1,nn2 --> <property> <name>dfs.ha.namenodes.ns1</name> <value>nn1,nn2</value> </property> <!-- nn1的RPC通信地址 --> <property> <name>dfs.namenode.rpc-address.ns1.nn1</name> <value>bigdata12:9000</value> </property> <!-- nn1的http通信地址 --> <property> <name>dfs.namenode.http-address.ns1.nn1</name> <value>bigdata12:50070</value> </property> <!-- nn2的RPC通信地址 --> <property> <name>dfs.namenode.rpc-address.ns1.nn2</name> <value>bigdata13:9000</value> </property> <!-- nn2的http通信地址 --> <property> <name>dfs.namenode.http-address.ns1.nn2</name> <value>bigdata13:50070</value> </property> <!-- 指定NameNode的日志在JournalNode上的存放位置 --> <property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://bigdata12:8485;bigdata13:8485;/ns1</value> </property> <!-- 指定JournalNode在本地磁盘存放数据的位置 --> <property> <name>dfs.journalnode.edits.dir</name> <value>/root/training/hadoop-2.7.3/journal</value> </property> <!-- 开启NameNode失败自动切换 --> <property> <name>dfs.ha.automatic-failover.enabled</name> <value>true</value> </property> <!-- 配置失败自动切换实现方式 --> <property> <name>dfs.client.failover.proxy.provider.ns1</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> </property> <!-- 配置隔离机制方法,多个机制用换行分割,即每个机制暂用一行--> <property> <name>dfs.ha.fencing.methods</name> <value> sshfence shell(/bin/true) </value> </property> <!-- 使用sshfence隔离机制时需要ssh免登陆 --> <property> <name>dfs.ha.fencing.ssh.private-key-files</name> <value>/root/.ssh/id_rsa</value> </property> <!-- 配置sshfence隔离机制超时时间 --> <property> <name>dfs.ha.fencing.ssh.connect-timeout</name> <value>30000</value> </property> </configuration> 4、修改mapred-site.xml <configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration> 配置Yarn的HA 5、修改yarn-site.xml <configuration> <!-- 开启RM高可靠 --> <property> <name>yarn.resourcemanager.ha.enabled</name> <value>true</value> </property> <!-- 指定RM的cluster id --> <property> <name>yarn.resourcemanager.cluster-id</name> <value>yrc</value> </property> <!-- 指定RM的名字 --> <property> <name>yarn.resourcemanager.ha.rm-ids</name> <value>rm1,rm2</value> </property> <!-- 分别指定RM的地址 --> <property> <name>yarn.resourcemanager.hostname.rm1</name> <value>bigdata12</value> </property> <property> <name>yarn.resourcemanager.hostname.rm2</name> <value>bigdata13</value> </property> <!-- 指定zk集群地址 --> <property> <name>yarn.resourcemanager.zk-address</name> <value>bigdata12:2181,bigdata13:2181,bigdata14:2181</value> </property> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> </configuration> 6、修改slaves 从节点的地址 bigdata14 bigdata15 7、将配置好的hadoop拷贝到其他节点 scp -r /root/training/hadoop-2.7.3/ root@bigdata13:/root/training/ scp -r /root/training/hadoop-2.7.3/ root@bigdata14:/root/training/ scp -r /root/training/hadoop-2.7.3/ root@bigdata15:/root/training/ 五、启动Zookeeper集群 在每一台机器上输入: zkServer.sh start 六、启动journalnode 在bigdata12和bigdata13两台节点上启动journalnode节点: hadoop-daemon.sh start journalnode 七、格式化HDFS和Zookeeper(在bigdata12上执行) 格式化HDFS: hdfs namenode -format 将/root/training/hadoop-2.7.3/tmp拷贝到bigdata13的/root/training/hadoop-2.7.3/tmp下 scp -r dfs/ root@bigdata13:/root/training/hadoop-2.7.3/tmp 格式化zookeeper: hdfs zkfc -formatZK 日志:INFO ha.ActiveStandbyElector: Successfully created /hadoop-ha/ns1 in ZK. 以上日志表明在Zookeeper的文件系统中创建了/hadoop-ha/ns1的子目录用于保存Namenode的结构信息 八、启动Hadoop集群(在bigdata12上执行) 启动Hadoop集群的命令: start-all.sh 日志: Starting namenodes on [bigdata12 bigdata13] bigdata12: starting namenode, logging to /root/training/hadoop-2.4.1/logs/hadoop-root-namenode-hadoop113.out bigdata13: starting namenode, logging to /root/training/hadoop-2.4.1/logs/hadoop-root-namenode-hadoop112.out bigdata14: starting datanode, logging to /root/training/hadoop-2.4.1/logs/hadoop-root-datanode-hadoop115.out bigdata15: starting datanode, logging to /root/training/hadoop-2.4.1/logs/hadoop-root-datanode-hadoop114.out bigdata13: starting zkfc, logging to /root/training/hadoop-2.7.3/logs/hadoop-root-zkfc- bigdata13.out bigdata12: starting zkfc, logging to /root/training/hadoop-2.7.3/logs/hadoop-root-zkfc-bigdata12.out 在bigdata13上手动启动ResourceManager作为Yarn的备用主节点: yarn-daemon.sh start resourcemanager 至此,Hadoop集群的HA架构就已经搭建成功。 版权声明:本文为博主原创文章, 未经博主允许不得转载。http://www.cnblogs.com/lijinze-tsinghua/
今天搞了半天shipyard,在网页上打开时无法显示容器和镜像,最后发现是docker端口映射错误,由于防火墙未关闭: 4月 12 18:51:29 localhost firewalld[757]: 2018-04-12 18:51:29 ERROR: COMMAND_FAILED: '/sbin/iptables -t nat -C POSTROUTING -p tcp -s 172.17.0.7 -d 172.17.0.7 --dport 8080 -j MASQUERADE' faile... by that name.4月 12 18:51:30 localhost firewalld[757]: 2018-04-12 18:51:30 ERROR: COMMAND_FAILED: '/sbin/iptables -t nat -C DOCKER -p tcp -d 0/0 --dport 8079 -j DNAT --to-destination 172.17.0.7:8080 ! -i ... by that name.4月 12 18:51:30 localhost firewalld[757]: 2018-04-12 18:51:30 ERROR: COMMAND_FAILED: '/sbin/iptables -t filter -C DOCKER ! -i docker0 -o docker0 -p tcp -d 172.17.0.7 --dport 8080 -j ACCEPT' f... that chain?).4月 12 18:51:30 localhost firewalld[757]: 2018-04-12 18:51:30 ERROR: COMMAND_FAILED: '/sbin/iptables -t nat -C POSTROUTING -p tcp -s 172.17.0.7 -d 172.17.0.7 --dport 8080 -j MASQUERADE' faile... by that name.4月 12 18:51:31 localhost firewalld[757]: 2018-04-12 18:51:31 ERROR: COMMAND_FAILED: '/sbin/iptables -t nat -C DOCKER -p tcp -d 0/0 --dport 8079 -j DNAT --to-destination 172.17.0.7:8080 ! -i ... by that name.4月 12 18:51:31 localhost firewalld[757]: 2018-04-12 18:51:31 ERROR: COMMAND_FAILED: '/sbin/iptables -t filter -C DOCKER ! -i docker0 -o docker0 -p tcp -d 172.17.0.7 --dport 8080 -j ACCEPT' f... that chain?).4月 12 18:51:31 localhost firewalld[757]: 2018-04-12 18:51:31 ERROR: COMMAND_FAILED: '/sbin/iptables -t nat -C POSTROUTING -p tcp -s 172.17.0.7 -d 172.17.0.7 --dport 8080 -j MASQUERADE' faile... by that name.4月 12 18:51:32 localhost firewalld[757]: 2018-04-12 18:51:32 ERROR: COMMAND_FAILED: '/sbin/iptables -t nat -C DOCKER -p tcp -d 0/0 --dport 8079 -j DNAT --to-destination 172.17.0.7:8080 ! -i ... by that name.4月 12 18:51:32 localhost firewalld[757]: 2018-04-12 18:51:32 ERROR: COMMAND_FAILED: '/sbin/iptables -t filter -C DOCKER ! -i docker0 -o docker0 -p tcp -d 172.17.0.7 --dport 8080 -j ACCEPT' f... that chain?).4月 12 18:51:32 localhost firewalld[757]: 2018-04-12 18:51:32 ERROR: COMMAND_FAILED: '/sbin/iptables -t nat -C POSTROUTING -p tcp -s 172.17.0.7 -d 172.17.0.7 --dport 8080 -j MASQUERADE' faile... by that name. 解决方法:关闭防火墙即可 systemctl stop firewalld
欢迎关注大数据和人工智能技术文章发布的微信公众号:清研学堂,在这里你可以学到夜白(作者笔名)精心整理的笔记,让我们每天进步一点点,让优秀成为一种习惯! 在搭建好Hadoop集群之后,所有服务均可正常启动,但是在运行MapReduce程序的时候,发现任务卡在7/09/07 22:28:14 INFO mapreduce.Job: Running job: job_1504781778966_0003,不再往下执行了,经过检查,发现所有的nodes节点都处于unhealthy的状态,使用命令查看node 的状态 bin/yarn node -list -all 查看日志发现 2015-07-16 15:28:58,643 WARN org.apache.hadoop.yarn.server.nodemanager.DirectoryCollection: Directory /opt/beh/data/yarn/nmlocal error, used space above threshold of 90.0%, removing from list of valid directories 2015-07-16 15:28:58,645 WARN org.apache.hadoop.yarn.server.nodemanager.DirectoryCollection: Directory /opt/beh/logs/yarn/nmlogs error, used space above threshold of 90.0%, removing from list of valid directories 2015-07-16 15:28:58,645 INFO org.apache.hadoop.yarn.server.nodemanager.LocalDirsHandlerService: Disk(s) failed: 1/1 local-dirs are bad: /opt/beh/data/yarn/nmlocal; 1/1 log-dirs are bad: /opt/beh/logs/yarn/nmlogs 2015-07-16 15:28:58,645 ERROR org.apache.hadoop.yarn.server.nodemanager.LocalDirsHandlerService: Most of the disks failed. 1/1 local-dirs are bad: /opt/beh/data/yarn/nmlocal; 1/1 log-dirs are bad: /opt/beh/logs/yarn/nmlogs 是node的内存不足导致的! 解决方法 * 1 把节点上的不用的东西删完,删到90%以下即可 * 2 在yarn-site.xml中添加以下配置信息,修改上限和下限 <property> <name>yarn.nodemanager.disk-health-checker.min-healthy-disks</name> <value>0.0</value> </property> <property> <name>yarn.nodemanager.disk-health-checker.max-disk-utilization-per-disk-percentage</name> <value>100.0</value> </property> 再重启服务 问题解决
欢迎关注大数据和人工智能技术文章发布的微信公众号:清研学堂,在这里你可以学到夜白(作者笔名)精心整理的笔记,让我们每天进步一点点,让优秀成为一种习惯! 今天在我的ubuntu系统上使用yum来安装软件时出错了错误:Transaction Check Error:file /usr/libexec/getconf/default conflicts between attempted installs of gcc-6.4.1-1.fc25.i686 and gcc-6.4.1-1.fc25.x86_64 根据提示得知是由于两个gcc文件冲突,查看repos.d目录下发现是fedora启用了多个源,这个源就相当于下载软件的仓库,当系统同时启用两个源时,下载下来的软件就有可能出现文件冲突,所以只保留一个源即可。 具体方法为先切换到 /etc/yum.repos.d/目录下,命令cd /etc/yum.repos.d/ ,此目录下的文件即是源文件,使用vi打开某一源文件,将某一行的enable=1,改为enable=0,及成功禁用源。 完整示例: cd /etc/yum.repos.d/ vi fedora-updates.repo enable=0 喜欢就请关注我的公众号:清研学堂,我会持续更新技术类有深度的文章~
欢迎关注大数据和人工智能技术文章发布的微信公众号:清研学堂,在这里你可以学到夜白(作者笔名)精心整理的笔记,让我们每天进步一点点,让优秀成为一种习惯! 阅读目录 了解自己机器上的 X Window 理解 display 和虚拟控制台 远程连接 X Server 理解 lightdm 和 X Window 桌面环境的启动过程 搞定 xauth X Server 的配置 现有的图形界面中可以运行嵌套的 X Server 总结: 大名鼎鼎的 X Window 大家肯定不陌生。都知道它是 Unix/Linux 下面的窗口系统,也都知道它基于 Server/Clinet 架构。在网上随便搜一搜,也可以找到不少 X Window 的介绍。有不少文章为了给用户留一个直观的印象,往往先让系统进入纯文本界面,然后使用 startx 来启动图形界面,或者直接使用 X 来启动 X Server,再然后运行一个 xterm 来做示范。我觉得以上这些文章对 X Window 的理解有限,不够深入,而且也不够新。所以,我这里写一篇《X Window 的奥秘》,以最新的 Ubuntu-14.04 Desktop 为例,展示如何学习 X Window。 先说一点题外话。在上一篇《打造属于自己的Vim》发表后,评论中有人让共享一下配置文件。当时我说:配置文件又不长,自己照着图片敲一下代码嘛。结果这个“照着图片敲代码”的事情我今天自己干了一遍,好在没花多少时间,几分钟而已。原因是因为我今天折腾 X Window 的时候,把系统给挂掉了,然后重装系统,然后,就只好再设置一遍 Vim 了。 回到顶部 了解自己机器上的 X Window X Window 其实是一种规范,它有很多不同的实现,在 Linux 系统下最流行的是实现 Xorg 和 XFree86,微软 Windows 系统下也有 X Window 的实现,苹果的Mac 也是 X Window 的一种。要了解自己机器上运行的 X Window 究竟是哪一个,可以使用查看进程的ps命令,如下图: 从上图可以看出,Ubuntu 14.04 使用的 X Window 是 Xorg。如果使用 ps -ef 命令,还可以看到 Xorg 运行时的命令行参数。 想了解 X Window,下面这些文档需要看一遍先: 下面来说一下也许是众所周知的基础知识:X Window 是一个分层的架构,它分为 Serve 和 Client。X Server 负责图形界面的显示,(也负责用户的输入),而Client 程序需要连接到 X Server,然后请求 X Server 绘制图形界面,同时从 X Server 接受用户的输入。在桌面系统上,X Server 和 Client 程序往往安装在同一台机器上,日常使用基本感觉不到它是分层的。但是很显然,X Server 和 Client 也可以分别运行在不同的机器上,在一台机器上运行程序,而在另外一台机器上显示图形界面。 X Window 中的 Server 和 Client 的概念和我们平时接触到的“Server/Client”概念刚好相反。很多熟悉 Internet 原理的人,第一次接触 X Window 的这两个概念都会搞错。比如,我在一台本地机器上运行 Ubuntu 14.04 桌面版,而在另外一台远程机器上运行 CentOS 5.10(纯字符界面),当我用 ssh 从 Ubuntu 连接到 CentOS 的时候,Ubuntu 是 Client,而 CentOS 是 Server。在 X Window 中,Server 偏偏是我面前的这台 Ubuntu,X Server 运行在 Ubuntu 上。我可以在 CentOS 中运行 GVim,但是窗口显示在 Ubuntu 中,这时,GVim 是一个 Client 程序,它在远程机器上运行,而它的窗口显示在本地。 回到顶部 理解 display 和虚拟控制台 前面提到网上很多介绍 X Window 的文章都是先让系统进入字符界面,然后手动启动一个 X Server。其实这完全没有必要,因为在同一台机器上完全可以运行多个 X Server,只需要让每个 X Server 的 display 不同即可。那么 display 究竟是什么? 在 X Window 中,可以通过 hostname:display_number.screen_number 来指定一个屏幕。可以这样理解:一台计算机可以有多个 display,一个 display 可以有多个屏幕。所以,display 相当于是计算机配备的一套输入输出设备,一般情况下,一台电脑只配一套键盘鼠标和一个显示器,特殊情况下,可以配多个显示器。 现在问题出来了,我的电脑只有一套键盘鼠标和一个显示器,也就是只有一个 display,那又怎么能运行多个 X Server 呢?那是因为在 Linux 中,还有虚拟控制台这样的高级特性。只需要同时按下 Ctrl+Alt+F1、Ctrl+Alt+F2、...、Ctrl+Alt+F7,就可以在不同的虚拟控制台中进行切换。在 Ubuntu 14.04 中,虚拟控制台 1 到 6 运行的getty,也就是字符界面,虚拟控制台 7 运行的是 Xorg。(Fedora 中不一样,虚拟控制台 1 运行的是图形界面,其它的是字符界面。) 我们可以直接运行 X Server 程序来启动 X Server。/usr/bin/X 和 Xorg 都是 X Server 程序。其实 /usr/bin/X 是 Xorg 的符号链接,用哪一个都是一样的。 启动 X Server 的时候可以指定 display 参数,因为可以省略掉 hostname 和 screen_number,所以可以用 :0,:1 这样的格式来指定 display。在我的机器上,本来就有一个 X Server 在运行,display :0 已经被占用了,所以我使用 sudo X :1 -retro 来在 display :1 上再运行一个 X Server,如下图: 其中的 -retro 参数是为了让 X Server 的背景显示为斜纹,否则背景为纯黑色,那就看不出来是否启动了 X Server。启动 X Server 后的效果如下图: 按 Ctrl+Alt+F7 回到 display :0,再用 ps 命令看一下,会发现系统中有两个 Xorg 在运行,一个运行在虚拟控制台 7,一个运行在虚拟控制台 8。如下图: 在新启动的 X Server 中运行一个 GVim 看看效果。运行 GVim 时,使用 -display :1 参数指定窗口显示在新启动的 X Server 上,使用 -geometry 参数指定窗口的大小和位置。然后按 Ctrl+Alt+F8 切换虚拟控制台,看效果。命令见上图,程序运行效果见下图: 回到顶部 远程连接 X Server 如果能让远程机器上的 GVim 也把窗口显示在本地机器的屏幕上,那就比较过瘾了。所以,使用 ssh 连接到 CentOS-5.10,然后使用 gvim -display ubuntu-14:1 命令,希望将 GVim 显示到 Ubuntu 的 display :1 上。由于是远程连接,所以 hostname 不能省略,需写成 ubuntu-14:1,也可以使用 IP 地址,写成 192.168.1.103:1。如下图: 很可惜,连接失败。 失败的原因是远程访问 X Server 需要安全认证。这个可以理解,就像登陆邮箱需要输入用户名和密码一样,如果 X Server 不要认证就可以随便连接的话,那岂不是桌面上垃圾窗口满天飞?安全认证的方式有很多种,具体请参考 man Xsecurity。安全认证可以使用 xhost 和 xauth 这两个程序来进行,具体使用方法参考它们的文档。 先用 xhost 来授权,这个比较简单。为了运行 xhost,需要在 X Server 上有一个终端,所以运行一个 xterm,如下图: 在 xterm 中输入 sodu xhost +192.168.1.109,这样,CentOS-5.10 中运行的 GUI 程序都可以连接到这个新开启的 X Server 了。如下图: 在 CentOS-5.10 中运行 GVim,如下图: 窗口显示在 Ubuntu 中,如下图: 新启动的 X Server 界面比较丑陋,我们还是想让远程机器上的 GUI 程序直接显示在 Ubuntu 的桌面环境中。所以,指定 display 为 :0,如下图: 结果很不幸,无法打开 display。连接不上,为什么呢?是安全认证的问题吗?不是,是 lightdm 的问题,请继续往下看。 回到顶部 理解 lightdm 和 X Window 桌面环境的启动过程 X Server 的启动方式有两种,一种是通过显示管理器启动,另一种是手动启动。在前面的例子中,我通过直接运行 /usr/bin/X :1 来启动了一个 X Server。直接启动 X Server 的方法还有运行 startx 或者 xinit。手动启动 X Server 的缺点就是启动的 X Server 不好看。而显示管理器启动的不仅有 X Server,还有一大堆的 Client 程序,构成了一个完整的桌面环境,界面当然就漂亮多了。 显示管理器(Display Manager)是什么呢?前面我讲到 display 就是一个电脑配备的一套键盘鼠标和显示器,那么显示管理器就是这一套设备的管理器了。显示管理器可以直接管理这些设备,所以它可以控制 X Server 的运行,由它来启动 X Server 那是再合适不过了。系统启动过程是这样的:内核加载-->init程序运行-->显示管理器运行--> X Server 运行-->显示管理器连接到 X Server,显示登录界面-->用户登录后,登录界面关闭,加载桌面环境。从上面的流程可以看出,显示管理器是 X Server 的父进程,它负责启动 X Server,当 X Server 启动后,它又变成了 X Server 的一个 Client 程序,连接到 X Server 显示欢迎界面和登录界面,最后,显示管理器又是所有桌面环境的父进程,它负责启动桌面环境需要的其它 Client 程序。 在 Ubuntu 14.04 中,使用 lightdm 取代了传统的 xdm、gdm 等显示管理器。简单来说,就是由 lightdm 负责启动 X Server 和其它的 X 程序。不知道为什么,lightdm 在启动 X Server 的时候,给 X Server 加上了 -nolisten tcp 参数,所以远程计算机就没有办法连接到 Ubuntu 的桌面了。(从第 1 张图片可以看到该参数。) 下一步的目标就是更改 lightdm 的配置,去掉这个 -nolisten tcp 参数。不过要达成这个目标还真是艰难啊,我的系统挂掉然后重装就是在这里折腾出来的。在这里我要狠狠滴吐槽一下 freedesktop.org,在 X Window 所用的软件中,freedesktop.org 贡献很大,比如 lightdm、xft、fontconfig、freetype 都是这个组织贡献的,可是,你就不能把文档写详细点吗?不仅是 lightdm 的文档不行,xft、freetype 的文档也都不行。 lightdm 的 man page 非常简略,使用 sudo dpkg -L lightdm 也找不出该软件包中有价值的东西。没办法,另辟蹊径吧。在使用 sudo dpkg -L lightdm 查看该软件包的文件时,发现它的 log 文件放在 /var/log/lightdm 文件夹下,过去看看: 终于,从 log 文件中看到了 lightdm 启动的全过程。首先,看到它从哪几个目录加载配置文件,接着,看到它启动 X Server。从下图光标所在的行可以看到 X Server 启动的所有参数,包括 -nolisten tcp 选项。 继续看 log 文件,下面光标所在的行显示 lightdm 怎么启动 gnome-session: 同时,我发现 /etc/lightdm/ 目录下没有 lightdm.conf 文件,而 /usr/share/doc/lightdm/ 目录下有一个 lightdm.conf.gz 文件,把该文件当文档看了一下,发现里面果然就是 lightdm 的配置的解释。赶快将该文件复制到 /etc/lightdm/ 目录下并解压,如下图: 然后用 Vim 编辑 /etc/lightdm/lightdm.conf 文件,将 xserver-allow-tcp=false 一行前面的注释去掉,并且改为 xserver-allow-tcp=true。如下图: 最后,重启系统。再用 ps 查看进程,发现 -nolisten tcp 选项已经没有了。 回到顶部 搞定 xauth 搞定了 -nolisten tcp 之后,要想从远程计算接连接到 Ubuntu 桌面,还是需要安全认证。在前面的例子中,我使用了 xhost。xhost 是最简单的认证方式。在这里我要试一下别的认证方式,比如 MIT-MAGIC-COOKIE-1。如上图,先使用 xauth list 命令查看一下当前的授权记录,发现只有一条,而且 display 是 ubuntu-14/unix:0,很显然,这是一个本地授权,所以需要使用 xauth add 命令添加一个使用 ip 地址的授权,后面的 key 照抄就行了。最后,使用 xauth extract 和 xauth merge 配合管道和 ssh 将该授权记录合并到 CentOS-5.10 中。 在 CentOS-5.10 中启动 GVim,指定 display 为 192.168.1.103:0,GVim 窗口就出现在了 Ubuntu中。如下图: 回到顶部 X Server 的配置 可以使用不同的方法对 X Server 进行配置,前面的例子是直接指定命令行参数。除了指定命令行参数,还可以使用环境变量和配置文件。X Server 的配置文件为一般是 /etc/X11/xorg.conf 或 /etc/X11/xorg.conf.d/ 目录下的 .conf 文件,当然,配置文件也可以放在其它的目录中,具体信息,请参看 man xorg.conf。 如果没有配置文件,X Server 将在启动的时候自动检测硬件,然后生成一个内置的配置。Ubuntu 系统就没有配置文件。不过没关系,如果需要使用配置文件的时候,可以通过 X Server 的 -configure 参数生成一个配置文件,里面包含当前自动检测出的配置。如果需要任何个性化的配置,对该文件进行修改即可。 回到顶部 现有的图形界面中可以运行嵌套的 X Server 我们上面运行的 X Server 都是直接占用了计算机的整个显示器和键盘鼠标,事实上,在现有的图形界面中,还可以以窗口模式运行另外一个 X Server,称为 nested X Server。最常用的 nested X Server 是 Xephyr,在 Ubuntu 中可以通过如下命令安装它: sudo aptitude install xserver-xephyr Xephyr 的使用非常简单,可以通过 man Xephyr 命令查看它的使用手册。如果输入 Xephyr :1 命令,就可以在现有图形界面中打开一个窗口模式的 X Server,如下图: 以后再启动 GUI 程序,就可以通过程序的 -display 选项让程序运行在这个嵌套的 X Server 中,如下图: 怎么样,是不是很好玩呢?除了好玩,还很有用,比如调试窗口管理器啊、连接远程桌面啊什么的都用得着。当然,我这里只是简单展示一下原来 X Window 还可以这么玩。 回到顶部 总结: 1.在一个 Linux 系统中存在多个虚拟控制台,所以可以启动多个 X Server; 2.启动 X Server 的方式有两种,一种是使用 /usr/bin/X、startx、xinit 手动启动,一种是通过显示管理器启动; 3.Ubuntu 使用的显示管理器是 lightdm,这是一个比较新的、轻量级的显示管理器,但是文档不够详细; 4.远程计算机连接本地的 X Server,需要 X Server 开放 TCP 端口,还要搞定安全认证; 5.X Server 的配置,可以通过命令行参数,可以通过环境变量,还可以通过配置文件; 6.可以在现有的图形界面下以窗口模式运行嵌套的 X Server,常用的软件是 Xephyr;
欢迎关注大数据和人工智能技术文章发布的微信公众号:清研学堂,在这里你可以学到夜白(作者笔名)精心整理的笔记,让我们每天进步一点点,让优秀成为一种习惯! 继上周的“Kubernetes v1.0特性解析”分享之后,本周我们邀请到ThoughtWorks咨询师林帆为大家带来主题为“Docker运行GUI软件的方法”的分享。 嘉宾简介:林帆,ThoughtWorks咨询师,主要关注Docker与容器相关方向。 简介: Docker通过namespace将容器与主机上的网络和运行环境进行了隔离,默认情况下,在容器中运行带界面的软件在外部是看不到的。在这个分享中,将介绍通过共享X11套接字让外部主机显示容器中运行的程序界面的方法。并讨论在『运行本地的GUI程序』和『运行远程服务器上的GUI程序』两种场景的下的实现原理。 下文是本次的分享整理: Docker比较常用的场景是『运行无界面的后台服务』或者『运行基于的Web服务』。不过有时出于个人的喜好或特定的需求,我们会希望在Docker中运行带图形界面的应用程序。 比如,在今年的『Docker全球开发者大会』上,Docker自家的美女程序员『杰西·弗莱泽尔(Jessie Frazelle)』展示了一系列黑魔法一样的镜像。这些镜像中的大多数都使用了图形界面。 DaoCloud的孙宏亮在现场通过博客直播了她的演讲。看到这张照片很多人应该已经认出她了。 Jessie在自己的博客里介绍这些镜像时说,她十分欣赏苹果的Mac电脑中每个应用程序使用独立沙盒中运行的做法,这样避免了应用程序将配置文件和运行过程中生成的临时文件散乱的丢在系统各种目录中。Jessie现在的工作环境主要是Debian系统,出于这种喜好,她将自己常用的各种软件统统使用Docker容器化了。 将容器中的图形界面展示到外部的一般性思路。 目前Unix/Linux比较主流的图形界面服务是X11,而X11服务的图形显示方式实际上是一种Client/Server模式,在服务端和客户端之间,X11通过『DISPLAY』环境变量来指定将图形显示到何处。如下面的流程所示,请注意服务端与客户端的位置,服务端是用于提供显示信息的。 [应用程序]->[X11客户端]->[X11服务端]->[显示屏幕] DISPLAY的格式是『unix:端口』或『主机名:端口』,前一种格式表示使用本地的unix套接字,后一种表示使用tcp套接字。 默认情况下,X11的服务端会监听本地的『unit:0』端口,而DISPLAY的默认值为『:0』,这实际上是『unit:0』的简写。因此如果在Linux的控制台启动一个图形程序,它就会出现在当前主机的显示屏幕中。 基于这个原理,将Docker中的GUI程序显示到外面,就是通过某种方式把X11的客户端的内容从容器里面传递出来。基本的思路无非有两种: 通过SSH连接或远程控制软件,最终通过tcp套接字将数据发送出来 让容器和主机共享X11的unix套接字,直接将数据发送出来 从应用场景上划分,又可以分成两类情况:『运行本地的GUI程序』和『运行远程服务器上的GUI程序』。这两类情况在操作上很相似,但前者可以使用unix套接字,而后者必然要使用tcp套接字转发,原理上有很大差别。先说本地运行GUI程序的情况。 以Jessie在Docker开发者大会上做的第一个演示『LibreOffice』为例。这个镜像的Dockerfile代码和使用方法都已经开源在Github上了。 不知道有多少人实际测试过Jessie在博客或者Docker开发者大会上用过的例子,我相信其中应该有些人会发现,直接运行这些例子是行不通的。下面是我的运行环境: $ cat lsb-release DISTRIB_ID=Ubuntu DISTRIB_RELEASE=14.04 DISTRIB_CODENAME=trusty DISTRIB_DESCRIPTION="Ubuntu 14.04.2 LTS" $ docker --version Docker version 1.7.1, build 786b29d 这是一个全新的Ubuntu系统,仅仅添加了Docker等基本的软件。 在LibreOffice的Dockerfile注释里提供了运行方法: $ docker run -d \ -v /etc/localtime:/etc/localtime:ro \ -v /tmp/.X11-unix:/tmp/.X11-unix \ -e DISPLAY=unix$DISPLAY \ -v $HOME/slides:/root/slides \ -e GDK_SCALE \ -e GDK_DPI_SCALE \ --name libreoffice \ jess/libreoffice 其中的『-v /tmp/.X11-unix:/tmp/.X11-unix』参数就是将主机上X11的unix套接字共享到了容器里面。因为每个unix套接字实际上就是系统/tmp/.X11-unix目录下面依据套接字编号命名的一个特殊文件。 命令执行完,LibreOffice并没有启动。 好在刚刚已经说过这茬,所以还不算太意外。看一下日志: $ docker logs libreoffice No protocol specified Failed to open display javaldx: Could not find a Java Runtime Environment! Warning: failed to read path from javaldx No protocol specified No protocol specified No protocol specified No protocol specified 这是由于X11服务默认只允许『来自本地的用户』启动的图形程序将图形显示在当前屏幕上。对于Jessie的运行环境,她应该的已经修改了这个设置,但并没有在博客中提及。对于大多数的Linux用户来说,直接运行博客中的命令,都应该会遇到这个问题。 解决的办法很简单,允许所有用户访问X11服务即可。这个事情可以用xhost命令完成。 $ sudo apt-get install x11-xserver-utils $ xhost + 参数『+』表示允许任意来源的用户。 现在再次运行前面的docker run命令,就会看到LibreOffice启动起来了,速度相当快。由于是直接共享了X11的unix套接字,在效率上与运行安装在主机上的程序基本没有差异。 在远程服务器上用Docker运行GUI程序的情况。 这种情况多出现在将Docker作为产品测试环境使用的场景。利用Docker用后既消除的特点,能够快速的为每次测试提供干净的上下文环境。有时为了在非Linux系统中使用Linux的图形化软件,也可以通过远程Docker运行的方法实现。 此时,整个数据连接实际就变成了这样的: [应用程序]->[X11客户端]->[SSH服务端]->[SSH客户端]->[X11服务端]->[显示屏幕] 这种情况实际上已经演化成为了通过tcp套接字转发的X11连接,只不过用户并没有直接使用SSH连接到容器里面的tcp端口上,而是连接到了远程主机。相应的X11数据先从容器传递到了主机,再通过SSH通过传递到了用户的电脑上。 这就必须有要求用于展示的用后电脑安装有X11服务,大多数的Linux系统默认就具备了,Mac系统可以安装XQuartz软件,Windows则可以使用Xming等第三方X11服务端实现。首先将本地的X11服务运行起来。 其次,当用户使用SSH连接运行程序的服务器时,应该开启SSH的『X11-Forwarding』功能。具体来说,有两个注意点。 1)检测服务器上的/etc/ssh/sshd_config文件,是否已经有『X11Forwarding yes』这样的配置,如果没有则需要加上。 2)当连接到服务器时,应该在ssh命令后面加上-X参数,表示使用X11-Forwarding特性。 $ ssh -X <user>@<ip-addr> 登陆上去后运行刚才的docker run命令,并不能看到LibreOffice运行起来的迹象。通过log发现错误还是『Failed to open display』。在前面已经说过,对于远程连接运行GUI的情况,必然要换成tcp套接字的X11转发方式。而命令中的『-v /tmp/.X11-unix:/tmp/.X11-unix』参数仅仅是共享了unix套接字。那么怎样才能换成tcp套接字呢?需要修改两个地方: 1)首先为容器里面设置的环境变量『DISPLAY』,不能是『unix$DISPLAY』了 2)其次共享unix套接字可以不必了,而是要用『--net=host』让容器内的网络环境与主机共享 DISPLAY改成什么呢?首先要看SSH登陆后得到的系统DISPLAY变量值,我这里看到的是『localhost:10.0』,主机的localhost:10.0到了容器里面就要变成0.0.0.0:10.0。原因不解释了,这个是Docker默认添加的映射。 因此DISPLAY的值应该赋予『0.0.0.0:10.0』。可以简写为『:10.0』,X11会先去找unix:10.0,发现没有那个套接字文件,然后就会去试0.0.0.0:10.0。结果是一样的。修改过后的启动命令变成了: $ docker run -d \ -v /etc/localtime:/etc/localtime:ro \ --net=host \ -e DISPLAY=:10.0 \ -v $HOME/slides:/root/slides \ -e GDK_SCALE \ -e GDK_DPI_SCALE \ --name libreoffice \ jess/libreoffice 再次运行这个镜像,然而,依旧没有看到LibreOffice。查看Docker logs,这次的错误信息是: 『X11 connection rejected because of wrong authentication』。 这是因为在使用SSH通道转发X11时,会生成一个随机的授权cookie,存放在服务器的Xauthority文件中。这个cookie会在每次X11客户端发送数据时被用到。我们使用了『--net=host』参数后,容器中的X11客户端将直接通过tcp套接字与外部通信,然而容器里面并没有这个授权文件。因此我需要加上参数『-v $HOME/.Xauthority:/root/.Xauthority』把授权文件也放到容器里面。此外,启动命令中的两个GDK开头的环境变量在服务器端的Ubuntu上是不存在的,因此也可以删掉。 现在我们得到了最终的启动命令: $ docker run -d \ -v /etc/localtime:/etc/localtime:ro \ --net=host \ -e DISPLAY=:10.0 \ -v $HOME/slides:/root/slides \ -v $HOME/.Xauthority:/root/.Xauthority \ --name libreoffice \ jess/libreoffice 执行这个命令后,就看到LibreOffice已经在本地电脑的显示器上运行起来啦! 这个在Mac上看到的LibreOffice,程序本身运行在远程服务器的Docker里面。同样的方法也可以适应于Jessie的其他镜像。 Q&A: 问题1. X11是什么,与KDE有什么区别? 林帆:X11是Linux下面的界面显示服务。KDE是一种窗口管理软件,是具体的界面,X11是在更下面一层的协议层。 问题2. 在服务端运行GUI镜像时会收到网络的影响画面卡顿吗? 林帆:这个和网速关系比较大。 问题3. 通过这种gui方式,是不是可以做docker桌面云了? 林帆:不算是,因为这种做法需要SSH登录,其实有点不安全. 问题4. 可以多用户连接同一docker image不?就像remote desktop service一样? 林帆:用这种方式不能,SSH的X-Forwarding是单点的。 问题5. 可以考虑用xvfb吗? 林帆:原理上是可以的,不过这样就看不到运行的界面了。 问题6. 理论上讲,只要配置合理正确并且GUI支持X11,这种方式可以运行大部分linux下的gui应用? 林帆:是的,对于应用程序本身感觉不到图像是被现实到了本地还是远程的屏幕上 问题7. 请问在docker上运行的gui应用,应用间的互操作性如何保障?x11协议应该只能转发显示数据,无法转发实际数据(如电子表格中的数据,用以粘贴到其他打开的文档文件中),是否有其他协议可以保证互操作性? 林帆:目前看来互操作的话只能用其他协议代替X11了,比如VNC或者FreeNX。X11协议中,剪贴板的数据都是保存在X的客户端,两个远程窗口之间不能共享。
欢迎关注大数据和人工智能技术文章发布的微信公众号:清研学堂,在这里你可以学到夜白(作者笔名)精心整理的笔记,让我们每天进步一点点,让优秀成为一种习惯! putty下载: http://www.putty.org/ 一般我们远程登录linux 服务器,都是使用非加密的 telnet 或者加密的 ssh。这些登录方式有一个特点:只能登录字符界面,不能运行那些带有GUI界面的程序。 有时候为了学习或者工作的需要,我们需要远程打开有图形化界面的 linux application, 今天就给大家介绍一款软件:xming, 配合putty能够很好的完成我们的需求。 我们都知道,putty是一个用来远程登录 unix/linux 服务器的客户端,可以使用Telnet ssh等协议。 那么什么是xming? Xming is the leading X Window System Server for Microsoft Windows 8/7/Vista/XP (+ server 2012/2008/2003). It is fully featured, small and fast, simple to install and because it is standalone native Microsoft Windows, easily made portable (not needing a machine-specific installation). 简而言之,Xming 就是一个基于 c/s 架构的图形显示的x11 server,运行在你用来登录远程服务器的本地机器上。在刚开始的时候,我也很疑惑:既然是运行在本地,为什么是server,而不是client呢? Xming 显示的原理是每一个运行在远端服务器的图形化application 都是一个client,把要显示的图形数据通过 ssh发送给 运行在本地的 Xming server,然后由Xming server 负责显示。所以,从图形显示的角度来说,xming就是server。 一:Xming的安装 到sourceforge上下载:http://sourceforge.net/projects/xming/?source=typ_redirect, 分别下载 xming 与 xming-fonts。 至于安装过程,没什么好说的。 二:Xming的配置 三:Unix/Linux 服务器的配置 修改下要登录的服务器的配置文件,增加对 X11 Forwarding的支持: sudo vi /etc/ssh/sshd_config: (在文件的末尾,增加以下配置) X11Forwarding yes 四:putty的配置
欢迎关注大数据和人工智能技术文章发布的微信公众号:清研学堂,在这里你可以学到夜白(作者笔名)精心整理的笔记,让我们每天进步一点点,让优秀成为一种习惯! 1 需求分析 有些Linux程序还是不能完全离开窗口环境,或者说离开后操作不方便。其中Oracle就是这样一个程序,其工具程序大多数能够在纯命令行静默执行,如 OCI,DBCA,NetCA等,但是工作在图形界面时更加方便。为此,需要利用X11的XServer和XClient跨网工作原理进行远程显示。而更加方便的是,SSHD远程协议完全支持对X11协议的转发,这样我们就可以只需在服务器端开启一个sshd服务即可通过转发X11来实现远程桌面。 2 实验环境: 服务器端: CentOS6, 最小安装,启动sshd。 桌面端:Windows 8.1,puTTY, Xming。 3 配置步骤: 1 服务器端安装xterm作为测试 yum install xterm 2 服务器端安装xauth程序,sshd需要这个程序执行X11转发 yum install xauth 3 服务器端编辑/etc/ssh/sshd_conf文件,激活X11转发。 X11Forwarding yes 重启sshd。 4 验证服务器端转发成功 此时登陆sshd后,会在用户家目录下生成.XAuthority文件。 echo $DISPLAY 显示结果:localhost:10.0,说明服务器端配置成功,否则如果为空,则配置有错。 5 桌面端安装Xming 这个一个免费的程序,可以自行下载安装到Windows上,非常简单,无需配置。 6 桌面端启动Xming,配置PuTTY转发X11 Xming作为Xserver需要首先启动。然后在PuTTY左侧导航栏中依次选择:【Connection】【SSH】【X11】,在右侧面板中选中【Enable X11forwarding】复选框,保存后重新打开到服务器的会话。 7 运行xterm测试程序
欢迎关注大数据和人工智能技术文章发布的微信公众号:清研学堂,在这里你可以学到夜白(作者笔名)精心整理的笔记,让我们每天进步一点点,让优秀成为一种习惯! 起因接下去的工作要作一些数值模拟,于是到师兄的工作站上开了个帐号。工作站运行的是RHEL4,要说远程SSH,就算是FTerm也足够胜任,不过,因为我要用的查看计算结果的软件需要使用图形界面,这一点就比较麻烦了。用VNC,一来耗费资源,二来VNC在win下的表现实在不咋样。参考记起上学期的VLSI设计的计算机实验,几十个人从运行Windows XP的PC上,用XShell SSH到实验中心的运行Solaris的Sun工作站,运行Cadence的工具集,那就是带GUI的。于是想,是否我也能这么干呢?往Debian中文和Ubuntu中文邮件列表投递了封邮件,提出了这个问题,根据列表上的回复,再Google了一圈,整理了一下,基本上明白了该怎么做,细节的问题还是不清楚,于是先做一下再说。一、原理Linux/Unix的X Window具有网络透明性。X Window系统里有一个统一的Server来负责各个程序与显示器、键盘和鼠标等输入输出设备的交互,每个有GUI的应用程序都通过网络协议与Server进行交互。所以对于任何一个应用程序,本地运行和远程运行的差别仅仅是X Server的地址不同,别的没有差别。所以在Windows运行一个X Server,就可以很方便的远程运行有GUI的Linux应用了。同时,OpenSSH具有X转发功能,可以将Linux主机的X程序通过SSH的管道转发给客户端。于是,通过PuTTY到主机,再将接收到的由主机转发来的X程序的交互交给在本地Windows系统下运行的X Server来管理和显示,原则上说,这就可以实现远程使用Linux的GUI程序。主机上需要的配置:#vi /etc/ssh/sshd_config取消这一行的注释——如果没有这一行则手动添加之:X11Forwrding yes这样配置的作用就是允许SSH的X转发。其实本质上说,这样做是有一定安全风险的,SSH并不能绝对的保证你数据的安全性,不过,一般情况下,这也够了。二、安装Xming需要在本地Windows上运行一个X Server。选择有很多:Cygwin下的X Server恐怕是最著名的,但是为了这么一个小小的事情去安装一个“相对巨大”的Cygwin,似乎有些夸张;除了Cygwin,还有两个著名的商业软件可以选用,Xwin32和Xmanager,上学期IC实验用的就是Xmanager,感觉很流畅很好用,不过,虽然Xmanager可以试用,但是终究还是商业软件;还有一个选择,就是这里要讲的,开源软件Xming。Xming是一个配置简单而功能强大的开源X Server,可以运行在M$的XP/2003/Vista操作系统下。Xming的主页:http://www.straightrunning.com/XmingNotes/Xming的SourceForge页面:http://sourceforge.net/projects/xming/从SourceForge下载Xming-setup.exe(最新的版本是6.9.0.31),在本地安装。第一次运行时使用开始菜单里面的XLaunch来启动,产生一个初始的配置文件。对于简单的使用来说,不需要任何特殊的配置,一切使用默认即可。Xming的具体配置和使用可以参考Xming的Manual。需要记住的是下图中标示出的“Display number”中的数字,此处使用默认的0。启动完成后,在托盘区会出现一个“X”形状的图标,这表示Xming已经在运行了,将鼠标悬停上去,能看到当前使用的“Display number”。三、配置PuTTYWindows下有很多支持SSH/Telnet等远程登录协议的客户端,比如SecureCRT、XShell、PuTTY等,甚至大家用来登录BBS灌水用的FTerm都带有SSH的功能,只不过不如PuTTY这样的软件专业和强大罢了。我用的是著名的免费的PuTTY,相信很多人的选择也跟我一样。因此,就不再赘述PuTTY的配置和使用了。这里要说的,是添加PuTTY对X转发的支持。运行PuTTY,在配置界面,选择“Connection-SSh-X11”,选中“Enable X11forwarding”,“X display location”中填上上一步中“Display number”中的数字(此处就是“localhost:0”)。然后连接登录远程主机,看上去一切正常的样子。四、问题及解决之道于是试着运行一下emacs吧!嘿!图形界面果然出来了,只是,咋看不到文字,全是些方块啊?!看看终端的输出信息:-bash-2.05b$ emacsWarning: Cannot convert string "-*-courier-medium-r-*-*-*-120-*-*-*-*-iso8859-*" to type FontStructWarning: Cannot convert string "-*-helvetica-medium-r-*--*-120-*-*-*-*-iso8859-1" to type FontStruct哦,原来是Xming没有相应的字体!去Xming的主页查查manual,可以为Xming添加Windows的系统字体,也可以使用Xming提供的字体。使用Xming提供的字体是很简单的,从Xming的SourceForge页面下载xming-fonts-setup.exe(最新版本是7.3.0.15),安装到Xming的安装路径下即可。我的Xming安装路径是D:\Program\Xming\,则安装字体之后的字体路径就是D:\Program\Xming\fonts\。经测试,这样安装字体后,运行emacs字体能正常显示了。如果不想安装字体,自然也可以让Xming使用Windows的系统字体。可是怎么配置呢?还记得Linux下是怎么添加字体的么?对了,要为字体生成cache文件,使用的工具就是mkfontscale。为此,从Xming的SourceForge页面下载Xming-tools-and-clients,解压缩到Xming的安装路径。切换到Windows的的cmd(命令提示符),cd到Xming的目录,执行以下命令:>mkfontscale C:/WINDOWS/Fonts>mkfontscale -b -s -l C:/WINDOWS/Fonts #ignore the 'Couldn't...fon' messages然后编辑|Xming安装路径下的font-dirs文件,添加字体路径:C:\WINDOWS\Fonts记住:虽然是在Windows下,注意区分大小写仍然是个好习惯。OK!再来试试,嘿,这下子emacs是不是正常多了呢?小小的Tips:用你的防火墙阻止Xming访问网络。因为,这样的一个X Server本质是不安全的,而且,你并不需要它联网,因为你只是在本机使用而已。感受:Xming总体来说还是不如Xmanager,运行的流畅程度还是有不小的差距,尤其是鼠标的移动,感觉一顿一顿的,纵然是在局域网内,情况也没有好特别多。如果出不来,显示no display需要安装以下软件:yum install -y xauth然后退出,再重新登录就可以了。还可以装字库yum -y groupinstall fonts
欢迎关注大数据和人工智能技术文章发布的微信公众号:清研学堂,在这里你可以学到夜白(作者笔名)精心整理的笔记,让我们每天进步一点点,让优秀成为一种习惯! 问题描述:一般docker实操时都是作为服务器,以字符方式交互,非常不方便。本人尝试各种图形解决方案,最终找到完美方案。 最初本人尝试过VNC和SSH方式,最终被否定了。1, 本来docker服务器是很小的,但下载了VNC SSHD服务器和全套的窗口管理器后变得很大。2,在docker服务器中运行窗口管理器违背了作了服务器要求简单的初衷。3, 存在不完全兼容的问题,配置复杂。 后来想到LIUNX的X WINDOW系统本来就是C-S模式的,完全可以在服务器端执行程序的计算部分,将程序的显示部分放在图形终端上。以下只讲结果,不讲过程中的种种坑。(我是搞了好久才最终成功的,唉!!时间,我的时间啊!!) 环境描述: 1,docker服务器为ubuntu14.4, 没有桌面环境------主机A IP:172.17.0.2 2,图形终端ubuntu16.04,全套桌面环境--------------主机B IP:172.17.0.1 概念描述: 主机A是服务器,但在X WINDOW模型中是X CLIENT。 主机B是远程终端,作为图形显示用,但在X WINDOW模型中是X SERVER。 操作如下: 1,主机A,root@6e1ce93e82b1:/# export DISPLAY=172.17.0.1:0.0 意思是图形输出重定向到主机B,缺省为DISPLAY=:0.0 2,主机B,sudo gedit /etc/lightdm/lightdm.conf 增加一行 xserver-allow-tcp=true 3,主机B,sudo systemctl restart lightdm 4,主机B,netstat|grep tcp 应有如下类似的一行 “ tcp 0 0 172.17.0.1:x11 172.17.0.2:49672 ESTABLISHED” 5,主机B, xhost + 注意加号前应有空格 6,主机A,root@6e1ce93e82b1:/# xclock 此时在主机B上可以看到一个在运行中的时钟图形 至此完成!
欢迎关注大数据和人工智能技术文章发布的微信公众号:清研学堂,在这里你可以学到夜白(作者笔名)精心整理的笔记,让我们每天进步一点点,让优秀成为一种习惯! 有幸得到大神的邮件回复,今天突然发觉,大神应该是在自己的mac上通过ssh访问了一台OS为Ubuntu的的机器或者电脑,其中Ubuntu安装了Docker,Docker运行某个软件或者程序,然后将可视化的界面返回了mac上。 所以,同理可得,本人机器为win7,安装了Ubuntu的虚拟机,虚拟机中安装了Docker,当Docker运行某一个镜像时,会将可视化界面返回给windows系统,在win7上进行显示,其中win7通过putty访问虚拟机,同时为了能够在windows系统上显示那些GUI,需要安装。 xming-点击打开链接 安装过程,网上资料较多,在此不一一描述。 当xming和putty安装成功之后,对Ubuntu虚拟机进行配置。 一、在Ubuntu系统下,安装运行SSH服务,安装命令: [plain] view plain copy <span style="white-space:pre;"> </span>$ sudo apt-get install openssh-server 二、虚拟机安装ssh客户端,安装命令: [plain] view plain copy <span style="white-space:pre;"> </span>$ sudo apt-get install openssh-client 三、虚拟机开启ssh服务 验证当前是否开启: [plain] view plain copy <span style="white-space:pre;"> </span>$ ps -e|grep ssh 四、虚拟机配置工作 1、服务器端配置:配置 /etc/ssh/sshd_config这个文件,设置X11Forwarding yes,源文件可能在行首加入了#号,代表注释,需要将#去掉。 重启ssh服务 [plain] view plain copy <span style="white-space:pre;"> </span>$ cd /etc/init.d <span style="white-space:pre;"> </span>$ ./ssh restart 2、客户端配置: [plain] view plain copy <span style="white-space:pre;"> </span>$ vi /etc/ssh/ssh_config 将ForwardAgent、ForwardX11、ForwardX11Trusted设为yes,原文件应该是#注释掉了,确保将#去掉。 3、允许所有用户访问X11服务 [plain] view plain copy <span style="white-space:pre;"> </span>$ sudo apt-get install xserver-xorg x11-xserver-utils <span style="white-space:pre;"> </span>$ xhost + 五、windows下putty的配置 1、在红色标记处填写windows系统的IP地址 2、设计此次ssh使用X11forwarding性质,并标明display的ip地址 3、还可以将这些数据进行保存 六、确认windows的ip地址,在命令行执行ipconfig指令,查看本机地址。 我的地址为172.26.179.115 七、确认Ubuntu虚拟机中,DISPLAY的环境变量是否和windows下的地址一致,若不一致,进行修改。 输出DISPLAY环境变量 [plain] view plain copy <span style="white-space:pre;"> </span>$ echo DISPLAY 删除DISPLAY环境变量 [plain] view plain copy <span style="white-space:pre;"> </span>$ unset DISPLAY 修改并使之生效 八、xclock运行测试结果
欢迎关注大数据和人工智能技术文章发布的微信公众号:清研学堂,在这里你可以学到夜白(作者笔名)精心整理的笔记,让我们每天进步一点点,让优秀成为一种习惯! Shipyard是一款开源的图形化的Docker管理工具,记得以前安装很麻烦的,现在官方有了自动安装脚本,使用非常方便。复制、粘贴、使用,就这么简单。先不研究他是如何实现的,安装使用起来再说。 $ curl -s https://shipyard-project.com/deploy | bash -s Deploying Shipyard -> Starting Database -> Starting Discovery -> Starting Cert Volume -> Starting Proxy -> Starting Swarm Manager -> Starting Swarm Agent -> Starting ControllerWaiting for Shipyard on 192.168.2.xxx:8080..Shipyard available at http://192.168.2.xxx:8080 Username: admin Password: shipyard Shipyard 启用了7个容器,默认访问端口是8080,默认用户名和密码是admin 和 shipyard 注意事项: 如果安装出现了问题怎么办?是否是因为端口冲突?网络出现问题怎么办?这个项目用到了哪些Docker镜像?一键安装的脚本是如何实现的? 1、Shipyard的默认访问端口为8080,这个端口许多程序都会用,使用时尽量要避免冲突。如果你在测试机器上安装过多款软件,然后再安装Shipyard时,却发现无法访问Shipyard,可以考虑一下,是不是因为端口被其他程序占用的问题。 2、由于网络的原因,因此第一次执行时可能不会很顺利,镜像可能未下载全,又或者端口冲突,导致无法通过8080端口访问shipyard页面。查看主机发现其中有几个Shipyard容器已经运行了,怎么办?不妨先使用 docker ps -a 命令,查看一下正在进行的容器情况,然后用docker stop xxx 把7个shipyard开头的容器都停止掉、最后再用docker rm xxx 把上一次安装出现问题的容器都删除掉,最后再次执行curl这一行命令。 3、比较稳妥的方法是先下载这七个Docker镜像,然后再运行这一行。其中rethinkdb 181MB,shipyard/shipyard 58MB,七个一共300MB。 docker pull alpinedocker pull swarm docker pull shipyard/shipyarddocker pull rethinkdbdocker pull microbox/etcddocker pull ehazlett/curl docker pull shipyard/docker-proxy 4、如果访问不了,请检查你使用的浏览器,记得使用谷歌的chrome浏览器。 5、安装Shipyard 的脚本地址: https://shipyard-project.com/deploy,有兴趣的可以看一看如何部署一个小型的容器应用。
0.环境说明 Ubuntu 16.04 docker 1.35 1.Docker的“可视化” Docker本身的工作模式是命令行的,因为主要的使用场景可能是做服务器后端方面的比较多。 但有时候我们会有在docker容器里运行一些图形界面的软件,或者要调用摄像头,输出图像等等一些需求,这个时候需要解决这个Docker “可视化”的问题。 (这里的“可视化”不是很容易搜到的可视化管理的方法) 2.解决方案1—启动容器时添加配置选项 林帆:Docker运行GUI软件的方法 这篇文章里介绍了Docker公司的程序员杰西·弗莱泽尔(Jessie Frazelle)展示的使用了图形界面的镜像的例子,Jessie也开源了她展示的docker 运行libreoffice软件的代码和使用方法。 2.1 原理简介 原文中讲的比较详细,原理并不复杂,我按照自己理解很浅显地讲一下。 原理上可以把docker镜像看做一台没配显示器的电脑,程序可以运行,但是没地方显示。 而linux目前的主流图像界面服务X11又支持 客户端/服务端(Client/Server)的工作模式 只要在容器启动的时候,将 『unix:端口』或『主机名:端口』共享给docker,docker 就可以通过端口找到显示输出的地方,和linux系统共用显示 2.2 具体操作(显示到本地显示器) 1)首先,在主系统里运行 $ sudo apt-get install x11-xserver-utils $ xhost + 这两句的作用是开放权限,允许所有用户,当然包括docker,访问X11 的显示接口 2)在启动docker容器时,添加选项如下: -v /tmp/.X11-unix:/tmp/.X11-unix \ #共享本地unix端口 -e DISPLAY=unix$DISPLAY \ #修改环境变量DISPLAY -e GDK_SCALE \ #我觉得这两个是与显示效果相关的环境变量,没有细究 -e GDK_DPI_SCALE \ 最终的启动命令就会长类似这样 $ docker run -d \ -v /etc/localtime:/etc/localtime:ro \ -v /tmp/.X11-unix:/tmp/.X11-unix \ -e DISPLAY=unix$DISPLAY \ -e GDK_SCALE \ -e GDK_DPI_SCALE \ --name libreoffice \ jess/libreoffice 这样启动后的容器,运行有图形界面的程序就可以自由显示,和在本地显示一样了。 这样操作已经十分方便了。需要注意的是,每次重新开机,需要在本机操作一次 xhost + 打开权限。应该有永久更改这个的办法,不过我觉得不算麻烦。 原文中还有在远程显示的配置方法,我没有试,就不多说了。 3.解决方案2—已经启动的容器修改系统参数 参考文章 有的时候,我们在已经启动的容器里做了一些事情,有了显示图像的需要,但从头新启动一个容器有点麻烦。 这时候可以用上面博客里讲的方法实现图形界面显示,也还算方便。 思路上也是把主机和docker看做服务器和客户端的关系,通过IP地址来映射显示。 3.1 具体操作 1)使用 ifconfig 查看主机和docker的IP地址 例如:主机的IP为 xxx docker 的IP为YYY 2)docker 中 export DISPLAY= XXX #把环境变量映射到主机IP 3.)主机中 sudo gedit /etc/lightdm/lightdm.conf #增加一行 xserver-allow-tcp=true sudo systemctl restart lightdm xhost + #注意加号前应有空格 这样配置就完成了,这是第一次配置的操作. 以后每次重新开机时,还是要在主机里运行一下 xhost +,在docker里运行一下export DISPLAY= XXX 。 其实还是挺麻烦的。 最关键的是,这种方式用的是IP地址,在系统没联网时,网卡就没有分配的IP地址了,这种方法就行不通了。 4.怎样测试能否显示图像界面 第二篇参考文章中用了一个显示时钟的小程序xclock 不过我在Ubuntu16.04的环境里搜不到这个了,能安装的叫xarclock,功能一样 在docker中运行 sudo apt-get install xarclock #安装这个小程序 xarclock #运行,如果配置成功,会显示出一个小钟表动画
欢迎关注大数据和人工智能技术文章发布的微信公众号:清研学堂,在这里你可以学到夜白(作者笔名)精心整理的笔记,让我们每天进步一点点,让优秀成为一种习惯! 默认情况下,Docker守护进程会生成一个socket(/var/run/docker.sock)文件来进行本地进程通信,而不会监听任何端口,因此只能在本地使用docker客户端或者使用Docker API进行操作。 如果想在其他主机上操作Docker主机,就需要让Docker守护进程监听一个端口,这样才能实现远程通信。 修改Docker服务启动配置文件,添加一个未被占用的端口号,重启docker守护进程。 # vim /etc/default/docker DOCKER_OPTS="-H 0.0.0.0:5555" # service docker restart 此时发现docker守护进程已经在监听5555端口,在另一台主机上可以通过该端口访问Docker进程了。 # docker -H IP:5555 images 但是我们却发现在本地操作docker却出现问题。 # docker images FATA[0000] Cannot connect to the Docker daemon. Is 'docker -d' running on this host? 这是因为Docker进程只开启了远程访问,本地套接字访问未开启。我们修改/etc/default/docker,然后重启即可。 # vim /etc/default/docker DOCKER_OPTS="-H unix:///var/run/docker.sock -H 0.0.0.0:5555" # service docker restart 现在本地和远程均可访问docker进程了。
欢迎关注大数据和人工智能技术文章发布的微信公众号:清研学堂,在这里你可以学到夜白(作者笔名)精心整理的笔记,让我们每天进步一点点,让优秀成为一种习惯! 今天启动hbase shell,输入hbase命令时报错: ERROR [regionserver/regionserver1/172.18.0.61:16020] reggionserver.HRegionServer: Shutdown / close of WAL failed: org.apache.hadoop.hdfs..server.namenode.LeaseExpiredException: No lease on /hbase/WALs/regionserver1.shaadownet,16020,1522226971485/regionserver1.shadownet%2C16020%2C1522226971485.defauult.1522237781682 (inode 16832): File does not exist. Holder DFSClient_NONMAPREDUUCE_-210251064_1 does not have any open files. 解决办法,调整xcievers参数默认是4096,改为8192进入hdfs-site.xml文件<property><name>dfs.datanode.max.xcievers</name><value>8192</value></property>dfs.datanode.max.xcievers 参数说明一个 Hadoop HDFS Datanode 有一个同时处理文件的上限. 这个参数叫 xcievers (Hadoop的作者把这个单词拼错了). 在你加载之前,先确认下你有没有配置这个文件conf/hdfs-site.xml里面的xceivers参数,至少要有4096。
欢迎关注大数据和人工智能技术文章发布的微信公众号:清研学堂,在这里你可以学到夜白(作者笔名)精心整理的笔记,让我们每天进步一点点,让优秀成为一种习惯! 今天进入hbase shell中输入命令报错:ERROR: org.apache.hadoop.hbase.ipc.ServerNotRunningYetException: Server is not running yet 原因是由于hadoop的安全模式打开了,解决方法: hdfs dfsadmin -safemode leave 再重新启动HBase就可以了
欢迎关注大数据和人工智能技术文章发布的微信公众号:清研学堂,在这里你可以学到夜白(作者笔名)精心整理的笔记,让我们每天进步一点点,让优秀成为一种习惯! 1、设置jupyter notebook的密码: Jupyter-notebook password 2、查看jupyter notebook的token: Jupyter notebook list
欢迎关注大数据和人工智能技术文章发布的微信公众号:清研学堂,在这里你可以学到夜白(作者笔名)精心整理的笔记,让我们每天进步一点点,让优秀成为一种习惯! 1、使用pip安装Jupyter notebook: pip install jupyter notebook 2、创建Jupyter默认配置文件: jupyter notebook --generate-config 3、输入ipython,进入对话框: ipython 4、导入密码模块,设置密码,最后生成SHA1加密的密钥,保存密钥,如'sha1:XXXXXX': from notebook.auth import passwd passwd() 5、修改配置文件,设置密钥:; cd ~ vim .jupyter/jupyter_notebook_config.py 6、在文件末尾增加: c.NotebookApp.password = u'sha1:XXXXXX' 7、运行jupyter notebook: jupyter notebook --ip=0.0.0.0 --no-browser --allow-root
欢迎关注大数据和人工智能技术文章发布的微信公众号:清研学堂,在这里你可以学到夜白(作者笔名)精心整理的笔记,让我们每天进步一点点,让优秀成为一种习惯! 自己计算机里面共存了Python2和Python3,ipython作为试探性的REPL解释器使用的频率还是挺高的,分别在2和3下安装完ipython notebook后怎么分别使用这两种内核呢 按照默认的 jupyter notebook命令,只能运行一种内核,如Python2,想运行Python3内核怎么办呢? ipython kernel install --name python2 ipython kernel install --name python3
欢迎关注大数据和人工智能技术文章发布的微信公众号:清研学堂,在这里你可以学到夜白(作者笔名)精心整理的笔记,让我们每天进步一点点,让优秀成为一种习惯! 一、jupyter notebook是什么 官网的介绍是:Jupyter Notebook是一个Web应用程序,允许您创建和共享包含实时代码,方程,可视化和说明文本的文档。 用途包括:数据清理和转换,数值模拟,统计建模,机器学习等等。 简单的介绍就是:Jupyter Notebook是Ipython的升级版,而Ipython可以说是一个加强版的交互式 Shell,也就是说,它比在terminal里运行python会更方便,界面更友好,功能也更强大。怎么强大法,往下看就知道了。 二、jupyter notebook的安装和打开 安装非常简单,只需要在终端输入: [plain] view plain copy pip install jupyter 打开jupyter notebook 也只需要在终端输入: [plain] view plain copy jupyter notebook 运行上面的命令之后,你将看到类似下面这样的输出: 如上图,它打开了一个端口,并且会在你的浏览器中打开这个页面,主目录是图中的那个directory(可能第一次打开没有这个目录)。 三、使用 1、打开一个新文档 在主页面的右上角点new即可新建一个你想要的文件类型。 如上图,jupyter也可以打开一个terminal,还可以作为一个text文本编辑器,功能明显是比terminal强大了。 下面的Notebooks类型除了python 也是可以加入其他类型的文档的,具体方法百度一下就好。 2、python编辑器介绍 点击python2后会出现一下界面: 稍微介绍一下notebook 界面的组成部分1)notebook 的名称2)主工具栏提供了保存、导出、重载 notebook,以及重启内核等选项3)快捷键4)notebook 编辑区 最下面的哪个 In [ ]: 的框叫做单元格,你可以把你的代码分成一段段的单元格输入,然后可以逐个单元格地运行。注意,这个功能是非常友好的,有时候只修改了中间的一小段代码,又不想全部代码都要重新运行的时候这个功能就非常有用了。另外,单元格是可以改变顺序的。而且可以输出图片和绘图!非常强大吧! 这些只要稍微尝试一下就懂的,下面主要介绍一些常用的技巧 **注意,jupyter notebook 是支持 TAB 键自动补充单词的,再一次展示了其强大友好的一面! A.修改文档名称 方法一:点上图的Untitled 方法二:点File,再点rename B.导出文档 步骤:点File,再点Download as 发现里面支持好几种格式的导出,第一个ipynb是notebook的格式,是一种类json的格式保存,其他的建议你们都试一试,你会感到非常惊喜的。 C.保存 Ctrl + S 快捷键的可以保存你的文档的,默认是保存为ipynb,保存在你的主目录下! D.单元格格式 注意到快捷键栏中有一个code的下拉框,点开发现有几个选项: 这里介绍一下 Code格式就是正常的python代码格式 Markdown的一个text文档编辑格式,就像在word里编写一样 Heading就是给Markdown的句子设置标题等级,像word的标题一,标题二... Raw NBConvert 没用过不了解,可以自行百度或者看官网介绍 下面举例说明一下 选择一个空的单元格,code下拉框选择Heading,会出现一个不同类型的 cell: 改变单元格类型时弹出消息中有解释,后面那个单元格以 # 标记开头,意味着这是一个一级标题。如果需要子标题,可以使用以下标记表示: # : 一级标题## : 二级标题### : 三级标题... 输入内容后再运行一下(快捷栏里有),会出现类似下面的情况: 我一共输入了三级标题,点其中一个,你会发现它的code下拉栏显示是markdown类型 你以后代码里print 的内容都是以markdown的格式显示的。 E.快捷键 常用的快捷键是: Ctrl + Enter: 执行单元格代码 Shift + Enter: 执行单元格代码并且移动到下一个单元格 Alt + Enter: 执行单元格代码,新建并移动到下一个单元格 这几个快捷键都是非常常用的。 F.历史输入和输出变量 与标准 Shell 类似,IPython 中也可以通过 _ 和 _ _ 访问上一次和上上一次的输出。 当你写的单元格多了,肯定会注意到,IPython 中每一次的输入输出都有序号。你可以通过一下方法访问这些输入和输出: _:访问上一次输出 __:访问上上一次输出 _X:访问历史 X 行输出 _iX:访问历史 X 行输入 其中小写字母 “i”,代表 “in”。 四、外部功能 上面讲的是jupyter 的一些使用方法和技巧,其实它还有很多强大的外部功能的,下面给大家介绍一下。 A.魔术命令 在 IPython 的会话环境中,所有文件都可以通过 %run 命令来当做脚本执行,并且文件中的变量也会随即导入当前命名空间。 即,对于一个模块文件,你对他使用 %run 命令的效果和 from module import * 相同 这种以 % 开头的命令在 IPython 中被称为魔术命令,用于加强 shell 的功能。 常用的魔术命令有: %quickref 显示 IPython 快速参考 %magic 显示所有魔术命令的详细文档 %debug 从最新的异常跟踪的底部进入交互式调试器 %pdb 在异常发生后自动进入调试器 %reset 删除 interactive 命名空间中的全部变量 %run script.py 执行 script.py %prun statement 通过 cProfile 执行对 statement 的逐行性能分析 %time statement 测试 statement 的执行时间 %timeit statement 多次测试 statement 的执行时间并计算平均值 %who、%who_ls、%whos 显示 interactive 命名空间中定义的变量,信息级别/冗余度可变 %xdel variable 删除 variable,并尝试清除其在 IPython 中的对象上的一切引用 !cmd 在系统 shell 执行 cmd output=!cmd args 执行cmd 并赋值 %bookmark 使用 IPython 的目录书签系统 %cd direcrory 切换工作目录 %pwd 返回当前工作目录(字符串形式) %env 返回当前系统变量(以字典形式) 对魔术命令不熟悉的话可以通过 %magic 查看详细文档;对某一个命令不熟悉的话,可以通过 %cmd? 内省机制查看特定文档 B.添加插件 1)侧边栏目录导航 当文章内容非常长的时候,前后找内容,很麻烦,不如加一个sidebar,方便导航方法:https://github.com/ipython-contrib/IPython-notebook-extensions/tree/master/nbextensions/usability/toc2 2)隐藏代码按钮 有时候,希望代码可以隐藏,这样子文档看起来,就会干净一些 点击按钮,就可以隐藏所有的代码,具体做法:http://stackoverflow.com/questions/27934885/how-to-hide-code-from-cells-in-ipython-notebook-visualized-with-nbviewer当然,还有更多的extention可见https://github.com/ipython-contrib/IPython-notebook-extensions/ 参考【https://www.douban.com/review/7890354/】 C.运行python文件 利用jupyter的cell是可以运行python文件的。 方法一: [plain] view plain copy %run file.py 方法二:在unitx command前面加入一个感叹号“!” ,如: [plain] view plain copy !python myfile.py D.导入外部代码 比如有一个test.py文件,需要将其载入到jupyter的一个cell中 在需要导入该段代码的cell中输入 [plain] view plain copy %load test.py #test.py是当前路径下的一个python文件 shift + enter运行后,%load test.py被自动加入了注释符号#,test.py中的所有代码都被load到了当前的cell中 或者从从网络load代码到jupyter 在cell中输入%load http://.....,然后运行该cell,就会将load后面所对应地址的代码load到当前的cell中; 五、其他技巧 1)更改Jupyter notebook的工作空间(主目录) Jupyter的工作空间在其配置文件ipython_notebook_config.py中。 ipython_notebook_config.py文件在~/.jupyter/下 如果找不到那就在终端输入: [plain] view plain copy jupyter notebook --generate-config 然后再 [plain] view plain copy gedit ~/.jupyter/jupyter_notebook_config.py Ctrl + F 找到下面这句按下面的格式,输入你想要的目录路径即可 [plain] view plain copy # The directory to use for notebooks.这决定了jupyter启动目录 c.NotebookApp.notebook_dir = u'/path/to/your/notebooks' 2)自定义快捷键 这个就直接参考官方文档吧:http://nbviewer.jupyter.org/github/ipython/ipython/blob/3.x/examples/Notebook/Custom%20Keyboard%20Shortcuts.ipynb 六、总结 总的来说,Jupyter notebook 是一款非常优秀的交互式编辑平台,提供了分享,演示,编辑等功能.作为学习的记录者,方便你随时捡起学习的进度,增量式地前进。 希望这篇博文能对刚接触jupyter 的朋友有所帮助! 七、参考 【1】官网安装:https://jupyter.readthedocs.io/en/latest/install.html 【2】jupyter使用小结【3】Jupyter Notebook 快速入门(上) 【4】jupyter notebook 各种用法记录(陆续更新)
欢迎关注大数据和人工智能技术文章发布的微信公众号:清研学堂,在这里你可以学到夜白(作者笔名)精心整理的笔记,让我们每天进步一点点,让优秀成为一种习惯! 今天用pip安装skimage时报错: 这是因为网络的问题,需要使用国内的镜像源来加速,比如豆瓣源 命令改为: pip install scikit-image -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com 或者 pip3 install scikit-image -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com 最后成功安装:
欢迎关注大数据和人工智能技术文章发布的微信公众号:清研学堂,在这里你可以学到夜白(作者笔名)精心整理的笔记,让我们每天进步一点点,让优秀成为一种习惯! 方法一、通过 Dockerfile 构建 创建Dockerfile 首先,创建目录python,用于存放后面的相关东西。 runoob@runoob:~$ mkdir -p ~/python ~/python/myapp myapp目录将映射为python容器配置的应用目录 进入创建的python目录,创建Dockerfile FROM buildpack-deps:jessie # remove several traces of debian python RUN apt-get purge -y python.* # http://bugs.python.org/issue19846 # > At the moment, setting "LANG=C" on a Linux system *fundamentally breaks Python 3*, and that's not OK. ENV LANG C.UTF-8 # gpg: key F73C700D: public key "Larry Hastings <larry@hastings.org>" imported ENV GPG_KEY 97FC712E4C024BBEA48A61ED3A5CA953F73C700D ENV PYTHON_VERSION 3.5.1 # if this is called "PIP_VERSION", pip explodes with "ValueError: invalid truth value '<VERSION>'" ENV PYTHON_PIP_VERSION 8.1.2 RUN set -ex \ && curl -fSL "https://www.python.org/ftp/python/${PYTHON_VERSION%%[a-z]*}/Python-$PYTHON_VERSION.tar.xz" -o python.tar.xz \ && curl -fSL "https://www.python.org/ftp/python/${PYTHON_VERSION%%[a-z]*}/Python-$PYTHON_VERSION.tar.xz.asc" -o python.tar.xz.asc \ && export GNUPGHOME="$(mktemp -d)" \ && gpg --keyserver ha.pool.sks-keyservers.net --recv-keys "$GPG_KEY" \ && gpg --batch --verify python.tar.xz.asc python.tar.xz \ && rm -r "$GNUPGHOME" python.tar.xz.asc \ && mkdir -p /usr/src/python \ && tar -xJC /usr/src/python --strip-components=1 -f python.tar.xz \ && rm python.tar.xz \ \ && cd /usr/src/python \ && ./configure --enable-shared --enable-unicode=ucs4 \ && make -j$(nproc) \ && make install \ && ldconfig \ && pip3 install --no-cache-dir --upgrade --ignore-installed pip==$PYTHON_PIP_VERSION \ && find /usr/local -depth \ \( \ \( -type d -a -name test -o -name tests \) \ -o \ \( -type f -a -name '*.pyc' -o -name '*.pyo' \) \ \) -exec rm -rf '{}' + \ && rm -rf /usr/src/python ~/.cache # make some useful symlinks that are expected to exist RUN cd /usr/local/bin \ && ln -s easy_install-3.5 easy_install \ && ln -s idle3 idle \ && ln -s pydoc3 pydoc \ && ln -s python3 python \ && ln -s python3-config python-config CMD ["python3"] 通过Dockerfile创建一个镜像,替换成你自己的名字 runoob@runoob:~/python$ docker build -t python:3.5 . 创建完成后,我们可以在本地的镜像列表里查找到刚刚创建的镜像 runoob@runoob:~/python$ docker images python:3.5 REPOSITORY TAG IMAGE ID CREATED SIZE python 3.5 045767ddf24a 9 days ago 684.1 MB 方法二、docker pull python:3.5 查找Docker Hub上的python镜像 runoob@runoob:~/python$ docker search python NAME DESCRIPTION STARS OFFICIAL AUTOMATED python Python is an interpreted,... 982 [OK] kaggle/python Docker image for Python... 33 [OK] azukiapp/python Docker image to run Python ... 3 [OK] vimagick/python mini python 2 [OK] tsuru/python Image for the Python ... 2 [OK] pandada8/alpine-python An alpine based python image 1 [OK] 1science/python Python Docker images based on ... 1 [OK] lucidfrontier45/python-uwsgi Python with uWSGI 1 [OK] orbweb/python Python image 1 [OK] pathwar/python Python template for Pathwar levels 1 [OK] rounds/10m-python Python, setuptools and pip. 0 [OK] ruimashita/python ubuntu 14.04 python 0 [OK] tnanba/python Python on CentOS-7 image. 0 [OK] 这里我们拉取官方的镜像,标签为3.5 runoob@runoob:~/python$ docker pull python:3.5 等待下载完成后,我们就可以在本地镜像列表里查到REPOSITORY为python,标签为3.5的镜像。 使用python镜像 在~/python/myapp目录下创建一个 helloworld.py 文件,代码如下: #!/usr/bin/python print("Hello, World!"); 运行容器 runoob@runoob:~/python$ docker run -v $PWD/myapp:/usr/src/myapp -w /usr/src/myapp python:3.5 python helloworld.py 命令说明: -v $PWD/myapp:/usr/src/myapp :将主机中当前目录下的myapp挂载到容器的/usr/src/myapp -w /usr/src/myapp :指定容器的/usr/src/myapp目录为工作目录 python helloworld.py :使用容器的python命令来执行工作目录中的helloworld.py文件 输出结果: Hello, World!
方法一、通过 Dockerfile 构建 创建Dockerfile 首先,创建目录python,用于存放后面的相关东西。 mkdir -p ~/python ~/python/myapp myapp目录将映射为python容器配置的应用目录 进入创建的python目录,创建Dockerfile FROM buildpack-deps:jessie # remove several traces of debian python RUN apt-get purge -y python.* # http://bugs.python.org/issue19846 # > At the moment, setting "LANG=C" on a Linux system *fundamentally breaks Python 3*, and that's not OK. ENV LANG C.UTF-8 # gpg: key F73C700D: public key "Larry Hastings <larry@hastings.org>" imported ENV GPG_KEY 97FC712E4C024BBEA48A61ED3A5CA953F73C700D ENV PYTHON_VERSION 3.5.1 # if this is called "PIP_VERSION", pip explodes with "ValueError: invalid truth value '<VERSION>'" ENV PYTHON_PIP_VERSION 8.1.2 RUN set -ex \ && curl -fSL "https://www.python.org/ftp/python/${PYTHON_VERSION%%[a-z]*}/Python-$PYTHON_VERSION.tar.xz" -o python.tar.xz \ && curl -fSL "https://www.python.org/ftp/python/${PYTHON_VERSION%%[a-z]*}/Python-$PYTHON_VERSION.tar.xz.asc" -o python.tar.xz.asc \ && export GNUPGHOME="$(mktemp -d)" \ && gpg --keyserver ha.pool.sks-keyservers.net --recv-keys "$GPG_KEY" \ && gpg --batch --verify python.tar.xz.asc python.tar.xz \ && rm -r "$GNUPGHOME" python.tar.xz.asc \ && mkdir -p /usr/src/python \ && tar -xJC /usr/src/python --strip-components=1 -f python.tar.xz \ && rm python.tar.xz \ \ && cd /usr/src/python \ && ./configure --enable-shared --enable-unicode=ucs4 \ && make -j$(nproc) \ && make install \ && ldconfig \ && pip3 install --no-cache-dir --upgrade --ignore-installed pip==$PYTHON_PIP_VERSION \ && find /usr/local -depth \ \( \ \( -type d -a -name test -o -name tests \) \ -o \ \( -type f -a -name '*.pyc' -o -name '*.pyo' \) \ \) -exec rm -rf '{}' + \ && rm -rf /usr/src/python ~/.cache # make some useful symlinks that are expected to exist RUN cd /usr/local/bin \ && ln -s easy_install-3.5 easy_install \ && ln -s idle3 idle \ && ln -s pydoc3 pydoc \ && ln -s python3 python \ && ln -s python3-config python-config CMD ["python3"] 通过Dockerfile创建一个镜像,替换成你自己的名字 docker build -t python:3.5 . 创建完成后,我们可以在本地的镜像列表里查找到刚刚创建的镜像 docker images python:3.5 方法二、docker pull python:3.5 查找Docker Hub上的python镜像 docker search python 这里我们拉取官方的镜像,标签为3.5 docker pull python:3.5 等待下载完成后,我们就可以在本地镜像列表里查到REPOSITORY为python,标签为3.5的镜像。 使用python镜像 在~/python/myapp目录下创建一个 helloworld.py 文件,代码如下: #!/usr/bin/python print("Hello, World!"); 运行容器 docker run -v $PWD/myapp:/usr/src/myapp -w /usr/src/myapp python:3.5 python helloworld.py 命令说明: -v $PWD/myapp:/usr/src/myapp :将主机中当前目录下的myapp挂载到容器的/usr/src/myapp -w /usr/src/myapp :指定容器的/usr/src/myapp目录为工作目录 python helloworld.py :使用容器的python命令来执行工作目录中的helloworld.py文件 输出结果: Hello, World!
1、talkingdata (数据平台) 2、明略数据(解决方案) 3、百融金服(金融大数据) 4、国双科技(营销大数据) 5、国信优易(媒体大数据) 6、百分点(营销大数据) 7、华院集团(解决方案) 8、个推(数据平台) 9、奥维云网(数据平台) 10、数梦工场(解决方案) 11、极光推送(营销大数据) 12、南大通用(gbase基础架构) 13、智慧足迹(解决方案) 14、聚合数据(数据银行/解决方案) 15、永洪科技(BI) 16、51信用卡(金融大数据) 17、海致BDP(BI) 18、多盟(营销大数据) 19、星环科技(基础架构) 20、帆软(BI) 21、春雨医生(医疗大数据) 22、海量数据(大数据基础架构) 23、同盾科技(金融大数据) 24、数云信息(营销大数据) 25、友盟+(解决方案) 26、光音网络(营销大数据) 27、集奥聚合(解决方案) 28、广联达(建筑大数据) 29、天脉聚源(媒体大数据) 30、数联铭品(金融大数据) 31、翱旗科技(解决方案) 32、联动优势(金融大数据) 33、拓尔思(解决方案) 34、品友互动(营销大数据) 35、天远科技(车联网) 36、汇纳科技(房地产大数据) 37、璧合科技(营销大数据) 38、数据堂(数据交易) 39、AdMaster(营销大数据) 40、新意互动(营销大数据) 41、泰一传媒(营销大数据) 42、零点有数(解决方案) 43、银联智慧(金融大数据) 44、时趣互动(营销大数据) 45、数聚股份(BI) 46、融信数联(政府大数据) 47、博雅立方/CubeAD(营销大数据) 48、银联智策(金融大数据) 49、勤智数码(政府大数据) 50、中交慧联(交通大数据) 51、农信互联(农业大数据) 52、中商数据(房地产大数据) 53、慧辰资讯(营销大数据) 54、智子云(营销大数据) 55、安讯科技(营销大数据) 56、博彦多彩(营销大数据) 57、医渡云(医疗大数据) 58、昆仑数据(工业大数据) 59、普林科技(解决方案) 60、美林数据(工业大数据) 61、有米科技(营销大数据) 62、识代运筹(营销大数据) 63、脉策数据(房地产大数据) 64、奥维云网(营销大数据) 65、蓝标移动(营销大数据) 66、日志易(日志数据分析) 67、艾漫数据(媒体大数据) 68、海云数据(可视化) 69、DataEye(营销大数据) 70、通付盾(金融大数据) 71、巨杉数据库(数据库) 72、安沃(营销大数据) 73、力美(营销大数据) 74、晶赞科技(营销大数据) 75、智慧星光(媒体大数据) 76、国政通(数据交易) 77、城市象限(房地产大数据) 78、龙信数据(政府大数据) 79、金棕榈(旅游大数据) 80、佰聆数据(解决方案) 81、网智天元(解决方案) 82、快云科技(营销大数据) 83、悠易互通(营销大数据) 84、金电联行(金融大数据) 85、迈外迪(wifi大数据) 86、艺恩(媒体大数据) 87、希嘉创智(教育大数据) 88、云房数据(房地产大数据) 89、法海风控(金融大数据) 90、众调信息(汽车大数据) 91、盟广信息(房地产大数据) 92、聚效广告(营销大数据) 93、绿网科技(解决方案) 94、久其数字(久其软件)(营销大数据) 95、芝华数据(农业大数据) 96、亿美软通(大数据基础架构) 97、数字冰雹(可视化) 98、号百信息服务(电信大数据) 99、智慧图科技(室内位置服务) 100、博晓通(营销大数据) 还有几个有名的如growingio、神策、piwik等
欢迎关注大数据和人工智能技术文章发布的微信公众号:清研学堂,在这里你可以学到夜白(作者笔名)精心整理的笔记,让我们每天进步一点点,让优秀成为一种习惯! ORA-28000: the account is locked第一步:使用PL/SQL,登录名为system,数据库名称不变,选择类型的时候把Normal修改为Sysdba;第二步:选择myjob,查看users;第三步:选择system,右击点击“编辑”;第四步:修改密码,把“帐户被锁住”的勾去掉;第五步:点击“应用”再点击“关闭”;第六步:重新登录就可以通过验证了;第二种ALTER USER username ACCOUNT UNLOCK; 第三种 在plsql developer中要是以scott/tiger登录时提示ora-28000 the account is locked。 解决办法: 新装完Oracle10g后,用scott/tiger测试,会出现以下错误提示:oracle10g the account is lockedoracle10g the password has expired原因:默认Oracle10g的scott不能登陆。解决:(1)conn sys/sys as sysdba; //以DBA的身份登录(2)alter user scott account unlock;// 然后解锁(3)conn scott/tiger //弹出一个修改密码的对话框,修改一下密码就可以了 在运行里面输入cmd在DOS模式下输入sqlplus,以system用户名登录,密码是刚装oracle时自己填写的密码orcl,登录进去以后。 SQL> conn sys/sys as sysdba; (分号是必须的但是我是以system登录的所在这不应该写conn sys/sys as sysdba应该写conn system/orcl as sysdba;)Connected.SQL> alter user scott account unlock;User altered.SQL> commit;Commit complete.SQL> conn scott/tiger//请输入新密码,并确认后OKPassword changedConnected. 这时再到plsql developer里面以scott/tiger登录就可以了。。。。。 偶在数据库的问题处理过程中遇到了ORA-28000:the account is locked的错误,现将详细的处理情况介绍如下供大家参考: 1. 查询failed_login_attempts参数默认值:Oracle10g(备注:9i环境中此参数的值为unlimited) SQL>conn /as sysdba Connected. SQL> desc dba_profiles;名称 是否为空? 类型----------------------------------------- -------- -------------- PROFILE NOT NULL VARCHAR2(30)RESOURCE_NAME NOT NULL VARCHAR2(32)RESOURCE_TYPE VARCHAR2(8)LIMIT VARCHAR2(40) SQL> select resource_name,limit from dba_profiles where resource_name='FAILED_LOGIN_ATTEMPTS'; RESOURCE_NAME LIMIT-------------------------------- ----------------------------------------FAILED_LOGIN_ATTEMPTS 10 2. 模拟账户被锁现象(为方便模拟lock现象,修改default profile failed_login_attempts=3 )a.修改参数failed_login_attempts=3 SQL> conn /as sysdba已连接。SQL> alter profile default limit failed_login_attempts 3; 配置文件已更改 SQL> select resource_name,limit from dba_profiles where resource_name='FAILED_LOGIN_ATTEMPTS'; RESOURCE_NAME LIMIT-------------------------------- ----------------------------------------FAILED_LOGIN_ATTEMPTS 3 b.重现错误登陆 正确登陆 SQL> conn jd/jd已连接。 第一次登录失败SQL> conn jd/jhERROR:ORA-01017: invalid username/password; logon denied 警告: 您不再连接到 ORACLE。 第二次登陆失败SQL> conn jd/juERROR:ORA-01017: invalid username/password; logon denied 第三次登录失败 SQL> conn jd/jlERROR:ORA-01017: invalid username/password; logon denied 连续三次登录失败后,账户被锁定 SQL> conn jd/jyERROR:ORA-28000: the account is locked 3. 解锁 SQL> conn /as sysdba已连接。SQL> alter user jd account unlock; 用户已更改。4. 解决方案(1) 可以考虑查询应用部署中错误的password或者数据库连接等可能导致错误password的地方,彻底的查询问题所在。(2) 修改参数failed_login_attempts=unlimited SQL> alter profile default limit failed_login_attempts unlimited; 配置文件已更改 SQL> select resource_name,limit from dba_profiles where resource_name='FAILED_LOGIN_ATTEMPTS'; RESOURCE_NAME LIMIT-------------------------------- ----------------------------------------FAILED_LOGIN_ATTEMPTS UNLIMITED5. 扩展知识点及备注说明(1) Q: FAILED_LOGIN_ATTEMPTS=3 3的含义是什么?是累计失败次数还是连续失败次数?A: FAILED_LOGIN_ATTEMPTS=3的含义是从第一次登录失败开始计算,连续登陆失败的次数。而不是累计失败的次数。试验如下: SQL> conn /as sysdba已连接。SQL> alter profile default limit failed_login_attempts 3; 配置文件已更改 SQL> conn jd/jd已连接。 第一次登录失败SQL> conn jd/jhERROR:ORA-01017: invalid username/password; logon denied 警告: 您不再连接到 ORACLE。 第二次登陆失败SQL> conn jd/ghERROR:ORA-01017: invalid username/password; logon denied 登录正确 SQL> conn jd/jd已连接。 第一次登录失败SQL> conn jd/dfERROR:ORA-01017: invalid username/password; logon denied 警告: 您不再连接到 ORACLE。 第二次登陆失败SQL> conn jd/sdERROR:ORA-01017: invalid username/password; logon denied 第三次登录失败 SQL> conn jd/fgERROR:ORA-01017: invalid username/password; logon denied 三次登录失败之后,用户被锁定 SQL> conn jd/hjERROR:ORA-28000: the account is locked (2) Q: 如何从数据库中查询当前FAILED_LOGIN_ATTEMPTS的值?dba_profiles是限额,并不代表当前值,如果查询当前失败的值怎么查?A: select NAME,LCOUNT from user$,user$为view dba_users的基表,通常可以查询一下试图对应的基表,oracle可能会隐藏一些参数
一次连接数据库怎么也连接不上,查了多方面资料,终于找到答案,总结 首先应该保证数据库的服务启动 在myeclipse的数据库视图中点 右键->new 弹出database driver的窗口, Driver template选择oracle(thin driver), Driver name 输入oracle connection URL=jdbc:oracle:thin:@localhost:1521:oracle 注意localhost:1521:oracle中的oracle是数据库得sid换成你自己数据库的sid就可以 username:登陆数据库具有system权限的用户名 password:登陆数据库具有system权限的密码 点击add jar 选择ojdbc14.jar的存放位置,没有得可以到百度下一个叫ojdbc14.jar的文件。 点击test driver 到此成功配置。 关于启动数据库后提示ora-12505的解决方法: "listener does not currently know of SID given in connect descriptor" 第一种可能 是配置得数据库sid名不正确localhost:1521:oracle 即红字部分不是你本机得sid,那么如何查看本机得sid呢?用如下命令 SELECT NAME FROM v$database;在sqlplus中执行就可以看到,把红字部分换成查询出来的sid就可以。 第二种可能 发现sid配置没有错误,但是还是报错,那可能就是oracle得监听配置出了问题,需要检查listener.ora文件,用记事本打开, 正确配置如下: # listener.ora Network Configuration File: e:\oracle\product\10.2.0\db_1\network\admin\listener.ora # Generated by Oracle configuration tools. SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (SID_NAME = PLSExtProc) (ORACLE_HOME = e:\oracle\product\10.2.0\db_1) (PROGRAM = extproc) ) (SID_DESC = (GLOBAL_DBNAME = oracle) (ORACLE_HOME = e:\oracle\product\10.2.0\db_1) (SID_NAME = oracle) ) ) LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1)) (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521)) ) ) 红字部分改成oracle创建时候的sid 保存退出。 --------------------------------------------------------------------- (SID_DESC = (GLOBAL_DBNAME = oracle) (ORACLE_HOME = e:\oracle\product\10.2.0\db_1) (SID_NAME = oracle) ) GLOBAL_DBNAME= 的内容是用SYSTEM用户登录之后新建sql执行以下代码 :SELECT NAME FROM v$database; 查询出来的数据就是等号后面的内容,切记两个红色字体的名称一定要相同 如果没有这段代码请复制到你的文件中,然后把ORACLE_HOME这个路径修改一下切记两个蓝色路径一定要相同 ----------------------------------------------------------------------
欢迎关注大数据和人工智能技术文章发布的微信公众号:清研学堂,在这里你可以学到夜白(作者笔名)精心整理的笔记,让我们每天进步一点点,让优秀成为一种习惯! 一次连接数据库怎么也连接不上,查了多方面资料,终于找到答案,总结 首先应该保证数据库的服务启动 在myeclipse的数据库视图中点 右键->new 弹出database driver的窗口, Driver template选择oracle(thin driver), Driver name 输入oracle connection URL=jdbc:oracle:thin:@localhost:1521:oracle 注意localhost:1521:oracle中的oracle是数据库得sid换成你自己数据库的sid就可以 username:登陆数据库具有system权限的用户名 password:登陆数据库具有system权限的密码 点击add jar 选择ojdbc14.jar的存放位置,没有得可以到百度下一个叫ojdbc14.jar的文件。 点击test driver 到此成功配置。 关于启动数据库后提示ora-12505的解决方法: "listener does not currently know of SID given in connect descriptor" 第一种可能 是配置得数据库sid名不正确localhost:1521:oracle 即红字部分不是你本机得sid,那么如何查看本机得sid呢?用如下命令 SELECT NAME FROM v$database;在sqlplus中执行就可以看到,把红字部分换成查询出来的sid就可以。 第二种可能 发现sid配置没有错误,但是还是报错,那可能就是oracle得监听配置出了问题,需要检查listener.ora文件,用记事本打开, 正确配置如下: # listener.ora Network Configuration File: e:\oracle\product\10.2.0\db_1\network\admin\listener.ora # Generated by Oracle configuration tools. SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (SID_NAME = PLSExtProc) (ORACLE_HOME = e:\oracle\product\10.2.0\db_1) (PROGRAM = extproc) ) (SID_DESC = (GLOBAL_DBNAME = oracle) (ORACLE_HOME = e:\oracle\product\10.2.0\db_1) (SID_NAME = oracle) ) ) LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1)) (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521)) ) ) 红字部分改成oracle创建时候的sid 保存退出。 --------------------------------------------------------------------- (SID_DESC = (GLOBAL_DBNAME = oracle) (ORACLE_HOME = e:\oracle\product\10.2.0\db_1) (SID_NAME = oracle) ) GLOBAL_DBNAME= 的内容是用SYSTEM用户登录之后新建sql执行以下代码 :SELECT NAME FROM v$database; 查询出来的数据就是等号后面的内容,切记两个红色字体的名称一定要相同 如果没有这段代码请复制到你的文件中,然后把ORACLE_HOME这个路径修改一下切记两个蓝色路径一定要相同 ----------------------------------------------------------------------
一次连接数据库怎么也连接不上,查了多方面资料,终于找到答案,总结 首先应该保证数据库的服务启动 在myeclipse的数据库视图中点 右键->new 弹出database driver的窗口, Driver template选择oracle(thin driver), Driver name 输入oracle connection URL=jdbc:oracle:thin:@localhost:1521:oracle 注意localhost:1521:oracle中的oracle是数据库得sid换成你自己数据库的sid就可以 username:登陆数据库具有system权限的用户名 password:登陆数据库具有system权限的密码 点击add jar 选择ojdbc14.jar的存放位置,没有得可以到百度下一个叫ojdbc14.jar的文件。 点击test driver 到此成功配置。 关于启动数据库后提示ora-12505的解决方法: "listener does not currently know of SID given in connect descriptor" 第一种可能 是配置得数据库sid名不正确localhost:1521:oracle 即红字部分不是你本机得sid,那么如何查看本机得sid呢?用如下命令 SELECT NAME FROM v$database;在sqlplus中执行就可以看到,把红字部分换成查询出来的sid就可以。 第二种可能 发现sid配置没有错误,但是还是报错,那可能就是oracle得监听配置出了问题,需要检查listener.ora文件,用记事本打开, 正确配置如下: # listener.ora Network Configuration File: e:\oracle\product\10.2.0\db_1\network\admin\listener.ora # Generated by Oracle configuration tools. SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (SID_NAME = PLSExtProc) (ORACLE_HOME = e:\oracle\product\10.2.0\db_1) (PROGRAM = extproc) ) (SID_DESC = (GLOBAL_DBNAME = oracle) (ORACLE_HOME = e:\oracle\product\10.2.0\db_1) (SID_NAME = oracle) ) ) LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1)) (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521)) ) ) 红字部分改成oracle创建时候的sid 保存退出。 --------------------------------------------------------------------- (SID_DESC = (GLOBAL_DBNAME = oracle) (ORACLE_HOME = e:\oracle\product\10.2.0\db_1) (SID_NAME = oracle) ) GLOBAL_DBNAME= 的内容是用SYSTEM用户登录之后新建sql执行以下代码 :SELECT NAME FROM v$database; 查询出来的数据就是等号后面的内容,切记两个红色字体的名称一定要相同 如果没有这段代码请复制到你的文件中,然后把ORACLE_HOME这个路径修改一下切记两个蓝色路径一定要相同 ----------------------------------------------------------------------
欢迎关注大数据和人工智能技术文章发布的微信公众号:清研学堂,在这里你可以学到夜白(作者笔名)精心整理的笔记,让我们每天进步一点点,让优秀成为一种习惯! 使用 sudo docker search Oracle 命令搜索Oracle数据库镜像文件,这里发现已经有人发布了相关镜像,链接:https://hub.docker.com/r/sath89/oracle-12c/,直接按照说明,使用pull命令下载镜像。下载完成后如下所示: 下载镜像之后,我们 需要参照作者的说明启动数据库,第一次启动需要对数据库进行配置,首先使用命令 sudo docker run -d -p 8080:8080 -p 1521:1521 sath89/oracle-12c 启动镜像,并映射相关端口,这里是8080和1521端口 这是我们可以去查看docker的日志文件: 当我们输入docker logs -f 镜像id后,会输出这个镜像操作的日志文件,等待5分钟左右,Oracle会启动成功,并且没有出现报错。 这是,我们可以进入镜像的bash对数据库进行进一步的操作: 如图所示,我们可以看到,使用docker的exec命令进入镜像的bash,并且查看了镜像启动的端口信息。 查看Oracle的service_names,转到Oracle的HOME目录下: Cd $ORACLE_HOME 使用dba账户登录Oracle 到此为止,说明Oracle的docker镜像安装启动完毕,接下来配置Oracle的客户端。 下载pl/sql客户端:https://www.allroundautomations.com/bodyplsqldevreg.html 下载Oracle客户端:http://www.oracle.com/technetwork/topics/winx64soft-089540.html 安装pl/sql客户端,这个不需要特别配置,接下来配置Oracle客户端. 将下载的Oracle客户端文件解压,并放在特定目录下,这里以D盘为例。 1、新建ORACLE_HOME环境变量: 2、新建NLS_LANG环境变量,将值设置为:SIMPLIFIED CHINESE_CHINA.ZHS16GBK 3、新建TNS_ADMIN环境变量,将值设置为admin目录,这个admin目录需要自己在Oracle客户端的目录下自己创建。 然后将D:\oraclient目录添加到path环境变量下。 接下来,在新建的admin目录下创建一个tnsnames.ora的文件,写入文件配置: MyDB= (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST= 192.168.83.135)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = xe) ) ) host是服务器地址,port是Oracle端口,这里需要注意SERVICE_NAME,即是我们在前面查看到的service_name的值。 然后打开plsql客户端 填写Oracle用户名密码进行登录,登录成功就可以进行数据库操作了。
欢迎关注大数据和人工智能技术文章发布的微信公众号:清研学堂,在这里你可以学到夜白(作者笔名)精心整理的笔记,让我们每天进步一点点,让优秀成为一种习惯! 使用HiveServer2运行时,启动好HiveServer后运行 private static String url = "jdbc:hive2://192.168.213.132:10000/default"; 连接hiveserver2时 出现 java.lang.RuntimeException: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.security.authorize.AuthorizationException): User root is not allowed to impersonate anonymous 错误。 修改hadoop 配置文件 etc/hadoop/core-site.xml,加入如下配置项 <property> <name>hadoop.proxyuser.root.hosts</name> <value>*</value> </property> <property> <name>hadoop.proxyuser.root.groups</name> <value>*</value> </property> hadoop.proxyuser.root.hosts配置项名称中root部分为报错User:* 中的用户名部分 例如User: zhaoshb is not allowed to impersonate anonymous则需要将xml变更为如下格式 <property> <name>hadoop.proxyuser.zhaoshb.hosts</name> <value>*</value> </property> <property> <name>hadoop.proxyuser.zhaoshb.groups</name> <value>*</value> </property>最后重启hadoop即可,大功告成!
欢迎关注大数据和人工智能技术文章发布的微信公众号:清研学堂,在这里你可以学到夜白(作者笔名)精心整理的笔记,让我们每天进步一点点,让优秀成为一种习惯! 有时候,当我们使用“mysql”、“mysqladmin”、“mysqldump”等命令管理数据库时,服务器抛出类似如下错误: 一、错误现场还原:下面我们通过三种方式来连接,然后观察提示的错误信息: 1、直接使用“mysql”命令,不带主机名参数; 2、使用带了主机名“localhost”参数的“mysql -h localhost”命令; 3、使用带了主机名“127.0.0.1”参数的“mysql -h 127.0.0.1”命令。 1、[root@lam7 opt]# mysqlERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)2、[root@lam7 opt]# mysql -h localhostERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2) [root@lam7 opt]# mysql -h 127.0.0.1 (用此方法是可以进入到MariaDB ,可以进入之后忽略此问题)Welcome to the MariaDB monitor. Commands end with ; or \g.Your MariaDB connection id is 244Server version: 10.1.19-MariaDB Source distribution Copyright (c) 2000, 2013, Oracle, Monty Program Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. 3、[root@lam7 opt]# mysql -h 127.0.0.1 (PS:有些用户也会出现此问题)ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO) 通过上面实验可以看出,前面两种方式都能产生标题中的错误,而第三种方式连接是不会产生标题中的错误的(第三种方式这里产生的是由于密码问题拒绝访问的错误信息) 二、错误产生原因解析: 这是由于我们连接数据库使用的主机名参数为“localhost”,或者未使用主机名参数、服务器默认使用“localhost”做为主机名。 使用主机名参数为“localhost”连接mysql服务端时,mysql客户端会认为是连接本机,所以会尝试以socket文件方式进行连接(socket文件连接方式,比“ip:端口”方式效率更高),这时根据配置文件“/etc/mysql.cnf”的路径,未找到相应的socket文件,就会引发此错误。 三、修复故障前准备:1、看mysql服务是否在运行: 由于“socket”文件是由mysql服务运行时创建的,如果提示“ERROR 2002 (HY000): Can't connect to local MySQL server through socket '***' (2)”,找不到“socket”文件,我们首先要确认的是mysql服务是否正在运行。 #1:端口是否打开 [root@lam7 opt]# lsof -i:3306COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAMEmysqld 57436 mysql 17u IPv6 160456 0t0 TCP *:mysql (LISTEN) #2:mysqld服务是否正在运行(小七这边用的是centos7,所以会提示使用“/bin/systemctl status mysqld.service”) [root@lam7 opt]# service mysqld statusRedirecting to /bin/systemctl status mysqld.servicemysqld.serviceLoaded: not-found (Reason: No such file or directory)Active: inactive (dead) #3:如果mariaDB,同样方法查服务是否正在运行: [root@lam7 opt]# service mariadb statusRedirecting to /bin/systemctl status mariadb.servicemariadb.service - MariaDB database serverLoaded: loaded (/usr/lib/systemd/system/mariadb.service; disabled)Active: inactive (dead) #4mysqld服务是否正在运行(此现状是mysql服务正常运行) [root@lam7 opt]# service mariadb statusRedirecting to /bin/systemctl status mariadb.service● mariadb.service - MariaDB database serverLoaded: loaded (/usr/lib/systemd/system/mariadb.service; disabled; vendor preset: disabled)Active: active (running) since 二 2016-11-22 20:09:01 CST; 10min ago 2、确定“socket”文件正确位置: 确定mysql服务正常运行后,产生此错误的原因只剩下“socket”文件路径不正确了,我们可以使用“find”命令或者“lsof”命令来确定socket文件的正确路径: [root@lam7 opt]# lsof -c mysqld|grep sock$lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfsOutput information may be incomplete.mysqld 57436 mysql 18u unix 0xffff88000b55f440 0t0 160457 /opt/lampp/var/mysql/mysql.sock [root@lam7 opt]# find / -name '*.sock'/storage/db/mysql/mysql.sock 四、故障解决方法:解决方案一: 修改“/etc/my.cnf”配置文件,在/etc/php.ini文件中"[MySQL]"项下找到"mysql.default_socket",并设置其值指向正确的mysql服务socket文件即可, 在配置文件中添加“[client]”选项和“[mysql]”选项,并使用这两个选项下的“socket”参数值,与“[mysqld]”选项下的“socket”参数值,指向的socket文件路径完全一致。如下: [mysqld]datadir=/storage/db/mysqlsocket=/storage/db/mysql/mysql.sock...省略n行[client]default-character-set=utf8socket=/storage/db/mysql/mysql.sock[mysql]default-character-set=utf8socket=/storage/db/mysql/mysql.sock 修改完后,重启mysqld服务,即可解决此问题。 解决方案二:(夜白是用此方法解决的问题) 使用“ln -s /storage/db/mysql/mysql.sock /var/lib/mysql/mysql.sock”命令,将正确的socket文件位置,软链接到提示错误的socket文件路径位置,即可解决此问题: [root@lam7 opt]# ls /var/lib/mysql/mysql.sockls: 无法访问/var/lib/mysql/mysql.sock: 没有那个文件或目录 [root@lam7 opt]# ln -s /storage/db/mysql/mysql.sock /var/lib/mysql/mysql.sock[root@lam7 opt]# ls /var/lib/mysql/mysql.sock/var/lib/mysql/mysql.sock 这边讲述了mysql提供的“mysql”、“mysqldump”、“mysqladmin”等命令提示“ERROR 2002 (HY000): Can't connect to local MySQL server through socket '***' (2)”的解决方法,如果需要解决“php”、“perl”、“python”等脚本语言提示此错误的问题
欢迎关注大数据和人工智能技术文章发布的微信公众号:清研学堂,在这里你可以学到夜白(作者笔名)精心整理的笔记,让我们每天进步一点点,让优秀成为一种习惯! 第一步: vim /etc/mysql/my.cnf找到bind-address = 127.0.0.1 注释掉这行,如:#bind-address = 127.0.0.1 或者改为: bind-address = 0.0.0.0 允许任意IP访问; 或者自己指定一个IP地址。 重启 MySQL:sudo /etc/init.d/mysql restart 第二步: 授权用户能进行远程连接 grant all privileges on *.* to root@"%" identified by "password" with grant option; flush privileges; 第一行命令解释如下,*.*:第一个*代表数据库名;第二个*代表表名。这里的意思是所有数据库里的所有表都授权给用户。root:授予root账号。“%”:表示授权的用户IP可以指定,这里代表任意的IP地址都能访问MySQL数据库。“password”:分配账号对应的密码,这里密码自己替换成你的mysql root帐号密码。 第二行命令是刷新权限信息,也即是让我们所作的设置马上生效。
第一步: vim /etc/mysql/my.cnf找到bind-address = 127.0.0.1 注释掉这行,如:#bind-address = 127.0.0.1 或者改为: bind-address = 0.0.0.0 允许任意IP访问; 或者自己指定一个IP地址。 重启 MySQL:sudo /etc/init.d/mysql restart 第二步: 授权用户能进行远程连接 grant all privileges on *.* to root@"%" identified by "password" with grant option; flush privileges; 第一行命令解释如下,*.*:第一个*代表数据库名;第二个*代表表名。这里的意思是所有数据库里的所有表都授权给用户。root:授予root账号。“%”:表示授权的用户IP可以指定,这里代表任意的IP地址都能访问MySQL数据库。“password”:分配账号对应的密码,这里密码自己替换成你的mysql root帐号密码。 第二行命令是刷新权限信息,也即是让我们所作的设置马上生效。
欢迎关注大数据和人工智能技术文章发布的微信公众号:清研学堂,在这里你可以学到夜白(作者笔名)精心整理的笔记,让我们每天进步一点点,让优秀成为一种习惯! 一直在尝试以官方CentOS镜像为基础,制作基于CentOS的MySQL镜像。但是制作后发现镜像大小已经超过1.5G,这对于一般的Docker镜像来说太臃肿了。Docker Hub官方提供的CentOS镜像才324MB。目前来说我还没有找到什么好的方法把我制作的镜像的体积减下来,所以就先使用官方的吧! 一、下载官方的mysql镜像 docker pull mysql 下载完成后查看镜像: [root@localhost mysql_data]# docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE mysql latest e206c8d4ffcf 4 days ago 324.3 MB 二、生成容器 我在第一次生成容器时使用之前生成容器的方法,生成的容器运行后会马上退出。 [root@localhost mysql_data]# docker run -d -P mysql c98c9e052d5d5a7981218140f0128390190e0e8d6e72d78ca05a29e2ed161c9f [root@localhost mysql_data]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c98c9e052d5d mysql "/entrypoint.sh mysq 4 seconds ago Exited (1) 3 seconds ago mad_kirch 查看logs [root@localhost mysql_data]# docker logs c98c error: database is uninitialized and MYSQL_ROOT_PASSWORD not set Did you forget to add -e MYSQL_ROOT_PASSWORD=... ? 提示说是因为没有使用参数MYSQL_ROOT_PASSWORD 但是除了这个参数还有没有其他参数呢?想到这里,我看到生成容器时,调用的启动脚本是/entrypoint.sh,我想应该查一下这个脚本的内容确定一下。 但是这个容器无法启动,根本就没法查看,那只能是新生成一个查看/entrypoint.sh脚本的容器了: [root@localhost mysql_data]# docker run mysql cat /entrypoint.sh #!/bin/bash set -e # if command starts with an option, prepend mysqld if [ "${1:0:1}" = '-' ]; then set -- mysqld "$@" fi if [ "$1" = 'mysqld' ]; then # Get config DATADIR="$("$@" --verbose --help 2>/dev/null | awk '$1 == "datadir" { print $2; exit }')" if [ ! -d "$DATADIR/mysql" ]; then if [ -z "$MYSQL_ROOT_PASSWORD" -a -z "$MYSQL_ALLOW_EMPTY_PASSWORD" ]; then echo >&2 'error: database is uninitialized and MYSQL_ROOT_PASSWORD not set' echo >&2 ' Did you forget to add -e MYSQL_ROOT_PASSWORD=... ?' exit 1 fi mkdir -p "$DATADIR" chown -R mysql:mysql "$DATADIR" echo 'Running mysql_install_db' mysql_install_db --user=mysql --datadir="$DATADIR" --rpm --keep-my-cnf echo 'Finished mysql_install_db' mysqld --user=mysql --datadir="$DATADIR" --skip-networking & pid="$!" mysql=( mysql --protocol=socket -uroot ) for i in {30..0}; do if echo 'SELECT 1' | "${mysql[@]}" &> /dev/null; then break fi echo 'MySQL init process in progress...' sleep 1 done if [ "$i" = 0 ]; then echo >&2 'MySQL init process failed.' exit 1 fi # sed is for https://bugs.mysql.com/bug.php?id=20545 mysql_tzinfo_to_sql /usr/share/zoneinfo | sed 's/Local time zone must be set--see zic manual page/FCTY/' | "${mysql[@]}" mysql "${mysql[@]}" <<-EOSQL -- What's done in this file shouldn't be replicated -- or products like mysql-fabric won't work SET @@SESSION.SQL_LOG_BIN=0; DELETE FROM mysql.user ; CREATE USER 'root'@'%' IDENTIFIED BY '${MYSQL_ROOT_PASSWORD}' ; GRANT ALL ON *.* TO 'root'@'%' WITH GRANT OPTION ; DROP DATABASE IF EXISTS test ; FLUSH PRIVILEGES ; EOSQL if [ ! -z "$MYSQL_ROOT_PASSWORD" ]; then mysql+=( -p"${MYSQL_ROOT_PASSWORD}" ) fi if [ "$MYSQL_DATABASE" ]; then echo "CREATE DATABASE IF NOT EXISTS \`$MYSQL_DATABASE\` ;" | "${mysql[@]}" mysql+=( "$MYSQL_DATABASE" ) fi if [ "$MYSQL_USER" -a "$MYSQL_PASSWORD" ]; then echo "CREATE USER '"$MYSQL_USER"'@'%' IDENTIFIED BY '"$MYSQL_PASSWORD"' ;" | "${mysql[@]}" if [ "$MYSQL_DATABASE" ]; then echo "GRANT ALL ON \`"$MYSQL_DATABASE"\`.* TO '"$MYSQL_USER"'@'%' ;" | "${mysql[@]}" fi echo 'FLUSH PRIVILEGES ;' | "${mysql[@]}" fi echo for f in /docker-entrypoint-initdb.d/*; do case "$f" in *.sh) echo "$0: running $f"; . "$f" ;; *.sql) echo "$0: running $f"; "${mysql[@]}" < "$f" && echo ;; *) echo "$0: ignoring $f" ;; esac echo done if ! kill -s TERM "$pid" || ! wait "$pid"; then echo >&2 'MySQL init process failed.' exit 1 fi echo echo 'MySQL init process done. Ready for start up.' echo fi chown -R mysql:mysql "$DATADIR" fi exec "$@" 通过查看/entrypoint.sh脚本内容,总结参数如下 mysqld #启动mysql服务,必须使用 MYSQL_ROOT_PASSWORD #设置mysql的root密码,必须使用 #以下二个参数添加除root之外的用户并设置密码,可选。 MYSQL_USER MYSQL_PASSWORD #设置生成容器时需要新建的数据库,可选 MYSQL_DATABASE #容器的mysql数据库默认的保存路径是: /var/lib/mysql #容器的配置文件my.cnf的路径为: /etc/mysql/my.cnf 使用上要的参数生成新的容器: mkdir /mysql_data docker run -d -P -e mysqld -e MYSQL_ROOT_PASSWORD=147258 -e MYSQL_USER=steven -e MYSQL_PASSWORD=147258 -e MYSQL_DATABASE=discuz -v /mysql_data:/var/lib/mysql mysql 命令详解: 1、设置容器的mysql的root密码为”147258”; 2、新添加一个名为“steven”的用户,密码设置为“147258”; 3、在生成容器的同时新建一个名为“discuz”的数据库; 4、将宿主机的目录“/mysql_data”映射到容器的“/var/lib/mysql”目录。这是因为默认情况下数据库的数据库文件和日志文件都会存放于容器的AUFS文件层,这不仅不使得容器变得越来越臃肿,不便于迁移、备份等管理,而且数据库的性能也会受到影响。因此建议挂载到宿主机的目录到容器内。 查看新生成的容器: [root@localhost mysql_data]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 9a5733de65cf mysql "/entrypoint.sh mysq 4 seconds ago Up 3 seconds 0.0.0.0:32792->3306/tcp determined_lovelace 32c10755406e mysql "/entrypoint.sh cat 29 minutes ago Exited (0) 29 minutes ago jolly_torvalds c98c9e052d5d mysql "/entrypoint.sh mysq 34 minutes ago Exited (1) 34 minutes ago mad_kirch 容器的3306端口已经映射给了宿主机的32792端口。如果需要将容器的3306端口开放给指定的宿主机端口,请使用参数 “-p 宿主机端口:3306”。 查看本地的mysql_data是否生成容器内的数据库: [root@localhost ~]# ll /mysql_data/ 总用量 110608 -rw-rw---- 1 999 999 56 10月 18 09:55 auto.cnf drwx------ 2 999 999 4096 10月 18 09:55 discuz -rw-rw---- 1 999 999 12582912 10月 18 11:10 ibdata1 -rw-rw---- 1 999 999 50331648 10月 18 11:10 ib_logfile0 -rw-rw---- 1 999 999 50331648 10月 18 09:55 ib_logfile1 drwx------ 2 999 999 4096 10月 18 09:55 mysql drwx------ 2 999 999 4096 10月 18 09:55 performance_schema 已经生成相关的文件和默认数据库,同时也新建了”disucz”数据库. 测试:在宿主机上通过端口访问容器中的mysql服务: 安装 mysql yum -y install mysql 测试: [root@localhost ~]# mysql -u steven -p -h 127.0.0.1 -P 32792 Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 3 Server version: 5.6.27 MySQL Community Server (GPL) Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> 测试成功! 需要注意的是:宿主机上的UID和GID是999。这是容器里用户mysql的UID和GID。千万另进行权限变更,否则容器对这个目录进行读写就会出现问题。如果觉得不舒服,可以在本地新建一个mysql_docker的用户指定UID和GID是999。 三、进入到新生成的容器 由于官方的镜像没有提供sshd服务,所以可以选择在生成容器之前先自行安装sshd服务,重新生成镜像,然后再生成容器。这部分在之前的文章里提过,所以就不多说了。 另一种方法是使用exec命令直接进入到容器内部 查看生成的容器ID [root@localhost ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 9a5733de65cf mysql "/entrypoint.sh mysq 11 minutes ago Up 11 minutes 0.0.0.0:32792->3306/tcp determined_lovelace 使用exec进入容器,同时进行相关操作: [root@localhost ~]# docker exec -it 9a57 /bin/bash 查看进程: root@9a5733de65cf:/# ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND mysql 1 0.0 11.5 678020 118008 ? Ssl 03:10 0:00 mysqld root 33 0.3 0.1 20156 1916 ? Ss 03:23 0:00 /bin/bash root 38 0.0 0.1 17432 1140 ? R+ 03:23 0:00 ps aux 查看数据库所在的文件夹: root@9a5733de65cf:/# ls -l /var/lib/mysql/ total 110608 -rw-rw---- 1 mysql mysql 56 Oct 18 01:55 auto.cnf drwx------ 2 mysql mysql 4096 Oct 18 01:55 discuz -rw-rw---- 1 mysql mysql 50331648 Oct 18 03:10 ib_logfile0 -rw-rw---- 1 mysql mysql 50331648 Oct 18 01:55 ib_logfile1 -rw-rw---- 1 mysql mysql 12582912 Oct 18 03:10 ibdata1 drwx------ 2 mysql mysql 4096 Oct 18 01:55 mysql drwx------ 2 mysql mysql 4096 Oct 18 01:55 performance_schema 进入mysql: root@9a5733de65cf:/# mysql -u steven -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 2 Server version: 5.6.27 MySQL Community Server (GPL) Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> 四、修改容器中mysql的配置文件 默认镜像中并没有安装vi或者vim,需要手工安装。 apt-get update && apt-get -yq install vim 然后就可以使用vim 来修改mysql的配置文件: vim /etc/mysql/my.cnf 如果已经有一个比较成熟的my.cnf的配置方案,可以在宿主机上新建一个文件夹将已经设置好的my.cnf和conf.d这二个文件放到里面,在新建窗口的时候,直接使用参数”-v” 将这个文件夹映射到容器的”/etc/mysql”目录上即可。
Docker mysql 把数据存储在本地目录,很简单,只需要映射本地目录到容器即可 1、加上-v参数 $ docker run -d -e MYSQL_ROOT_PASSWORD=admin --name mysql -v /data/mysql/data:/var/lib/mysql -p 3306:3306 mysql 还可以指定配置文件 docker run -d -e MYSQL_ROOT_PASSWORD=admin --name mysql -v /data/mysql/my.cnf:/etc/mysql/my.cnf -v /data/mysql/data:/var/lib/mysql -p 3306:3306 mysql 这样,既可以修改配置文件,还能把数据存储在本地目录,一举两得,-v 参数可以多次使用,每次映射一个目录,通过这种方式,很容易进行配置。。
欢迎关注大数据和人工智能技术文章发布的微信公众号:清研学堂,在这里你可以学到夜白(作者笔名)精心整理的笔记,让我们每天进步一点点,让优秀成为一种习惯! 通过官方的文档可以看到运行MySQL容器的命令是: docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=mypwd -d mysql:tag 如:docker run --name mysqldb -e MYSQL_ROOT_PASSWORD=123456 -p 3336:3306 -d mysql:5.7 说明: docker run:运行容器 --name:指定容器名称,这里指定的名称为mysqldb -e:指定环境参数,e是environment的缩写,在运行MySQL容器时可以指定的环境参数有: MYSQL_ROOT_PASSWORD : root用户的密码,这里设置的初始化密码为`123456`; MYSQL_DATABASE : 运行时需要创建的数据库名称; MYSQL_USER : 运行时需要创建用户名,与MYSQL_PASSWORD一起使用; MYSQL_PASSWORD : 运行时需要创建的用户名对应的密码,与MYSQL_USER一起使用; MYSQL_ALLOW_EMPTY_PASSWORD : 是否允许root用户的密码为空,该参数对应的值为:yes; MYSQL_RANDOM_ROOT_PASSWORD:为root用户生成随机密码; MYSQL_ONETIME_PASSWORD : 设置root用户的密码必须在第一次登陆时修改(只对5.6以上的版本支持)。 MYSQL_ROOT_PASSWORD 和 MYSQL_RANDOM_ROOT_PASSWORD 两者必须有且只有一个。 -p 3336:3306:对外映射容器内的端口号,这里将容器里的3306映射到外部可访问的3336端口 -d:后台运行 mysql:5.7:运行5.7这个版本的mysql 在这篇文章中讲述了如何在hub.docker.com中查找镜像,也简单介绍了一些docker的命令,在下一节中主要讲解docker的一些常用命令。 本文章来自【知识林】
通过官方的文档可以看到运行MySQL容器的命令是: docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=mypwd -d mysql:tag 如:docker run --name mysqldb -e MYSQL_ROOT_PASSWORD=123456 -p 3336:3306 -d mysql:5.7 说明: docker run:运行容器 --name:指定容器名称,这里指定的名称为mysqldb -e:指定环境参数,e是environment的缩写,在运行MySQL容器时可以指定的环境参数有: MYSQL_ROOT_PASSWORD : root用户的密码,这里设置的初始化密码为`123456`; MYSQL_DATABASE : 运行时需要创建的数据库名称; MYSQL_USER : 运行时需要创建用户名,与MYSQL_PASSWORD一起使用; MYSQL_PASSWORD : 运行时需要创建的用户名对应的密码,与MYSQL_USER一起使用; MYSQL_ALLOW_EMPTY_PASSWORD : 是否允许root用户的密码为空,该参数对应的值为:yes; MYSQL_RANDOM_ROOT_PASSWORD:为root用户生成随机密码; MYSQL_ONETIME_PASSWORD : 设置root用户的密码必须在第一次登陆时修改(只对5.6以上的版本支持)。 MYSQL_ROOT_PASSWORD 和 MYSQL_RANDOM_ROOT_PASSWORD 两者必须有且只有一个。 -p 3336:3306:对外映射容器内的端口号,这里将容器里的3306映射到外部可访问的3336端口 -d:后台运行 mysql:5.7:运行5.7这个版本的mysql 在这篇文章中我们讲述了如何在hub.docker.com中查找镜像,也简单介绍了一些docker的命令,希望对大家有所帮助。
欢迎关注大数据和人工智能技术文章发布的微信公众号:清研学堂,在这里你可以学到夜白(作者笔名)精心整理的笔记,让我们每天进步一点点,让优秀成为一种习惯! 今天在进入hbase shell终端进行数据查询和添加时,发现输入的命令无法撤回,现将解决办法写下: 1.使用Ctrl + Backspace或Shift + Backspace组合键删除2.(SecureCRT)选项--会话选项--仿真--终端--选择Linux选项--会话选项--映射键--勾上:backspace发送delete和delete发送backspace
欢迎关注大数据和人工智能技术文章发布的微信公众号:清研学堂,在这里你可以学到夜白(作者笔名)精心整理的笔记,让我们每天进步一点点,让优秀成为一种习惯! 今天在启动HBase时发现如下错误:/bin/java: No such file or directory6/bin/../bin/hbase: line 412: /usr/local/jdk1.8.0_152/bin/java,而在我的hbase-env.sh中又JAVA_HOME,路径也是正确的,可为什么还会报这个错误呢?后来我才发现是因为我使用的hbase-env.sh文件是我自己创建的,而不是hbase目录中本身存在的那个配置文件,hbase不认可这种自己创建的配置文件因此才报错,特此写一篇博客记录这个错误,也让后来者少走弯路,避免犯下和我一样的错误!
一、安装和启动SSH协议 假设没有安装ssh和rsync,可以通过下面命令进行安装。 sudo apt-get install ssh 安装SSH协议 sudo apt-get install rsync service sshd restart 启动服务 (rsync是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件) 确保所有的服务器都安装,上面命令执行完毕,各台机器之间可以通过密码验证相互登。 Last login: Mon Oct 29 14:01:11 2012 from 10.196.80.99 hadoop@namenode:~$ ssh localhost The authenticity of host 'localhost (127.0.0.1)' can't be established. ECDSA key fingerprint is c0:b3:7d:6d:17:94:02:e1:e4:67:39:4f:08:ff:74:cf. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added 'localhost' (ECDSA) to the list of known hosts. hadoop@localhost's password: … … Last login: Mon Oct 29 14:25:47 2012 from 10.196.80.99 hadoop@namenode:~$ hadoop@namenode:~$ ssh datanode1 The authenticity of host 'datanode1 (10.196.80.91)' can't be established. ECDSA key fingerprint is dc:8b:7b:82:25:74:0c:ec:15:a7:3b:2a:e6:c3:a0:2e. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added 'datanode1,10.196.80.91' (ECDSA) to the list of known hosts. hadoop@datanode1's password: Welcome to Ubuntu 12.04.1 LTS (GNU/Linux 3.2.0-29-generic-pae i686) … … hadoop@datanode1:~$ 二、配置Master无密码登录所有Salve 1)SSH无密码原理 Master(NameNode |JobTracker)作为客户端,要实现无密码公钥认证,连接到服务器Salve(DataNode |Tasktracker)上时,需要在Master上生成一个密钥对,包括一个公钥和一个私钥,而后将公钥复制到所有的Slave上。 当Master通过SSH连接Salve时,Salve就会生成一个随机数并用Master的公钥对随机数进行加密,并发送给Master。Master收到加密数之后再用私钥解密,并将解密数回传给Slave,Slave确认解密数无误之后就允许Master进行连接了。这就是一个公钥认证过程,其间不需要用户手工输入密码。 重要过程是将客户端Master复制到Slave上。 2)Master机器上生成密码对 在Master节点上执行以下命令: ssh-keygen –t rsa –P '' 这条命令是生成其无密码密钥对,询问其保存路径时直接回车采用默认路径。生成的密钥对:id_rsa和id_rsa.pub,默认存储在"/home/hadoop/.ssh"目录下。 hadoop@namenode:~$ ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key (/home/hadoop/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/hadoop/.ssh/id_rsa. Your public key has been saved in /home/hadoop/.ssh/id_rsa.pub. The key fingerprint is: c8:5e:3e:c1:9b:52:6f:24:a5:e4:c1:1c:00:8d:fb:3b hadoop@namenode The key's randomart image is: +--[ RSA 2048]----+ | .+... | | . .o . | | . = . | | .. = + | | .o S . | | ..+ B | | o.= o | | E. o | | . | +-----------------+ hadoop@namenode:~$ 查看"/home/hadoop/"下是否有".ssh"文件夹,且".ssh"文件下是否有两个刚生产的无密码密钥对。 hadoop@namenode:~/.ssh$ cat id_rsa.pub >> authorized_keys 在验证前,需要做两件事儿。第一件事儿是修改文件"authorized_keys"权限(权限的设置非常重要,因为不安全的设置安全设置,会让你不能使用RSA功能),另一件事儿是用root用户设置"/etc/ssh/sshd_config"的内容。使其无密码登录有效。 hadoop@namenode:~/.ssh$ chmod 600 authorized_keys 备注:如果不进行设置,在验证时,扔提示你输入密码,在这里花费了将近半天时间来查找原因。 3) 设置SSH配置 用root用户登录服务器修改SSH配置文件"/etc/ssh/sshd_config"的下列内容。(在Ubuntu12.04系统里面,貌似不用修改此文件) 1.RSAAuthentication yes # 启用 RSA 认证 2.PubkeyAuthentication yes # 启用公钥私钥配对认证方式 3.AuthorizedKeysFile /home/hadoop/.ssh/authorized_keys # 公钥文件路径(和上面生成的文件同) 退出root登录,使用hadoop普通用户验证是否成功 hadoop@namenode:~/.ssh$ ssh localhost Welcome to Ubuntu 12.04.1 LTS (GNU/Linux 3.2.0-29-generic-pae i686) * Documentation: https://help.ubuntu.com/ 191 packages can be updated. 51 updates are security updates. Last login: Mon Oct 29 14:43:08 2012 from localhost hadoop@namenode:~$ 从上图中得知无密码登录本级已经设置完毕,接下来的事儿是把公钥复制所有的Slave机器上。使用下面的命令格式进行复制公钥: scp ~/.ssh/id_rsa.pub 远程用户名@远程服务器IP:~/ 例如: scp ~/.ssh/id_rsa.pub hadoop@10.196.80.1:~/ 上面的命令是复制文件"id_rsa.pub"到服务器IP为"10.196.80.91"的用户为"hadoop"的"/home/hadoop/"下面。 4)把namenode上的公钥复制到datanode1上 先在每个slave机器的/home/hadoop/下新建 .ssh 文件夹。 hadoop@namenode:~/.ssh$ scp authorized_keys hadoop@datanode1:/home/hadoop/.ssh/ hadoop@datanode1's password: authorized_keys 100% 397 0.4KB/s 00:00 hadoop@namenode:~/.ssh$ 从上图中我们得知,已经把文件"id_rsa.pub"传过去了,因为并没有建立起无密码连接,所以在连接时,仍然要提示输入输入database1服务器用户hadoop的密码。为了确保确实已经把文件传过去了,用SecureCRT登录datanode1:10.196.80.91服务器,查看"/home/hadoop/"下是否存在.ssh这个文件夹。存在的话然后是修改文件夹".ssh"的用户权限,把他的权限修改为"700",用下面命令执行: chmod 700 ~/.ssh 备注:如果不进行,即使你按照前面的操作设置了"authorized_keys"权限,并配置了"/etc/ssh/sshd_config",还重启了sshd服务,在Master能用"ssh localhost"进行无密码登录,但是对Slave1.Hadoop进行登录仍然需要输入密码,就是因为".ssh"文件夹的权限设置不对。这个文件夹".ssh"在配置SSH无密码登录时系统自动生成时,权限自动为"700",如果是自己手动创建,它的组权限和其他权限都有,这样就会导致RSA无密码远程登录失败。 5)追加到授权文件"authorized_keys" 到目前为止Master.Hadoop的公钥也有了,文件夹".ssh"也有了,且权限也修改了。这一步就是把Master.Hadoop的公钥追加到Slave1.Hadoop的授权文件"authorized_keys"中去。使用下面命令进行追加并修改"authorized_keys"文件权限: cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys 用root用户修改"/etc/ssh/sshd_config" 具体步骤参考前面Master.Hadoop的"设置SSH配置",具体分为两步:第1是修改配置文件;第2是重启SSH服务。 【Ubuntu下不用这一步操作貌似也是可以的。】 用namenode使用SSH无密码登录datanode* 当前面的步骤设置完毕,就可以使用下面命令格式进行SSH无密码登录了。 ssh 远程服务器IP 最后记得把所有Slave节点的"/home/hadoop/.ssh"目录下的"id_rsa.pub"文件删除掉。 rm –r ~/id_rsa.pub 到此为止,我们经过前5步已经实现了从"Master"到"Slave1"SSH无密码登录,下面就是重复上面的步骤把剩余的两台(Slave2和Slave3)Slave服务器进行配置。这样,我们就完成了"配置Master无密码登录所有的Slave服务器"。 6)配置所有Slave无密码登录Master 和Master无密码登录所有Slave原理一样,就是把Slave的公钥追加到Master的".ssh"文件夹下的"authorized_keys"中,记得是追加(>>)。 操作之前,先把namenode的/etc/hosts文件通过scp复制到各个datanodede 的/home/hadoop/Downloads文件夹下,然后登陆各个namenode使用sudo cp命令覆盖hosts文件。 其他的datanode类似 首先创建"datanode2"自己的公钥和私钥,并把自己的公钥追加到"authorized_keys"文件中。用到的命令如下: ssh-keygen –t dsa–P '' cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys 接着是用命令"scp"复制"datanode"的公钥"id_dsa.pub"到"namenode"的"/home/hadoop/"目录下,并追加到"namenode"的"authorized_keys"中。 在"namenode"服务器的操作 用到的命令如下: cat id_dsa.pub >> authorized_keys 然后删除掉刚才复制过来的"id_rsa.pub"文件。 最后是测试从"datanode"到"namenode"无密码登录。 然后剩余机器同样的配置。
欢迎关注大数据和人工智能技术文章发布的微信公众号:清研学堂,在这里你可以学到夜白(作者笔名)精心整理的笔记,让我们每天进步一点点,让优秀成为一种习惯! 主从结构:HDFS、Yarn、HBase、storm、spark、zookeeper都存在单点故障问题 hadoop1.x没有解决方案 hadoop2.x利用zookeeper实现HA zookeeper是开源的分布式应用程序协调服务,是Google chubby的开源实现 zookeeper相当于一个数据库,可以实现HA,zookeeper的功能:配置管理、集群管理、分布式锁 zookeeper的体系结构:leader和follower zookeeper集群本身具有leader选举功能(解决单点故障问题,因此zookeeper集群至少需要三台)和数据同步功能(保证数据的安全性), 选举端口号:3888,同步端口号:2888 zookeeper也支持单点部署,不存在leader选举功能(paxos协议)和数据同步功能(zab协议),状态:standalone(单独的、独立的) paxos协议的核心思想:当多数server写成功,则任务数据写成功。如果有3个server,则两个写成功即可。 安装和配置zookeeper: 安装zookeeper:tar -zxvf zookeeper-3.4.10.tar.gz -C ~/training 配置zookeeper:配置ZOOKEEPER_HOME环境变量: vim ~/.bash_profile export ZOOKEEPER_HOME=/root/training/zookeeper-3.4.10 export PATH=$ZOOKEEPER_HOME/bin:$PATH source ~/.bash_profile zookeeper的核心配置文件:conf/zoo.cfg 使用cp zoo_sample.cfg zoo.cfg得到zoo.cfg zookeeper的安装模式: 1、单点模式:一台机器,不存在leader选举功能和数据同步功能 状态:standalone 修改配置文件zoo.cfg: 1、指定zookeeper中数据保存的目录: dataDir=/root/training/zookeeper-3.4.10/tmp 2、指定zookeeper的主机是谁: server.1=bigdata11:2888:3888 3、指定server.1的myid:1 2、集群模式:至少三台机器以上 具有leader选举功能和数据同步功能 状态:一个leader,多个follower 1、在bigdata12上安装和配置zookeeper: 安装zookeeper:tar -zxvf zookeeper-3.4.10.tar.gz -C ~/training 配置zookeeper:配置ZOOKEEPER_HOME环境变量: ZOOKEEPER_HOME=/root/training/zookeeper-3.4.10 PATH=$ZOOKEEPER_HOME/bin:$PAHT 2、修改配置文件zoo.cfg: 1、指定zookeeper中数据保存的目录: dataDir=/root/training/zookeeper-3.4.10/tmp 2、指定zookeeper的主机: server.1=bigdata12:2888:3888 server.2=bigdata13:2888:3888 server.3=bigdata14:2888:3888 3、指定server.1的myid:1 3、把bigdata12上的zookeeper复制到其他节点上: scp -r zookeeper-3.4.10 root@bigdata12:/root/training scp -r zookeeper-3.4.10 root@bigdata13:/root/training scp -r zookeeper-3.4.10 root@bigdata14:/root/training 4、修改bigdata13和bigdata14上的myid文件: 5、在每个节点上启动zookeeper:zkServer.sh start zookeeper的数据模型: zookeeper的数据模型类似于Linux文件系统,呈树形结构,每个目录称作一个z节点,每个z节点上可以存储少量数据,默认1M 启动zookeeper:zkServer.sh start 停止zookeeper:zkServer.sh stop 查看zookeeper的状态:zkServer.sh status 启动zookeeper的客户端命令行工具:zkCli.sh zookeeper的客户端命令行工具端口号:2181 在zookeeper中创建节点添加数据:create /mydata helloworld 在zookeeper中查看节点:get /mydata 作者:李金泽AllenLi,清华大学在读硕士,研究方向:大数据和人工智能
转载自:https://www.cnblogs.com/S-tec-songjian/p/5740691.html Hadoop YARN同时支持内存和CPU两种资源的调度(默认只支持内存,如果想进一步调度CPU,需要自己进行一些配置),本文将介绍YARN是如何对这些资源进行调度和隔离的。 在YARN中,资源管理由ResourceManager和NodeManager共同完成,其中,ResourceManager中的调度器负责资源的分配,而NodeManager则负责资源的供给和隔离。ResourceManager将某个NodeManager上资源分配给任务(这就是所谓的“资源调度”)后,NodeManager需按照要求为任务提供相应的资源,甚至保证这些资源应具有独占性,为任务运行提供基础的保证,这就是所谓的资源隔离。 关于Hadoop YARN资源调度器的详细介绍,可参考我的这篇文章:YARN/MRv2 Resource Manager深入剖析—资源调度器。 在正式介绍具体的资源调度和隔离之前,先品味一下内存和CPU这两种资源的特点,这是两种性质不同的资源。内存资源的多少会会决定任务的生死,如果内存不够,任务可能会运行失败;相比之下,CPU资源则不同,它只会决定任务运行的快慢,不会对生死产生影响。 【YARN中内存资源的调度和隔离】 基于以上考虑,YARN允许用户配置每个节点上可用的物理内存资源,注意,这里是“可用的”,因为一个节点上的内存会被若干个服务共享,比如一部分给YARN,一部分给HDFS,一部分给HBase等,YARN配置的只是自己可以使用的,配置参数如下: (1)yarn.nodemanager.resource.memory-mb 表示该节点上YARN可使用的物理内存总量,默认是8192(MB),注意,如果你的节点内存资源不够8GB,则需要调减小这个值,而YARN不会智能的探测节点的物理内存总量。 (2)yarn.nodemanager.vmem-pmem-ratio 任务每使用1MB物理内存,最多可使用虚拟内存量,默认是2.1。 (3) yarn.nodemanager.pmem-check-enabled 是否启动一个线程检查每个任务正使用的物理内存量,如果任务超出分配值,则直接将其杀掉,默认是true。 (4) yarn.nodemanager.vmem-check-enabled 是否启动一个线程检查每个任务正使用的虚拟内存量,如果任务超出分配值,则直接将其杀掉,默认是true。 (5)yarn.scheduler.minimum-allocation-mb 单个任务可申请的最少物理内存量,默认是1024(MB),如果一个任务申请的物理内存量少于该值,则该对应的值改为这个数。 (6)yarn.scheduler.maximum-allocation-mb 单个任务可申请的最多物理内存量,默认是8192(MB)。 默认情况下,YARN采用了线程监控的方法判断任务是否超量使用内存,一旦发现超量,则直接将其杀死。由于Cgroups对内存的控制缺乏灵活性(即任务任何时刻不能超过内存上限,如果超过,则直接将其杀死或者报OOM),而Java进程在创建瞬间内存将翻倍,之后骤降到正常值,这种情况下,采用线程监控的方式更加灵活(当发现进程树内存瞬间翻倍超过设定值时,可认为是正常现象,不会将任务杀死),因此YARN未提供Cgroups内存隔离机制。 【YARN中CPU资源的调度和隔离】 在YARN中,CPU资源的组织方式仍在探索中,目前(2.2.0版本)只是一个初步的,非常粗粒度的实现方式,更细粒度的CPU划分方式已经提出来了,正在完善和实现中。 目前的CPU被划分成虚拟CPU(CPU virtual Core),这里的虚拟CPU是YARN自己引入的概念,初衷是,考虑到不同节点的CPU性能可能不同,每个CPU具有的计算能力也是不一样的,比如某个物理CPU的计算能力可能是另外一个物理CPU的2倍,这时候,你可以通过为第一个物理CPU多配置几个虚拟CPU弥补这种差异。用户提交作业时,可以指定每个任务需要的虚拟CPU个数。在YARN中,CPU相关配置参数如下: (1)yarn.nodemanager.resource.cpu-vcores 表示该节点上YARN可使用的虚拟CPU个数,默认是8,注意,目前推荐将该值设值为与物理CPU核数数目相同。如果你的节点CPU核数不够8个,则需要调减小这个值,而YARN不会智能的探测节点的物理CPU总数。 (2) yarn.scheduler.minimum-allocation-vcores 单个任务可申请的最小虚拟CPU个数,默认是1,如果一个任务申请的CPU个数少于该数,则该对应的值改为这个数。 (3)yarn.scheduler.maximum-allocation-vcores 单个任务可申请的最多虚拟CPU个数,默认是32。 默认情况下,YARN是不会对CPU资源进行调度的,你需要配置相应的资源调度器让你支持,具体可参考我的这两篇文章: (1)Hadoop YARN配置参数剖析(4)—Fair Scheduler相关参数 (2)Hadoop YARN配置参数剖析(5)—Capacity Scheduler相关参数 默认情况下,NodeManager不会对CPU资源进行任何隔离,你可以通过启用Cgroups让你支持CPU隔离。 由于CPU资源的独特性,目前这种CPU分配方式仍然是粗粒度的。举个例子,很多任务可能是IO密集型的,消耗的CPU资源非常少,如果此时你为它分配一个CPU,则是一种严重浪费,你完全可以让他与其他几个任务公用一个CPU,也就是说,我们需要支持更粒度的CPU表达方式。 借鉴亚马逊EC2中CPU资源的划分方式,即提出了CPU最小单位为EC2 Compute Unit(ECU),一个ECU代表相当于1.0-1.2 GHz 2007 Opteron or 2007 Xeon处理器的处理能力。YARN提出了CPU最小单位YARN Compute Unit(YCU),目前这个数是一个整数,默认是720,由参数yarn.nodemanager.resource.cpu-ycus-per-core设置,表示一个CPU core具备的计算能力(该feature在2.2.0版本中并不存在,可能增加到2.3.0版本中),这样,用户提交作业时,直接指定需要的YCU即可,比如指定值为360,表示用1/2个CPU core,实际表现为,只使用一个CPU core的1/2计算时间。注意,在操作系统层,CPU资源是按照时间片分配的,你可以说,一个进程使用1/3的CPU时间片,或者1/5的时间片。对于CPU资源划分和调度的探讨,可参考以下几个链接: https://issues.apache.org/jira/browse/YARN-1089 https://issues.apache.org/jira/browse/YARN-1024 Hadoop 新特性、改进、优化和Bug分析系列5:YARN-3 【总结】 目前,YARN 内存资源调度借鉴了Hadoop 1.0中的方式,比较合理,但CPU资源的调度方式仍在不断改进中,目前只是一个初步的粗糙实现,相信在不久的将来,YARN 中CPU资源的调度将更加完善。
欢迎关注大数据和人工智能技术文章发布的微信公众号:清研学堂,在这里你可以学到夜白(作者笔名)精心整理的笔记,让我们每天进步一点点,让优秀成为一种习惯! 一、HBase基本概念:列式数据库 在Hadoop生态体系结构中,HBase位于HDFS(Hadoop分布式文件系统)的上一层,不依赖于MapReduce,那么如果没有HBase这种Nosql数据库会有什么影响呢?传统的关系型数据库由于存储数据有限,且其分布式结构由于本身的特点导致节点数量最大不会超过一百个,例如分布式的oracle数据库只能部署一百个节点等等。那么在当下海量数据的背景下则诞生了列式数据库,而最常见的列式数据库有两种:1、HBase 2、Cassandra。列式数据库,顾名思义是按列来存储数据,意思是HBase表中的字段是可以动态增加的,因此HBase数据库是Nosql数据库。 二、HBase与HDFS、Hive/Pig之间的关系: 由于HDFS作为分布式文件系统,主要用于存储数据,因此它不支持实时访问/随机读写,而HBase数据库支持实施访问/随机读写,因此HBase主要应用于在线数据查询,HDFS主要应用于数据存储,而Hive/Pig作为数据分析引擎,由于底层依赖MapReduce,具有高延迟的特点,因此主要应用于离线数据查询。 三、HBase表的基础知识: 1、表:表是用来存储和管理数据的,表由行和列组成。 2、行键:英文rowkey,不唯一且不为空,作为HBase表的一级索引,特点:相同行键作为一条记录,行键按照字典顺序排序。 3、列族:列的集合,列族是在创建表时定义好的,例:create 'students','info','grade',其中info和grade就是两个列族,而students是这张表的名字,列是在添加记录时动态添加的。 4、时间戳:列的一个属性。 5、单元格:可以存储多个数据,每个数据具有时间戳属性和版本特性(通过时间戳区分数据),这是Hbase表结构独有的特点,而在关系型数据库中,单元格只能存储一个数据。 6、HBase表中的记录按行键拆分形成region,一个行键就是一个region,不同的region分布在不同的regionserver上,对表的查询转换为对多台regionserver的并行查询,通过牺牲存储空间来换取时间性能, 因此Hbase适合海量数据秒级简单查询。 7、region由多个store组成,每个store存储一个列族,store由一个memstore和零到多个storefile组成,memstore保存最近一批数据的更新操作,在HBase写数据的过程中,就是将数据写入memstore中。 (region是分布式存储和负载均衡的最小单元,Hfile是存储的最小单元) 四、Hbase表: 五、Hbase表的特点: 1、大:一张表可以由上亿行,上百万列组成。 2、面向列:HBase表按列保存数据。 3、稀疏:HBase表的空列不占用存储空间。 4、无模式:HBase表中不同行可以有截然不同的列,因为列是在添加记录时动态添加的。 5、数据类型单一:只有字符串这种数据类型。 六、HBase的体系结构: Hmaster:1、为Regionserver分配region。 2、负责Regionserver的负载均衡。 3、发现失效的Regionserver并重新分配其上的region。 4、接收客户端的请求:对HBase表进行增删改查操作。 Regionserver:1、维护region,处理客户端对region的IO请求。 2、负责切分过大的region。 3、定期向Zookeeper汇报心跳信息。 Zookeeper:1、保存HBase集群的结构信息、root表、meta表。 2、实时监控Regionserver并通知给Hmaster。 3、实现HBase的HA功能 (HBase自带一个Zookeeper) 七、安装和配置HBase: 1、安装:tar -zxvf hbase-1.3.1-bin.tar.gz -C ~/training 2、配置HBASE_HOME环境变量:export HBASE_HOME=/root/training/hbase-1.3.1 export PATH=$HBASE_HOME/bin:$PATH 八、HBase的安装模式:与Hadoop相似 1、本地模式:单机没有虚拟出任何节点,只有Hmaster,没有Regionserver,数据存放在本地,修改两个配置文件:hbase-env.sh和hbase-site.xml。 2、伪分布式模式:单机虚拟出多个节点,具备HBase的所有功能,修改两个配置文件:hbase-env.sh和hbase-site.xml。 3、全分布式模式:至少三台机器以上,修改三个配置文件:hbase-env.sh、hbase-site.xml和regionservers。 (比伪分布式模式多一个regionservers) 补充:HBase的http服务端口:16010 九、HBase的读写过程: 1、写过程:HBase表中的记录按行键拆分形成region,不同的region分布在不同的regionserver上,region由多个store组成,每个store保存一个列族,而store又由一个memstore和零到多个storefile组成,数据写入memstore中,memstore保存最近一批数据的更新操作,当memstore保存不下时(128M),会溢写到磁盘中形成storefile文件,当storefile文件数量达到一定阈值时会合并成一个storefile文件,当storefile文件大小大于256M时,region会自动分裂,由Hmaster分配到其他regionserver上,最终storefile文件生成128M的Hfile文件保存到datanode上。 2、读过程:客户端向Hmaster发送请求,从zookeeper中访问root表(-root-)获得表的元信息,访问meta表(.meta.)获得region的元信息,进入region从memstore中寻找数据,如果找不到,则从storefile中寻找数据。 (一句话总结HBase的读写过程:寻址访问zookeeper,数据读写范文Regionserver) 十、HBase上的过滤器:实现复杂查询 十一、HBase上的MapReduce:map的输入是HBase中的一条记录,reduce的输出是HBase中的一条记录。 十二、HBase的HA:单独启动一个Hmaster:hbase-daemon.sh start master。 作者:李金泽AllenLi,清华大学在读硕士,研究方向:大数据和人工智能。
欢迎关注大数据和人工智能技术文章发布的微信公众号:清研学堂,在这里你可以学到夜白(作者笔名)精心整理的笔记,让我们每天进步一点点,让优秀成为一种习惯! Pig 一、Pig的介绍: Pig由Yahoo开发,主要应用于数据分析,Twitter公司大量使用Pig处理海量数据,Pig之所以是数据分析引擎,是因为Pig相当于一个翻译器,将PigLatin语句翻译成MapReduce程序(只有在执行dump和store命令时才会翻译成MapReduce程序),而PigLatin语句是一种用于处理大规模数据的脚本语言。 二、Pig与Hive的相同与区别: 相同: 1、Hive和Pig都是数据分析引擎,除此之外,还有Spark中的Spark SQL和Cloudera开发的Impala等。 2、Hive和Pig都简化了MapReduce程序的开发。 不同: 1、Hive作为数据分析引擎有一定限制,只能分析结构化数据,因为Hive的数据模型是表结构,虽然没有数据存储引擎,需要用户在创建表时指定分隔符(默认以Tab键作为分隔符):row format delimited field terminated by ‘,’,而Pig的数据模型是包结构,由tuple和field组成,因此可以分析任意类型的数据。 2、Hive使用的是sql语句分析数据,sql语句是一种声明式语言,Pig使用的是PigLatin语句分析数据,PigLatin语句是一种过程式语言/脚本语句。 3、Hive中的内置函数不用大写,Pig中的内置函数必须要大写。 举例:按照部门号对员工表分组并求每个部门中薪水的最大值: sql语句:select deptno,max(sal) from emp group by deptno; PigLatin语句:emp1 = group emp by deptno; emp2 = foreach emp1 generate group,MAX(emp.sal) dump emp2; (PigLatin语句注意事项:等号前后要有空格) 4、Hive保存元信息,因此数据模型不用重建,而Pig不保存元信息,因此数据模型需要重建。 5、由于PigLatin语句是脚本语言,因此Hive执行速度比Pig更快。 6、 由于Hive的数据模型是表结构,因此Hive是先创建表,后加载数据,而Pig的数据模型是包结构,Pig在加载数据的同时创建包。 举例:创建一份员工表 sql语句: 1、创建表: create table emp( empno int, ename string, job string, mgr int, hiredate string, sal int, comm int, deptno int )row format delimited field terminated by ','; 2、加载HDFS中的数据: load data inpath '/scott/emp.csv' into table emp; PigLatin语句: 加载数据的同时创建包:load后加载数据,using后指定分隔符,as后指定包结构 emp=load'/scott/emp.csv'usingPigStorage(',')as(empno:int,ename:chararray,job:chararray,mgr:int,hiredate:chararray,sal:int,comm:int,deptno:int); 三、Hive数据模型和Pig数据模型的差别: 1、Hive的数据模型是表,表由行和列组成,表不可以嵌套,Pig的数据模型是包,包由tuple和field组成,包可以嵌套。 2、表中每一行的列完全相同,包中每一行的列可以不相同,可以动态增加。 四、Pig的安装和配置: 1、安装pig:tar -zxvf pig-0.17.0.tar.gz -C ~/traing 2、配置PIG_HOME环境变量: export PIG_HOME=/root/training/pig-0.17.0 export PATH=$PIG_HOME/bin:$PATH 五、Pig的安装模式: 1、本地模式:访问本地主机,pig相当于本地的客户端。 2、集群模式:访问Hadoop集群,pig相当于Hadoop的客户端。 注:1、集群模式需要配置PIG_CLASSPATH环境变量,用于连接到Hadoop上: export PIG_CLASSPATH=/root/training/hadoop-2.7.3/etc/hadoop 2、启动pig的集群模式前,需要先启动historyserver,因为pig在hadoop上执行任务后需要与historyserver通信,解析执行日志确定任务执行是否成功: mr-jobhistory-daemon.sh start historyserver 六、Pig的常用命令:操作HDFS ls、cd、cat、mkdir、pwd、copyFromLocal(上传)、copyToLocal(下载)、register、define等。 七、操作Pig: 1、命令行:pig提供了一个shell终端与用户进行交互,用户可以进行增删改查操作。 启动pig命令行模式,进入本地模式:pig -x local 启动pig命令行模式,进入集群模式:pig - x mapredcue/pig (pig没有API可以操作) 八、常用的PigLatin语句: load:加载数据 foreach:逐行扫描 generate:提取列 filter:过滤 distinct:去重 order by:排序 group by:分组 join:多表查询 union:联合查询 dump:把结果输出到屏幕上 store:把结果保存到HDFS上 九、使用PigLatin语句分析数据: 创建员工表:load后加载数据,using后指定分隔符,as后指定包结构 emp = load '/scott/emp.csv' using PigStorage(',') as(empno:int,ename:chararray,job:chararray,mgr:int,hiredate:chararray,sal:int,comm:int,deptno:int); describe emp; 查看员工表:2 SQL:select * from emp; PL:emp0 = foreach emp generate *; dump emp0; 创建部门表: dept = load '/scott/dept.csv' using PigStorage(',') as(deptno:int,dname:chararray,loc:chararray); 查看部门表: SQL:select * from dept; PL:dept0 = foreach dept generate *; dump dept0; 查询员工号、员工名和薪水: SQL:select empno,ename,sal from emp; PL:emp1 = foreach emp generate empno,ename,sal; dump emp1; 根据薪水对员工表排序: SQL:select sal from emp order by sal; PL:emp2 = order emp by sal; dump emp2; 按照部门号对员工表分组并求每个部门中薪水的最大值: SQL:select deptno,max(sal) from emp group by deptno; PL:emp3 = group emp by deptno; emp4 = foreach emp3 generate group,MAX(emp.sal); dump emp4; 查看10、20、30号部门的员工 SQL:select * from emp where deptno=10; select * from emp where deptno=20; select * from emp where deptno=30; PL:emp5 = filter emp by deptno==10; dump emp5; emp6 = filter emp by deptno==20; dump emp6; emp7 = filter emp by deptno==30; dump emp7; 多表查询,查询员工名和部门名: SQL:select emp.ename,dept.dname from emp,dept where emp.deptno=dept.deptno; PL:emp8 = join emp by deptno,dept by deptno emp9 = foreach emp8 generate emp::ename,dept::dname; dump emp9; 内连接: C = join A by id,B by id; 外连接: 左外连接:C = join A by id left outer,B by id; #以左侧数据为基准,只返回左侧有的数据 右外连接:C = join A by id right outer,B by id;#以右侧数据为基准,只返回右侧有的数据 全外连接:C = join A by id full outer, B by id;#两侧数据都返回 联合查询,查询10号部门和20号部门的员工: SQL:select * from emp where deptno=10 union select * from dept where deptno=20; PL: emp10 = filter emp by deptno==10; emp11 = filter emp by deptno==20; emp12 = union emp10,emp11; 实现wordcount; 加载数据 mydata = load '/output/data2.txt' as (line:chararray); 将字符串分割成单词 words = foreach mydata generate flatten(TOKENIZE(line)) as word; 对单词分组 grpd = group words by word; 统计每组中单词数量 cntd = foreach grpd generate group,COUNT(words); 结果显示到屏幕上 dump cntd; 结果存储到HDFS上 store cntd into '/pig'; 常用的大数据工具 作者:李金泽AlllenLI,清华大学在读硕士,研究方向:大数据和人工智能
欢迎关注大数据和人工智能技术文章发布的微信公众号:清研学堂,在这里你可以学到夜白(作者笔名)精心整理的笔记,让我们每天进步一点点,让优秀成为一种习惯! 一、Sqoop的简介: Sqoop是一个数据采集引擎/数据交换引擎,采集关系型数据库(RDBMS)中的数据,主要用于在RDBMS与HDFS/Hive/HBase之间进行数据传递,可以通过sqoop import命令将RDBMS中的数据导入到HDFS/Hive/HBase中,也可以通过sqoop export命令将HDFS/Hive/HBase中的数据导入到RDBMS中,特点:批量采集数据,底层依赖于MapReduce程序,工作原理:通过JDBC连接到关系型数据库(RDBMS)。 二、Sqoop的实验条件: 实验条件:安装Windows XP操作系统和oracle数据库。 为什么要选择关系型数据库中的oracle数据库呢? 原因:1、在windows系统上安装oracle数据库比在linux系统上更简单。2、oracle数据库中的SH用户含有sales订单表,表中包含92万条记录,SCOTT用户含有现成的员工表emp.csv和部门表dept.csv。 三、各种数据库对应的驱动类名和URL格式: 数据库 驱动类名 URL格式 端口号 oracle oracle.jdbc.OracleDriver jdbc:oracle:thin:@IP:1521:orcl 1521 mysql com.mysql.jdbc.Driver jdbc:mysql://IP:3306/dbname?name=value 3306 hive org.apache.hive.jdbc.HiveDriver jdbc:hive2://IP:10000/dbname 10000 四、安装和配置Sqoop: 注:不需要修改配置文件 1、安装sqoop:tar -zxvf sqoop-1.4.5bin_hadoop-0.23.tar.gz -C ~/training 2、配置SQOOP_HOME环境变量: export SQOOP_HOME=/root/training/sqoop-1.4.5bin_hadoop-0.23 export PATH=$SQOOP_HOME/bin:$PATH 五、使用sqoop语句采集RDBMS中的数据: 1、导入员工表EMP中的所有数据: sqoop import --connect jdbc:oracle:thin:@192.168.182.157:1521:orcl --username SCOTT --password tiger --table EMP --target-dir /sqoop/import/emp1 2、导入员工表EMP中的指定列: sqoop import --connect jdbc:oracle:thin:@192.168.182.157:1521:orcl --usrname SCOTT --password tiger --table EMP -column ENAME,SAL --target-dir /sqoop/import/emp2 3、导入SALES表中的所有数据: sqoop import --connect jdbc:oracle:thin:@192.168.182.157:1521:orcl --username SH --password sh --table SALES --target-dir /sqoop/import/sales -m 1 4、导入SCOTT用户下的所有表到HDFS中: sqoop import-all-tables --connect jdbc:oracle:thin:@192.168.182.157:1521:orcl --usernmae SCOTT --password tiger 5、导出HDFS中的数据到RDBMS中: sqoop export --connect jdbc:oracle:thin:@192.168.182.157:1521:orcl --username SCOTT --password tiger --table STUDENTS --export-dir /students 六、oracle数据库与mysql数据库的区别: 1、oracle数据库区分大小写,需要大写的有:用户名、表名、列名,mysql数据库不区分大小写。 2、oracle数据库只有一个数据库:orcl,在安装oracle数据库时自动创建,mysql数据库有很多数据库。 3、oracle数据库有很多用户,表属于用户,mysql数据库有很多数据库,表属于数据库,数据库对不同用户设置了不同的访问权限。 七、Sqoop与Flume的相同与不同: 相同:sqoop和flume都是数据采集引擎。 不同:sqoop的特点:批量采集数据,flume的特点:实时采集数据,主要用于实时采集系统中。 作者:李金泽AllenLi,清华大学在读硕士,研究方向:大数据和人工智能。
欢迎关注大数据和人工智能技术文章发布的微信公众号:清研学堂,在这里你可以学到夜白(作者笔名)精心整理的笔记,让我们每天进步一点点,让优秀成为一种习惯! 一、Flume的介绍: Flume由Cloudera公司开发,是一种提供高可用、高可靠、分布式海量日志采集、聚合和传输的系统,Flume支持在日志系统中定制各类数据发送方,用于采集数据;同时,flume提供对数据进行简单处理,并写到各种数据接收方的能力,如果能用一句话概括Flume,那么Flume是实时采集日志的数据采集引擎。 二、Flume的体系结构: Flume的体系结构分成三个部分:数据源、Flume、目的地 数据源种类有很多:可以来自directory、http、kafka等,flume提供了source组件用来采集数据源。 1、source作用:采集日志 source种类:1、spooling directory source:采集目录中的日志 2、htttp source:采集http中的日志 3、kafka source:采集kafka中的日志 …… 采集到的日志需要进行缓存,flume提供了channel组件用来缓存数据。 2、channel作用:缓存日志 channel种类:1、memory channel:缓存到内存中(最常用) 2、JDBC channel:通过JDBC缓存到关系型数据库中 3、kafka channel:缓存到kafka中 …… 缓存的数据最终需要进行保存,flume提供了sink组件用来保存数据。 3、sink作用:保存日志 sink种类:1、HDFS sink:保存到HDFS中 2、HBase sink:保存到HBase中 3、Hive sink:保存到Hive中 4、kafka sink:保存到kafka中 …… 官网中有flume各个组件不同种类的列举: 三、安装和配置Flume: 1、安装:tar -zxvf apache-flume-1.7.0-bin.tar.gz -C ~/training 2、创建配置文件a4.conf:定义agent,定义source、channel、sink并组装起来,定义生成日志文件的条件。 以下是a4.conf配置文件中的内容,其中定义了数据源来自目录、数据缓存到内存中,数据最终保存到HDFS中,并且定义了生成日志文件的条件:日志文件大小达到128M或者经过60秒生成日志文件。 #定义agent名, source、channel、sink的名称 a4.sources = r1 a4.channels = c1 a4.sinks = k1 #具体定义source a4.sources.r1.type = spooldir a4.sources.r1.spoolDir = /root/training/logs #具体定义channel a4.channels.c1.type = memory a4.channels.c1.capacity = 10000 a4.channels.c1.transactionCapacity = 100 #定义拦截器,为消息添加时间戳 a4.sources.r1.interceptors = i1 a4.sources.r1.interceptors.i1.type = org.apache.flume.interceptor.TimestampInterceptor$Builder #具体定义sink a4.sinks.k1.type = hdfs a4.sinks.k1.hdfs.path = hdfs://192.168.157.11:9000/flume/%Y%m%d a4.sinks.k1.hdfs.filePrefix = events- a4.sinks.k1.hdfs.fileType = DataStream #不按照条数生成文件 a4.sinks.k1.hdfs.rollCount = 0 #HDFS上的文件达到128M时生成一个日志文件 a4.sinks.k1.hdfs.rollSize = 134217728 #HDFS上的文件达到60秒生成一个日志文件 a4.sinks.k1.hdfs.rollInterval = 60 #组装source、channel、sink a4.sources.r1.channels = c1 a4.sinks.k1.channel = c1 四、使用Flume语句采集数据: 1、创建目录,用于保存日志: mkdir /root/training/logs 2、启动Flume,准备实时采集日志: bin/flume-ng.agent -n a4 -f myagent/a4.conf -c conf -Dflume.root.logger=INFO.console 3、将日志导入到目录中: cp * ~/training/logs 五、Sqoop和Flume的相同点和不同点: 相同点:sqoop和flume只有一种安装模式,不存在本地模式、集群模式等。 不同点:sqoop批量采集数据,flume实时采集数据。 作者:李金泽AllenLi,清华大学在读硕士,研究方向:大数据和人工智能