1. 程式人生 > >Kubernetes部署大資料元件系列一:一鍵部署Zookeeper叢集

Kubernetes部署大資料元件系列一:一鍵部署Zookeeper叢集

目前的大資料平臺存在的問題:

  • 通過手工方式直接部署在物理機上,過程複雜、效率低,不適合大規模叢集的部署和動態擴容。
  • 由於平臺元件繁多,對宿主機底層庫依賴過高,一旦安裝完成,很難進行遷移,也無法做成模版進行重複使用。
  • 元件升級不夠靈活,往往會對有相同底層依賴的其他元件帶來影響。
  • 採用虛機部署時,會對宿主機產生資源浪費、開銷大。
  • 物理機或虛機關啟等管理操作速度較慢。
  • 無法在同一套物理叢集上部署多套大資料平臺,使用虛機的方案太耗費資源。

針對上述問題,我們打算用時下流行的Docker容器來封裝大資料各個元件,用Google的神器Kubernetes來編排這些Docker容器,最終達到:

  • 平臺能夠自動化的快速部署(小規模叢集能夠達到秒級)、動態擴容。
  • 平臺構建一次,就能夠形成模版重複使用、靈活遷移。
  • 平臺構建一次,就能夠靈活部署在不同的環境中(比如公有云、私有云、裸機,虛擬機器)。
  • 元件能夠靈活升級、靈活替代。
  • 消除線上線下環境不一致導致的問題,再也不會有“在我的機器上執行的好好的”這種託詞。
  • 因為其多資源的低消耗,在物理叢集上能同時部署多套大資料平臺,供不同部門獨 享。
  • 很適合持續整合/持續部署(CI/CD)的環境,因為可以自動的下載、綠色的安裝和徹底清除應用程式,不會影響宿主機的環境。

本篇是該系列的第一篇,手把手教你通過K8s部署zookeeper叢集,涉及到的概念,各位看官自行腦補,我只講一下部署過程,直接上乾貨了。

- 使用Kargo搭建Kubernetes 1.6叢集:

地址角色
10.0.7.14Ansible Client (Kargo用到的工具)
10.0.8.182Master, NODE 1
10.0.8.183NODE 2

1,我用筆記本(macOS系統),作為Ansible client。先新建一個資料夾kargo,把kargo.tgz放進去並解壓,目錄結構如下:

2,需要安裝python 2.7、pip 9.0.1、python-netaddr、ansible 2.3.1.0等工具 [ansible安裝]http://valdhaus.co/writings/ansible-mac-osx/

3,修改 inventory/inventory.cfg

wangliangdeMacBook-Pro:kargo wangliang$ pwd
/Users/wangliang/kargo/kargo
wangliangdeMacBook-Pro:kargo wangliang$ vim inventory/inventory.cfg

[all]
node1    ansible_user=app ansible_host=10.0.8.182  ip=10.0.8.182 access_ip=10.0.8.182
node2    ansible_user=app ansible_host=10.0.8.183  ip=10.0.8.183 access_ip=10.0.8.183

[kube-master]
node1    ip=10.0.8.182 access_ip=10.0.8.182

[kube-node]
node1
node2

[etcd]
node1

[k8s-cluster:children]
kube-node
kube-master

[calico-rr]

4,分別在10.0.8.182(Node 1)、10.0.8.183(Node 2)上做如下操作:
首先安裝Docker 1.13.1,並啟動服務
[Ubuntu安裝Docker]http://www.linuxidc.com/Linux/2017-01/139985.htm

其次把kargo_images_v1.6.1.tar.gz 拷貝到要安裝k8s的節點上,放到k8s資料夾內,並解壓,目錄結構如下:




5,在kargo_images_v1.6.1目錄下,進入bash,執行:

➜  k8s cd kargo_images_v1.6.1
➜  kargo_images_v1.6.1 pwd
/data/k8s/kargo_images_v1.6.1
➜  kargo_images_v1.6.1 bash
[email protected]:/data/k8s/kargo_images_v1.6.1$images=$(ls -l ../kargo_images_v1.6.1|awk -F' ' '{ print $9 }')

[email protected]:/data/k8s/kargo_images_v1.6.1$ for x in ${images[*]}; do sudo docker load -i $x; done

將目錄下的映象放入docker images。


6, Node1、Node2和Mac間都要SSH免密,Mac上還要開啟共享裡面的允許遠端訪問



Node1、Node2、Mac都在使用者目錄下執行

➜  ~ cd /home/app
ssh-keygen -t rsa  #一路回車就行
Generating public/private rsa key pair.
Enter file in which to save the key (/home/app/.ssh/id_rsa):
Created directory '/home/app/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/app/.ssh/id_rsa.
Your public key has been saved in /home/app/.ssh/id_rsa.pub.
The key fingerprint is:
7c:f4:2f:21:f2:85:7f:20:38:02:1d:ef:79:39:b6:be [email protected]
The key's randomart image is:
+--[ RSA 2048]----+
|      .          |
|     . o         |
|    . . . .      |
|     . o + +     |
|      . S X =    |
|       . B B +   |
|          o o o  |
|         .   o   |
|          E.     |
+-----------------+

➜  ~ cd /home/app/.ssh
➜  .ssh ssh-copy-id Node2
➜  .ssh ssh-copy-id Mac

每次執行,步驟都如下類似:
The authenticity of host 'Node1 (10.0.8.183)' can't be established.
ECDSA key fingerprint is 91:1a:13:a8:57:2b:a0:42:4d:aa:c9:83:c3:33:16:f9.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
[email protected]'s password:

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'Node2'"
and check to make sure that only the key(s) you wanted were added.

所有虛機都執行完成後,可以通過ssh hostname來檢視之間是否ssh連線已經免密了,如下測試

➜  ~ ssh 10.0.8.183
Welcome to Ubuntu 16.04.2 LTS (GNU/Linux 4.4.0-62-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

180 packages can be updated.
75 updates are security updates.


Last login: Wed Jun 28 09:16:54 2017 from 10.0.7.14
➜  ~

7,在Ansible client(Mac)上執行

$ ansible-playbook -i ~/kargo/inventory/inventory.cfg cluster.yml -b -v --user=username --ask-sudo-pass

安裝成功,在Mac上可以看到如下輸出:


在Node 1上可以看到:


遇到的錯誤:
1,有如下錯誤:

kubectl The connection to the server localhost:8080 was refused

修改了vim inventory/group_vars/k8s-cluster.ym 裡面的8080為28080,避免和別人衝突,又有如下錯誤:

kubernetes/master : Master | wait for the apiserver to be running

原因是apiserver的映象起不了,無法提供服務
懷疑可能是不支援docker 1.17版本,所以更換為docker 1.13.1版本子再次安裝後沒有上述錯誤了,安裝成功。切記,要用docker 1.13.1版本。

2,如果按照上述操作始終沒有成功,可以把節點上的

/run/kubernetes
/etc/kubernetes

都刪除,然後把docker也都解除安裝重新裝。然後在Ansible client節點上重新部署就可以啦。

  • 使用Dockerfile製作包含zkui 2.0 的Zookeeper 3.4.10版本的映象:
    1,建立你要做docker的目錄,結構如下:

2,其中Dockerfile如下:

FROM openjdk:8-jre-alpine
MAINTAINER Wang Liang <[email protected]>

# Install required packages
RUN apk add --no-cache \
    bash \
    su-exec

ENV ZOO_USER=zookeeper \
    ZOO_CONF_DIR=/conf \
    ZOO_DATA_DIR=/data \
    ZOO_UI_DIR=/zkui \
    ZOO_DATA_LOG_DIR=/datalog \
    ZOO_PORT=2181 \
    ZOO_TICK_TIME=2000 \
    ZOO_INIT_LIMIT=5 \
    ZOO_SYNC_LIMIT=2

# Add a user and make dirs
RUN set -x \
    && adduser -D "$ZOO_USER" \
    && mkdir -p "$ZOO_DATA_LOG_DIR" "$ZOO_DATA_DIR" "$ZOO_CONF_DIR" \
    && chown "$ZOO_USER:$ZOO_USER" "$ZOO_DATA_LOG_DIR" "$ZOO_DATA_DIR" "$ZOO_CONF_DIR"

ARG GPG_KEY=C823E3E5B12AF29C67F81976F5CECB3CB5E9BD2D
ARG DISTRO_NAME=zookeeper-3.4.10

# Download Apache Zookeeper, verify its PGP signature, untar and clean up
RUN set -x \
    && apk add --no-cache --virtual .build-deps \
        gnupg \
    && wget -q "http://www.apache.org/dist/zookeeper/$DISTRO_NAME/$DISTRO_NAME.tar.gz" \
    && wget -q "http://www.apache.org/dist/zookeeper/$DISTRO_NAME/$DISTRO_NAME.tar.gz.asc" \
    && export GNUPGHOME="$(mktemp -d)" \
    && gpg --keyserver ha.pool.sks-keyservers.net --recv-key "$GPG_KEY" \
    && gpg --batch --verify "$DISTRO_NAME.tar.gz.asc" "$DISTRO_NAME.tar.gz" \
    && tar -xzf "$DISTRO_NAME.tar.gz" \
    && mv "$DISTRO_NAME/conf/"* "$ZOO_CONF_DIR" \
    && rm -r "$GNUPGHOME" "$DISTRO_NAME.tar.gz" "$DISTRO_NAME.tar.gz.asc" \
    && apk del .build-deps

ADD zkui-master $ZOO_UI_DIR

WORKDIR $DISTRO_NAME
VOLUME ["$ZOO_DATA_DIR", "$ZOO_DATA_LOG_DIR"]

EXPOSE $ZOO_PORT 2888 3888

ENV PATH=$PATH:/$DISTRO_NAME/bin:$ZOO_UI_DIR \
    ZOOCFGDIR=$ZOO_CONF_DIR

COPY docker-entrypoint.sh /
ENTRYPOINT ["/docker-entrypoint.sh"]

3,docker-entrypoint.sh如下:

#!/bin/bash

set -e

# Allow the container to be started with `--user`
if [ "$1" = 'zkServer.sh' -a "$(id -u)" = '0' ]; then
    chown -R "$ZOO_USER" "$ZOO_DATA_DIR" "$ZOO_DATA_LOG_DIR"
    exec su-exec "$ZOO_USER" "$0" "[email protected]"
fi

# Generate the config only if it doesn't exist
if [ ! -f "$ZOO_CONF_DIR/zoo.cfg" ]; then
    CONFIG="$ZOO_CONF_DIR/zoo.cfg"

    echo "clientPort=$ZOO_PORT" >> "$CONFIG"
    echo "dataDir=$ZOO_DATA_DIR" >> "$CONFIG"
    echo "dataLogDir=$ZOO_DATA_LOG_DIR" >> "$CONFIG"

    echo "tickTime=$ZOO_TICK_TIME" >> "$CONFIG"
    echo "initLimit=$ZOO_INIT_LIMIT" >> "$CONFIG"
    echo "syncLimit=$ZOO_SYNC_LIMIT" >> "$CONFIG"

    for server in $ZOO_SERVERS; do
        echo "$server" >> "$CONFIG"
    done
fi

if [ -f "$ZOO_UI_DIR/config.cfg" ]; then
    CONFIG="$ZOO_UI_DIR/config.cfg"

    echo "serverPort=$ZOO_UI_PORT" >> "$CONFIG"
    echo "zkServer=$ZOO_UI_SERVER" >> "$CONFIG"
fi

# Write myid only if it doesn't exist
if [ ! -f "$ZOO_DATA_DIR/myid" ]; then
    echo "${ZOO_MY_ID:-1}" > "$ZOO_DATA_DIR/myid"
fi

cd $ZOO_UI_DIR
exec nohup java -jar zkui-2.0-SNAPSHOT-jar-with-dependencies.jar &
exec zkServer.sh start-foreground

執行

➜  wldocker sudo docker build -t zookeeper_3.4.10_zkui_2.0:0.0.1 .

就可以製作出包含ZKUI的zookeeper 3.4.10的docker映象了


把該映象上傳到HARBOR庫,稍後k8s編排時會用到。

  • 通過Kubernetes 編排啟動Zookeeper叢集:
    我們採取的方案是每個zkserver屬於一個pod,每個pod繫結一個物理主機。
    只需要完成yaml檔案即可:

zk-1.yaml:

---
apiVersion: v1
kind: Service
metadata:
  name: zk-1-svc
  labels:
    app: zk-1-svc
spec:
  ports:
  - port: 2888
    name: server
  - port: 3888
    name: leader-election
  - port: 2181
    name: client
  - port: 9999
    name: zkui
  selector:
    app: zk-1
  type: NodePort
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: zk-1-cm
data:
  jvm.heap: "1G"
  tick: "2000"
  init: "10"
  sync: "5"
  client.cnxns: "60"
  snap.retain: "3"
  purge.interval: "0"
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: zk-1
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: zk-1
    spec:
      nodeSelector:
        zk: zk-1
      containers:
      - name: myzk
        imagePullPolicy: IfNotPresent
        image: registry.k8s.intra.knownsec.com/bigdata/zookeeper_3.4.10_zkui_2.0:0.0.1
        resources:
          requests:
            memory: "2Gi"
            cpu: "500m"
        ports:
        - containerPort: 2181
          name: client
        - containerPort: 2888
          name: server
        - containerPort: 3888
          name: leader-election
        - containerPort: 9999
          name: zkui
        env:
        - name : ZK_HEAP_SIZE
          valueFrom:
            configMapKeyRef:
                name: zk-1-cm
                key: jvm.heap
        - name : ZK_TICK_TIME
          valueFrom:
            configMapKeyRef:
                name: zk-1-cm
                key: tick
        - name : ZK_INIT_LIMIT
          valueFrom:
            configMapKeyRef:
                name: zk-1-cm
                key: init
        - name : ZK_SYNC_LIMIT
          valueFrom:
            configMapKeyRef:
                name: zk-1-cm
                key: tick
        - name : ZK_MAX_CLIENT_CNXNS
          valueFrom:
            configMapKeyRef:
                name: zk-1-cm
                key: client.cnxns
        - name: ZK_SNAP_RETAIN_COUNT
          valueFrom:
            configMapKeyRef:
                name: zk-1-cm
                key: snap.retain
        - name: ZK_PURGE_INTERVAL
          valueFrom:
            configMapKeyRef:
                name: zk-1-cm
                key: purge.interval
        - name: ZK_CLIENT_PORT
          value: "2181"
        - name: ZK_SERVER_PORT
          value: "2888"
        - name: ZK_ELECTION_PORT
          value: "3888"
        - name: ZOO_MY_ID
          value: "1"
        - name: ZOO_SERVERS
          value: "server.1=0.0.0.0:2888:3888 server.2=zk-2-svc:2888:3888"
        - name: ZOO_UI_PORT
          value: "9999"
        - name: ZOO_UI_SERVER
          value: "zk-1-svc:2181,zk-2-svc:2181"
#        readinessProbe:
#          exec:
#            command:
#            - "zkok.sh"
#          initialDelaySeconds: 10
#          timeoutSeconds: 5
#        livenessProbe:
#          exec:
#            command:
#            - "zkok.sh"
#          initialDelaySeconds: 10
#          timeoutSeconds: 5
        volumeMounts:
        - name: data
          mountPath: /data
        - name: datalog
          mountPath: /datalog
      volumes:
      - name: data
        hostPath:
          path: /data/k8s/zookeeper/data
      - name: datalog
        hostPath:
          path: /data/k8s/zookeeper/datalog

zk-2.yaml:

---
apiVersion: v1
kind: Service
metadata:
  name: zk-2-svc
  labels:
    app: zk-2-svc
spec:
  ports:
  - port: 2888
    name: server
  - port: 3888
    name: leader-election
  - port: 2181
    name: client
  - port: 9999
    name: zkui
  selector:
    app: zk-2
  type: NodePort
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: zk-2-cm
data:
  jvm.heap: "1G"
  tick: "2000"
  init: "10"
  sync: "5"
  client.cnxns: "60"
  snap.retain: "3"
  purge.interval: "0"
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: zk-2
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: zk-2
    spec:
      nodeSelector:
        zk: zk-2
      containers:
      - name: myzk
        imagePullPolicy: IfNotPresent
        image: registry.k8s.intra.knownsec.com/bigdata/zookeeper_3.4.10_zkui_2.0:0.0.1
        resources:
          requests:
            memory: "2Gi"
            cpu: "500m"
        ports:
        - containerPort: 2181
          name: client
        - containerPort: 2888
          name: server
        - containerPort: 3888
          name: leader-election
        - containerPort: 9999
          name: zkui
        env:
        - name : ZK_HEAP_SIZE
          valueFrom:
            configMapKeyRef:
                name: zk-2-cm
                key: jvm.heap
        - name : ZK_TICK_TIME
          valueFrom:
            configMapKeyRef:
                name: zk-2-cm
                key: tick
        - name : ZK_INIT_LIMIT
          valueFrom:
            configMapKeyRef:
                name: zk-2-cm
                key: init
        - name : ZK_SYNC_LIMIT
          valueFrom:
            configMapKeyRef:
                name: zk-2-cm
                key: tick
        - name : ZK_MAX_CLIENT_CNXNS
          valueFrom:
            configMapKeyRef:
                name: zk-2-cm
                key: client.cnxns
        - name: ZK_SNAP_RETAIN_COUNT
          valueFrom:
            configMapKeyRef:
                name: zk-2-cm
                key: snap.retain
        - name: ZK_PURGE_INTERVAL
          valueFrom:
            configMapKeyRef:
                name: zk-2-cm
                key: purge.interval
        - name: ZK_CLIENT_PORT
          value: "2181"
        - name: ZK_SERVER_PORT
          value: "2888"
        - name: ZK_ELECTION_PORT
          value: "3888"
        - name: ZOO_MY_ID
          value: "2"
        - name: ZOO_SERVERS
          value: "server.1=zk-1-svc:2888:3888 server.2=0.0.0.0:2888:3888 "
        - name: ZOO_UI_PORT
          value: "9999"
        - name: ZOO_UI_SERVER
          value: "zk-1-svc:2181,zk-2-svc:2181"
#        readinessProbe:
#          exec:
#            command:
#            - "zkok.sh"
#          initialDelaySeconds: 10
#          timeoutSeconds: 5
#        livenessProbe:
#          exec:
#            command:
#            - "zkok.sh"
#          initialDelaySeconds: 10
#          timeoutSeconds: 5
        volumeMounts:
        - name: data
          mountPath: /data
        - name: datalog
          mountPath: /datalog
      volumes:
      - name: data
        hostPath:
          path: /data/k8s/zookeeper/data
      - name: datalog
        hostPath:
          path: /data/k8s/zookeeper/datalog

執行:

➜  zookeeper kubectl create -f zk-1.yaml
service "zk-1-svc" created
configmap "zk-1-cm" created
deployment "zk-1" created
➜  zookeeper kubectl create -f zk-2.yaml
service "zk-2-svc" created
configmap "zk-2-cm" created
deployment "zk-2" created
  • 功能驗證:
➜  zookeeper kubectl get po  #看po情況
NAME                    READY     STATUS    RESTARTS   AGE
zk-1-1238243890-phcm8   1/1       Running   0          1m
zk-2-4022999611-x27vq   1/1       Running   0          1m
➜  zookeeper kubectl get po -o wide #看繫結物理節點情況
NAME                    READY     STATUS    RESTARTS   AGE       IP               NODE
zk-1-1238243890-phcm8   1/1       Running   0          1m        11.233.112.152   yuyan1
zk-2-4022999611-x27vq   1/1       Running   0          1m        11.233.77.83     yuyan2
➜  zookeeper kubectl get service  #看埠對映情況
NAME         CLUSTER-IP      EXTERNAL-IP   PORT(S)                                                       AGE
kubernetes   11.233.0.1      <none>        443/TCP                                                       4d
zk-1-svc     11.233.30.168   <nodes>       2888:31292/TCP,3888:30513/TCP,2181:31570/TCP,9999:30476/TCP   1m
zk-2-svc     11.233.27.68    <nodes>       2888:30906/TCP,3888:30842/TCP,2181:32473/TCP,9999:31490/TCP   1m
➜  zookeeper kubectl exec  zk-2-4022999611-x27vq -t -i -- bash #進入容器看服務情況
bash-4.3# zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /conf/zoo.cfg
Mode: leader  #選舉正常


提供對外訪問正常

相關推薦

Kubernetes部署資料元件系列部署Hadoop叢集

系列一中忘了說明,用Kubernetes部署大資料容器平臺,有一個很大的好處是壓根不用操心容器間的網路通訊,不管是同一物理伺服器內,還是跨物理伺服器間的網路通訊,你都不用操心,只需要把容器間互相關心的埠暴露好,把容器間的service name對映好,就OK了。 本篇教大家部署Hadoop 2.7.3叢集,暫

Kubernetes部署資料元件系列部署Zookeeper叢集

目前的大資料平臺存在的問題: 通過手工方式直接部署在物理機上,過程複雜、效率低,不適合大規模叢集的部署和動態擴容。 由於平臺元件繁多,對宿主機底層庫依賴過高,一旦安裝完成,很難進行遷移,也無法做成模版進行重複使用。 元件升級不夠靈活,往往會對有相同底層依賴的其他元件帶來影響。 採用虛機部署時,會對宿主機產生資

資料HBase系列之HBase分散式資料庫部署

一、部署準備 1. 依賴框架 大資料Hadoop系列之Hadoop分散式叢集部署:https://blog.csdn.net/volitationLong/article/details/80285123 大資料Zookeeper系列之Zookeeper叢集部署:https://

資料系列1文初識Hdfs

最近有位同事經常問一些Hadoop的東西,特別是Hdfs的一些細節,有些記得不清楚,所以趁機整理一波。 會按下面的大綱進行整理: 1. 簡單介紹``Hdfs`` 2. 簡單介紹``Hdfs``讀寫流程 3. 介紹``Hdfs HA``實現方式 4. 介紹``Yarn``統一資源管理器 5. 追一下``

Kubernetes資料之二編譯並執行基於Scalar的Spark程式WordCount

一、前言 通過SBT編譯scala程式然後在Kubernetes使用Spark執行WordCount任務。 轉載自https://blog.csdn.net/cloudvtech 二、安裝環境和編譯 2.1 安裝SBT mv bintray-sbt-rpm

資料學習系列8-Centos6.7 hadoop-2.6.5下sqoop-1.4.6的安裝部署

安裝sqoop的前提是已經具備java和hadoop的環境 1、下載並解壓 2、修改配置檔案 $ cd $SQOOP_HOME/conf $ mv sqoop-env-template.sh sqoop-env.sh 開啟sqoop-env.sh並編輯下面幾

《架構系列部署應用到Tomcat叢集中》

基於前面的《架構系列三:使用Keepalived+Nginx+tomcat實現叢集部署》,我們配置了nginx+Tomcat叢集,如果需要在VM1,VM2各部署6個Tomcat,這時候怎麼將應用部署到叢集中呢,如果手動一個一個的部署,那要部署12次,效率非常底,因此我們迫切需要一鍵自動部

資料生態系統基礎Apache Kafka基礎(介紹和安裝

http://blog.csdn.net/zhy_yz/article/details/5905637 一、 Apache kafka基礎介紹           1、kafka 是什麼?              首先一句話: Apache Kaf

初學資料之模組整合Pycharm安裝numpy,scipy,sklearn等包時遇到的各種問題的解決方法

最近在學習機器學習,要用Python寫程式,習慣了用IDE軟體,所以就使用Pycharm軟體。但是在匯入類似numpy,sklearn等模組的時候,發現了各種問題(如Python版本與模組之間的相容等各類問題),上網找了許多方法,最後總算總結出了這條最快捷的方法

CM+CDH構建企業資料平臺系列

問題導讀:1、CM是什麼?2、CDH是什麼?3、CM+CDH是什麼?4、什麼是企業大資料平臺?5、如何用CM+CDH構建企業大資料平臺?..........帶著種種疑問讓我們開啟真正的企業級大資料平臺搭建之旅。    隨著網際網路,尤其是移動網際網路和智慧移動裝置的高速發展和

Android自定義控制元件系列詳解onMeasure()方法中如何測量一個控制元件尺寸()

自定義view/viewgroup要重寫的幾個方法:onMeasure(),onLayout(),onDraw()。(不熟悉的話可以檢視專欄的前幾篇文章:)。         今天的任務就是詳細研究一下protected void onMeasure(int wid

資料生態系統基礎 HBASE(HBASE 介紹及安裝、配置

一、介紹        Apache HBase是Hadoop資料庫,一個分散式的、可伸縮的大型資料儲存。        當您需要隨機的、實時的讀/寫訪問您的大資料時,請使用Apache HBase。這個專案的目標是承載非常大的表——數十億行X百萬列的列——執行在在商用硬體

用Ambari部署資料平臺

安裝前準備先明確幾個概念: 1. Ambari只能安裝Hortonworks Data Platform,即Hortonworks的開源Hadoop,不支援Apach的Hadoop平臺; 2. 對於已經安裝了Apach Hadoop或者其他Hadoop平臺的,不能使用Amba

Android自定義控制元件系列自定義開關按鈕(

這一次我們將會實現一個完整純粹的自定義控制元件,而不是像之前的組合控制元件一樣,拿系統的控制元件來實現;計劃分為三部分:自定義控制元件的基本部分,和自定義控制元件的自定義屬性; 下面就開始第一部分的編寫,本次以一個定義的開關按鈕為例,下面就開始吧: 先看看效果,一個點選開

Skype For Business 2015綜合部署系列AD域部署等Skype 安裝先決條件

自動申請證書策略 server 2012 搭建域環境 server 2012 配置ca skype 2015部署 skype 2015 配置dns相關記 本篇博文進入Skype for business 2015 綜合部署系列的第二部分:配置AD域環境、安裝Ca證書、配置自動申請證書策略

Docker教程系列Docker上部署tomcat

order targe borde tab 網站 web 系列 pull true 1下載tomcat鏡像(7-jre8代表tomcat7和java jdk8,tomcat需要java環境,點擊下面連接可以查看可下載的版本) 查看可下載版本 docker pull

Docker教程系列Docker上部署Nginx

res host format 系列 ive nec efault bin con 1下載Nginx鏡像 docker pull nginx 2創建Nginx容器 docker run -di --name=nginx -p 80:80 nginx

Docker教程系列Docker上部署Redis

客戶 style pull table 客戶端測試 border docker pac idt 1下載Redis鏡像 docker pull redis 2創建Redis容器 docker run -di --name=redis -p 6379:

zookeeper系列獨立模式部署zookeeper服務

pat 觀察 系統環境 centos 復制 init pac 很多 編輯 一、簡述   獨立模式是部署zookeeper服務的三種模式中最簡單和最基礎的模式,只需一臺機器即可,獨立模式僅適用於學習,開發和生產都不建議使用獨立模式。本文介紹以獨立模式部署zookeeper服務

資料元件GC問題

GC,指Garbage Collection 是JAVA中的垃圾收集器。 相關元件的常見GC問題 1、Namenode的堆記憶體配置過小導致頻繁產生full GC導致namenode宕機,在hadoop中,資料的寫入&讀取經由namenode,所以namenode的jvm記憶體需