<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-314  評論-209  文章-0  trackbacks-0
     

    可參照:http://www.voidcn.com/blog/Vindra/article/p-4917667.html

    一、get請求 

    curl "http://www.baidu.com"  如果這里的URL指向的是一個文件或者一幅圖都可以直接下載到本地

    curl -i "http://www.baidu.com"  顯示全部信息

    curl -l "http://www.baidu.com" 只顯示頭部信息

    curl -v "http://www.baidu.com" 顯示get請求全過程解析

     

    wget "http://www.baidu.com"也可以

     

    二、post請求

    curl -d "param1=value1&param2=value2" "http://www.baidu.com"

     

    三、json格式的post請求

    curl -l -H "Content-type: application/json" -X POST -d '{"phone":"13521389587","password":"test"}' http://domain/apis/users.json

    例如:

    curl -l -H "Content-type: application/json" -X POST -d '{"ver": "1.0","soa":{"req":"123"},"iface":"me.ele.lpdinfra.prediction.service.PredictionService","method":"restaurant_make_order_time","args":{"arg2":"\"stable\"","arg1":"{\"code\":[\"WIND\"],\"temperature\":11.11}","arg0":"{\"tracking_id\":\"100000000331770936\",\"eleme_order_id\":\"100000000331770936\",\"platform_id\":\"4\",\"restaurant_id\":\"482571\",\"dish_num\":1,\"dish_info\":[{\"entity_id\":142547763,\"quantity\":1,\"category_id\":1,\"dish_name\":\"[0xe7][0x89][0xb9][0xe4][0xbb][0xb7][0xe8][0x85][0x8a][0xe5][0x91][0xb3][0xe5][0x8f][0x89][0xe7][0x83][0xa7][0xe5][0x8f][0x8c][0xe6][0x8b][0xbc][0xe7][0x85][0xb2][0xe4][0xbb][0x94][0xe9][0xa5][0xad]\",\"price\":31.0}],\"merchant_location\":{\"longitude\":\"121.47831425\",\"latitude\":\"31.27576153\"},\"customer_location\":{\"longitude\":\"121.47831425\",\"latitude\":\"31.27576153\"},\"created_at\":1477896550,\"confirmed_at\":1477896550,\"dishes_total_price\":0.0,\"food_boxes_total_price\":2.0,\"delivery_total_price\":2.0,\"pay_amount\":35.0,\"city_id\":\"1\"}"}}' http://vpcb-lpdinfra-stream-1.vm.elenet.me:8989/rpc

    ps:json串內層參數需要格式化

    posted @ 2017-05-18 11:28 xzc 閱讀(1646) | 評論 (1)編輯 收藏
    服務器上的一些統計數據:

    1)統計80端口連接數
    netstat -nat|grep -i "80"|wc -l

    2)統計httpd協議連接數
    ps -ef|grep httpd|wc -l

    3)、統計已連接上的,狀態為“established
    netstat -na|grep ESTABLISHED|wc -l

    4)、查出哪個IP地址連接最多,將其封了.
    netstat -na|grep ESTABLISHED|awk {print $5}|awk -F: {print $1}|sort|uniq -c|sort -r +0n

    netstat -na|grep SYN|awk {print $5}|awk -F: {print $1}|sort|uniq -c|sort -r +0n

    ---------------------------------------------------------------------------------------------

    1、查看apache當前并發訪問數:
    netstat -an | grep ESTABLISHED | wc -l

    對比httpd.conf中MaxClients的數字差距多少。

    2、查看有多少個進程數:
    ps aux|grep httpd|wc -l

    3、可以使用如下參數查看數據
    server-status?auto

    #ps -ef|grep httpd|wc -l
    1388
    統計httpd進程數,連個請求會啟動一個進程,使用于Apache服務器。
    表示Apache能夠處理1388個并發請求,這個值Apache可根據負載情況自動調整。

    #netstat -nat|grep -i "80"|wc -l
    4341
    netstat -an會打印系統當前網絡鏈接狀態,而grep -i "80"是用來提取與80端口有關的連接的,wc -l進行連接數統計。
    最終返回的數字就是當前所有80端口的請求總數。

    #netstat -na|grep ESTABLISHED|wc -l
    376
    netstat -an會打印系統當前網絡鏈接狀態,而grep ESTABLISHED 提取出已建立連接的信息。 然后wc -l統計。
    最終返回的數字就是當前所有80端口的已建立連接的總數。

    netstat -nat||grep ESTABLISHED|wc - 可查看所有建立連接的詳細記錄

    查看Apache的并發請求數及其TCP連接狀態:
    Linux命令:
    netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

    返回結果示例:
    LAST_ACK 5
    SYN_RECV 30
    ESTABLISHED 1597
    FIN_WAIT1 51
    FIN_WAIT2 504
    TIME_WAIT 1057
    其中的
    SYN_RECV表示正在等待處理的請求數;
    ESTABLISHED表示正常數據傳輸狀態;
    TIME_WAIT表示處理完畢,等待超時結束的請求數。

    ---------------------------------------------------------------------------------------------

    查看httpd進程數(即prefork模式下Apache能夠處理的并發請求數):
    Linux命令:
         ps -ef | grep httpd | wc -l

    查看Apache的并發請求數及其TCP連接狀態:

    Linux命令:
         netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
    返回結果示例:
    LAST_ACK 5
    SYN_RECV 30
    ESTABLISHED 1597
    FIN_WAIT1 51
    FIN_WAIT2 504
    TIME_WAIT 1057

    說明:
       SYN_RECV表示正在等待處理的請求數;
       ESTABLISHED表示正常數據傳輸狀態;
       TIME_WAIT表示處理完畢,等待超時結束的請求數。
    posted @ 2017-05-17 23:12 xzc 閱讀(1470) | 評論 (2)編輯 收藏

    一、回收站簡介:

        在HDFS里,刪除文件時,不會真正的刪除,其實是放入回收站/trash,回收站里的文件可以快速恢復。

        可以設置一個時間閥值,當回收站里文件的存放時間超過這個閥值或是回收站被清空時,文件才會被徹底刪除,并且釋放占用的數據塊。

    二、實例:

        Hadoop的回收站trash功能默認是關閉的,所以需要在core-site.xml中手動開啟。

    1、修改core-site.xml,增加:

    復制代碼
    <property>  <name>fs.trash.interval</name>  <value>1440</value>  <description>Number of minutes between trash checkpoints.  If zero, the trash feature is disabled.  </description>  </property>
    復制代碼

    默認是0,單位是分鐘,這里設置為1天。
    刪除數據rm后,會將數據move到當前文件夾下的.Trash目錄。

    2、測試

    1)、新建目錄input

    hadoop/bin/hadoop fs -mkdir input

    2)、上傳文件

    root@master:/data/soft# hadoop/bin/hadoop fs -copyFromLocal /data/soft/file0* input

    3)、刪除目錄input

    [root@master data]# hadoop fs -rmr input  Moved to trash: hdfs://master:9000/user/root/input

    4)、查看當前目錄

    [root@master data]# hadoop fs -ls  Found 2 items  drwxr-xr-x - root supergroup 0 2011-02-12 22:17 /user/root/.Trash

    發現input刪除了,多了一個目錄.Trash
    5)、恢復剛剛刪除的目錄

    [root@master data]# hadoop fs -mv /user/root/.Trash/Current/user/root/input /user/root/input

    6)、查看恢復的數據

    [root@master data]# hadoop fs -ls input  Found 2 items  -rw-r--r-- 3 root supergroup 22 2011-02-12 17:40 /user/root/input/file01  -rw-r--r-- 3 root supergroup 28 2011-02-12 17:40 /user/root/input/file02

    7)、刪除.Trash目錄(清理垃圾)

    [root@master data]# hadoop fs -rmr .Trash  Deleted hdfs://master:9000/user/root/.Trash
    posted @ 2017-05-12 11:20 xzc 閱讀(215) | 評論 (0)編輯 收藏
         摘要:  以前用redis用的很多,各種數據類型用的飛起,算是用得很溜了。不過那都是封裝好的方法,自己直接調用。以前的公司比較規范,開發只是開發,很少去做跟運維相關的事情。             換了一份工作,不過這邊項目剛開始起步,各種東西還不是很全,需要從頭做起。運維什么的都是自己來。這下要考慮的東西就多了。比如說re...  閱讀全文
    posted @ 2017-05-10 10:49 xzc 閱讀(320) | 評論 (0)編輯 收藏
    轉自:http://www.cnblogs.com/cyfonly/p/5954614.html

    一、為什么需要消息系統

    復制代碼
    1.解耦:   允許你獨立的擴展或修改兩邊的處理過程,只要確保它們遵守同樣的接口約束。 2.冗余:   消息隊列把數據進行持久化直到它們已經被完全處理,通過這一方式規避了數據丟失風險。許多消息隊列所采用的"插入-獲取-刪除"范式中,在把一個消息從隊列中刪除之前,需要你的處理系統明確的指出該消息已經被處理完畢,從而確保你的數據被安全的保存直到你使用完畢。 3.擴展性:   因為消息隊列解耦了你的處理過程,所以增大消息入隊和處理的頻率是很容易的,只要另外增加處理過程即可。 4.靈活性 & 峰值處理能力:   在訪問量劇增的情況下,應用仍然需要繼續發揮作用,但是這樣的突發流量并不常見。如果為以能處理這類峰值訪問為標準來投入資源隨時待命無疑是巨大的浪費。使用消息隊列能夠使關鍵組件頂住突發的訪問壓力,而不會因為突發的超負荷的請求而完全崩潰。 5.可恢復性:   系統的一部分組件失效時,不會影響到整個系統。消息隊列降低了進程間的耦合度,所以即使一個處理消息的進程掛掉,加入隊列中的消息仍然可以在系統恢復后被處理。 6.順序保證:   在大多使用場景下,數據處理的順序都很重要。大部分消息隊列本來就是排序的,并且能保證數據會按照特定的順序來處理。(Kafka 保證一個 Partition 內的消息的有序性) 7.緩沖:   有助于控制和優化數據流經過系統的速度,解決生產消息和消費消息的處理速度不一致的情況。 8.異步通信:   很多時候,用戶不想也不需要立即處理消息。消息隊列提供了異步處理機制,允許用戶把一個消息放入隊列,但并不立即處理它。想向隊列中放入多少消息就放多少,然后在需要的時候再去處理它們。
    復制代碼

     

    二、kafka 架構

    2.1 拓撲結構

    如下圖:

    圖.1

    2.2 相關概念

    如圖.1中,kafka 相關名詞解釋如下:

    復制代碼
    1.producer:   消息生產者,發布消息到 kafka 集群的終端或服務。 2.broker:   kafka 集群中包含的服務器。 3.topic:   每條發布到 kafka 集群的消息屬于的類別,即 kafka 是面向 topic 的。 4.partition:   partition 是物理上的概念,每個 topic 包含一個或多個 partition。kafka 分配的單位是 partition。 5.consumer:   從 kafka 集群中消費消息的終端或服務。 6.Consumer group:   high-level consumer API 中,每個 consumer 都屬于一個 consumer group,每條消息只能被 consumer group 中的一個 Consumer 消費,但可以被多個 consumer group 消費。 7.replica:   partition 的副本,保障 partition 的高可用。 8.leader:   replica 中的一個角色, producer 和 consumer 只跟 leader 交互。 9.follower:   replica 中的一個角色,從 leader 中復制數據。 10.controller:   kafka 集群中的其中一個服務器,用來進行 leader election 以及 各種 failover。 12.zookeeper:   kafka 通過 zookeeper 來存儲集群的 meta 信息。
    復制代碼

    2.3 zookeeper 節點

    kafka 在 zookeeper 中的存儲結構如下圖所示:

     

    圖.2

     

    三、producer 發布消息

    3.1 寫入方式

    producer 采用 push 模式將消息發布到 broker,每條消息都被 append 到 patition 中,屬于順序寫磁盤(順序寫磁盤效率比隨機寫內存要高,保障 kafka 吞吐率)。

    3.2 消息路由

    producer 發送消息到 broker 時,會根據分區算法選擇將其存儲到哪一個 partition。其路由機制為:

    1. 指定了 patition,則直接使用; 2. 未指定 patition 但指定 key,通過對 key 的 value 進行hash 選出一個 patition 3. patition 和 key 都未指定,使用輪詢選出一個 patition。

     附上 java 客戶端分區源碼,一目了然:

    復制代碼
    //創建消息實例 public ProducerRecord(String topic, Integer partition, Long timestamp, K key, V value) {      if (topic == null)           throw new IllegalArgumentException("Topic cannot be null");      if (timestamp != null && timestamp < 0)           throw new IllegalArgumentException("Invalid timestamp " + timestamp);      this.topic = topic;      this.partition = partition;      this.key = key;      this.value = value;      this.timestamp = timestamp; }  //計算 patition,如果指定了 patition 則直接使用,否則使用 key 計算 private int partition(ProducerRecord<K, V> record, byte[] serializedKey , byte[] serializedValue, Cluster cluster) {      Integer partition = record.partition();      if (partition != null) {           List<PartitionInfo> partitions = cluster.partitionsForTopic(record.topic());           int lastPartition = partitions.size() - 1;           if (partition < 0 || partition > lastPartition) {                throw new IllegalArgumentException(String.format("Invalid partition given with record: %d is not in the range [0...%d].", partition, lastPartition));           }           return partition;      }      return this.partitioner.partition(record.topic(), record.key(), serializedKey, record.value(), serializedValue, cluster); }  // 使用 key 選取 patition public int partition(String topic, Object key, byte[] keyBytes, Object value, byte[] valueBytes, Cluster cluster) {      List<PartitionInfo> partitions = cluster.partitionsForTopic(topic);      int numPartitions = partitions.size();      if (keyBytes == null) {           int nextValue = counter.getAndIncrement();           List<PartitionInfo> availablePartitions = cluster.availablePartitionsForTopic(topic);           if (availablePartitions.size() > 0) {                int part = DefaultPartitioner.toPositive(nextValue) % availablePartitions.size();                return availablePartitions.get(part).partition();           } else {                return DefaultPartitioner.toPositive(nextValue) % numPartitions;           }      } else {           //對 keyBytes 進行 hash 選出一個 patition           return DefaultPartitioner.toPositive(Utils.murmur2(keyBytes)) % numPartitions;      } }
    復制代碼

    3.3 寫入流程

     producer 寫入消息序列圖如下所示:

    圖.3

    流程說明:

    復制代碼
    1. producer 先從 zookeeper 的 "/brokers/.../state" 節點找到該 partition 的 leader 2. producer 將消息發送給該 leader 3. leader 將消息寫入本地 log 4. followers 從 leader pull 消息,寫入本地 log 后 leader 發送 ACK 5. leader 收到所有 ISR 中的 replica 的 ACK 后,增加 HW(high watermark,最后 commit 的 offset) 并向 producer 發送 ACK
    復制代碼

    3.4 producer delivery guarantee

     一般情況下存在三種情況:

    1. At most once 消息可能會丟,但絕不會重復傳輸 2. At least one 消息絕不會丟,但可能會重復傳輸 3. Exactly once 每條消息肯定會被傳輸一次且僅傳輸一次

    當 producer 向 broker 發送消息時,一旦這條消息被 commit,由于 replication 的存在,它就不會丟。但是如果 producer 發送數據給 broker 后,遇到網絡問題而造成通信中斷,那 Producer 就無法判斷該條消息是否已經 commit。雖然 Kafka 無法確定網絡故障期間發生了什么,但是 producer 可以生成一種類似于主鍵的東西,發生故障時冪等性的重試多次,這樣就做到了 Exactly once,但目前還并未實現。所以目前默認情況下一條消息從 producer 到 broker 是確保了 At least once,可通過設置 producer 異步發送實現At most once。

     

    四、broker 保存消息

    4.1 存儲方式

    物理上把 topic 分成一個或多個 patition(對應 server.properties 中的 num.partitions=3 配置),每個 patition 物理上對應一個文件夾(該文件夾存儲該 patition 的所有消息和索引文件),如下:

     

    圖.4

    4.2 存儲策略

    無論消息是否被消費,kafka 都會保留所有消息。有兩種策略可以刪除舊數據:

    1. 基于時間:log.retention.hours=168 2. 基于大小:log.retention.bytes=1073741824

    需要注意的是,因為Kafka讀取特定消息的時間復雜度為O(1),即與文件大小無關,所以這里刪除過期文件與提高 Kafka 性能無關。

    4.3 topic 創建與刪除

    4.3.1 創建 topic

    創建 topic 的序列圖如下所示:

    圖.5

    流程說明:

    復制代碼
    1. controller 在 ZooKeeper 的 /brokers/topics 節點上注冊 watcher,當 topic 被創建,則 controller 會通過 watch 得到該 topic 的 partition/replica 分配。 2. controller從 /brokers/ids 讀取當前所有可用的 broker 列表,對于 set_p 中的每一個 partition: 	2.1 從分配給該 partition 的所有 replica(稱為AR)中任選一個可用的 broker 作為新的 leader,并將AR設置為新的 ISR 	2.2 將新的 leader 和 ISR 寫入 /brokers/topics/[topic]/partitions/[partition]/state 3. controller 通過 RPC 向相關的 broker 發送 LeaderAndISRRequest。
    復制代碼

    4.3.2 刪除 topic

    刪除 topic 的序列圖如下所示:

    圖.6

    流程說明:

    1. controller 在 zooKeeper 的 /brokers/topics 節點上注冊 watcher,當 topic 被刪除,則 controller 會通過 watch 得到該 topic 的 partition/replica 分配。 2. 若 delete.topic.enable=false,結束;否則 controller 注冊在 /admin/delete_topics 上的 watch 被 fire,controller 通過回調向對應的 broker 發送 StopReplicaRequest。

     

    五、kafka HA

    5.1 replication

    如圖.1所示,同一個 partition 可能會有多個 replica(對應 server.properties 配置中的 default.replication.factor=N)。沒有 replica 的情況下,一旦 broker 宕機,其上所有 patition 的數據都不可被消費,同時 producer 也不能再將數據存于其上的 patition。引入replication 之后,同一個 partition 可能會有多個 replica,而這時需要在這些 replica 之間選出一個 leader,producer 和 consumer 只與這個 leader 交互,其它 replica 作為 follower 從 leader 中復制數據。

    Kafka 分配 Replica 的算法如下:

    1. 將所有 broker(假設共 n 個 broker)和待分配的 partition 排序 2. 將第 i 個 partition 分配到第(i mod n)個 broker 上 3. 將第 i 個 partition 的第 j 個 replica 分配到第((i + j) mode n)個 broker上

    5.2 leader failover

    當 partition 對應的 leader 宕機時,需要從 follower 中選舉出新 leader。在選舉新leader時,一個基本的原則是,新的 leader 必須擁有舊 leader commit 過的所有消息。

    kafka 在 zookeeper 中(/brokers/.../state)動態維護了一個 ISR(in-sync replicas),由3.3節的寫入流程可知 ISR 里面的所有 replica 都跟上了 leader,只有 ISR 里面的成員才能選為 leader。對于 f+1 個 replica,一個 partition 可以在容忍 f 個 replica 失效的情況下保證消息不丟失。

    當所有 replica 都不工作時,有兩種可行的方案:

    1. 等待 ISR 中的任一個 replica 活過來,并選它作為 leader。可保障數據不丟失,但時間可能相對較長。 2. 選擇第一個活過來的 replica(不一定是 ISR 成員)作為 leader。無法保障數據不丟失,但相對不可用時間較短。

    kafka 0.8.* 使用第二種方式。

    kafka 通過 Controller 來選舉 leader,流程請參考5.3節。

    5.3 broker failover

    kafka broker failover 序列圖如下所示:

    圖.7

    流程說明: 

    復制代碼
    1. controller 在 zookeeper 的 /brokers/ids/[brokerId] 節點注冊 Watcher,當 broker 宕機時 zookeeper 會 fire watch 2. controller 從 /brokers/ids 節點讀取可用broker 3. controller決定set_p,該集合包含宕機 broker 上的所有 partition 4. 對 set_p 中的每一個 partition     4.1 從/brokers/topics/[topic]/partitions/[partition]/state 節點讀取 ISR     4.2 決定新 leader(如4.3節所描述)     4.3 將新 leader、ISR、controller_epoch 和 leader_epoch 等信息寫入 state 節點 5. 通過 RPC 向相關 broker 發送 leaderAndISRRequest 命令
    復制代碼

    5.4 controller failover

     當 controller 宕機時會觸發 controller failover。每個 broker 都會在 zookeeper 的 "/controller" 節點注冊 watcher,當 controller 宕機時 zookeeper 中的臨時節點消失,所有存活的 broker 收到 fire 的通知,每個 broker 都嘗試創建新的 controller path,只有一個競選成功并當選為 controller。

    當新的 controller 當選時,會觸發 KafkaController.onControllerFailover 方法,在該方法中完成如下操作:

    復制代碼
    1. 讀取并增加 Controller Epoch。 2. 在 reassignedPartitions Patch(/admin/reassign_partitions) 上注冊 watcher。 3. 在 preferredReplicaElection Path(/admin/preferred_replica_election) 上注冊 watcher。 4. 通過 partitionStateMachine 在 broker Topics Patch(/brokers/topics) 上注冊 watcher。 5. 若 delete.topic.enable=true(默認值是 false),則 partitionStateMachine 在 Delete Topic Patch(/admin/delete_topics) 上注冊 watcher。 6. 通過 replicaStateMachine在 Broker Ids Patch(/brokers/ids)上注冊Watch。 7. 初始化 ControllerContext 對象,設置當前所有 topic,“活”著的 broker 列表,所有 partition 的 leader 及 ISR等。 8. 啟動 replicaStateMachine 和 partitionStateMachine。 9. 將 brokerState 狀態設置為 RunningAsController。 10. 將每個 partition 的 Leadership 信息發送給所有“活”著的 broker。 11. 若 auto.leader.rebalance.enable=true(默認值是true),則啟動 partition-rebalance 線程。 12. 若 delete.topic.enable=true 且Delete Topic Patch(/admin/delete_topics)中有值,則刪除相應的Topic。
    復制代碼

     

    6. consumer 消費消息

    6.1 consumer API

    kafka 提供了兩套 consumer API:

    1. The high-level Consumer API 2. The SimpleConsumer API

     其中 high-level consumer API 提供了一個從 kafka 消費數據的高層抽象,而 SimpleConsumer API 則需要開發人員更多地關注細節。

    6.1.1 The high-level consumer API

    high-level consumer API 提供了 consumer group 的語義,一個消息只能被 group 內的一個 consumer 所消費,且 consumer 消費消息時不關注 offset,最后一個 offset 由 zookeeper 保存。

    使用 high-level consumer API 可以是多線程的應用,應當注意:

    1. 如果消費線程大于 patition 數量,則有些線程將收不到消息 2. 如果 patition 數量大于線程數,則有些線程多收到多個 patition 的消息 3. 如果一個線程消費多個 patition,則無法保證你收到的消息的順序,而一個 patition 內的消息是有序的

    6.1.2 The SimpleConsumer API

    如果你想要對 patition 有更多的控制權,那就應該使用 SimpleConsumer API,比如:

    1. 多次讀取一個消息 2. 只消費一個 patition 中的部分消息 3. 使用事務來保證一個消息僅被消費一次

     但是使用此 API 時,partition、offset、broker、leader 等對你不再透明,需要自己去管理。你需要做大量的額外工作:

    1. 必須在應用程序中跟蹤 offset,從而確定下一條應該消費哪條消息 2. 應用程序需要通過程序獲知每個 Partition 的 leader 是誰 3. 需要處理 leader 的變更

     使用 SimpleConsumer API 的一般流程如下:

    復制代碼
    1. 查找到一個“活著”的 broker,并且找出每個 partition 的 leader 2. 找出每個 partition 的 follower 3. 定義好請求,該請求應該能描述應用程序需要哪些數據 4. fetch 數據 5. 識別 leader 的變化,并對之作出必要的響應
    復制代碼

    以下針對 high-level Consumer API 進行說明。

    6.2 consumer group

    如 2.2 節所說, kafka 的分配單位是 patition。每個 consumer 都屬于一個 group,一個 partition 只能被同一個 group 內的一個 consumer 所消費(也就保障了一個消息只能被 group 內的一個 consuemr 所消費),但是多個 group 可以同時消費這個 partition。

    kafka 的設計目標之一就是同時實現離線處理和實時處理,根據這一特性,可以使用 spark/Storm 這些實時處理系統對消息在線處理,同時使用 Hadoop 批處理系統進行離線處理,還可以將數據備份到另一個數據中心,只需要保證這三者屬于不同的 consumer group。如下圖所示:

     

    圖.8

    6.3 消費方式

    consumer 采用 pull 模式從 broker 中讀取數據。

    push 模式很難適應消費速率不同的消費者,因為消息發送速率是由 broker 決定的。它的目標是盡可能以最快速度傳遞消息,但是這樣很容易造成 consumer 來不及處理消息,典型的表現就是拒絕服務以及網絡擁塞。而 pull 模式則可以根據 consumer 的消費能力以適當的速率消費消息。

    對于 Kafka 而言,pull 模式更合適,它可簡化 broker 的設計,consumer 可自主控制消費消息的速率,同時 consumer 可以自己控制消費方式——即可批量消費也可逐條消費,同時還能選擇不同的提交方式從而實現不同的傳輸語義。

    6.4 consumer delivery guarantee

    如果將 consumer 設置為 autocommit,consumer 一旦讀到數據立即自動 commit。如果只討論這一讀取消息的過程,那 Kafka 確保了 Exactly once。

    但實際使用中應用程序并非在 consumer 讀取完數據就結束了,而是要進行進一步處理,而數據處理與 commit 的順序在很大程度上決定了consumer delivery guarantee:

    復制代碼
    1.讀完消息先 commit 再處理消息。     這種模式下,如果 consumer 在 commit 后還沒來得及處理消息就 crash 了,下次重新開始工作后就無法讀到剛剛已提交而未處理的消息,這就對應于 At most once 2.讀完消息先處理再 commit。     這種模式下,如果在處理完消息之后 commit 之前 consumer crash 了,下次重新開始工作時還會處理剛剛未 commit 的消息,實際上該消息已經被處理過了。這就對應于 At least once。 3.如果一定要做到 Exactly once,就需要協調 offset 和實際操作的輸出。     精典的做法是引入兩階段提交。如果能讓 offset 和操作輸入存在同一個地方,會更簡潔和通用。這種方式可能更好,因為許多輸出系統可能不支持兩階段提交。比如,consumer 拿到數據后可能把數據放到 HDFS,如果把最新的 offset 和數據本身一起寫到 HDFS,那就可以保證數據的輸出和 offset 的更新要么都完成,要么都不完成,間接實現 Exactly once。(目前就 high-level API而言,offset 是存于Zookeeper 中的,無法存于HDFS,而SimpleConsuemr API的 offset 是由自己去維護的,可以將之存于 HDFS 中)
    復制代碼

    總之,Kafka 默認保證 At least once,并且允許通過設置 producer 異步提交來實現 At most once(見文章《kafka consumer防止數據丟失》)。而 Exactly once 要求與外部存儲系統協作,幸運的是 kafka 提供的 offset 可以非常直接非常容易得使用這種方式。

    更多關于 kafka 傳輸語義的信息請參考《Message Delivery Semantics》。

    6.5 consumer rebalance

    當有 consumer 加入或退出、以及 partition 的改變(如 broker 加入或退出)時會觸發 rebalance。consumer rebalance算法如下:

    復制代碼
    1. 將目標 topic 下的所有 partirtion 排序,存于PT 2. 對某 consumer group 下所有 consumer 排序,存于 CG,第 i 個consumer 記為 Ci 3. N=size(PT)/size(CG),向上取整 4. 解除 Ci 對原來分配的 partition 的消費權(i從0開始) 5. 將第i*N到(i+1)*N-1個 partition 分配給 Ci
    復制代碼

    在 0.8.*版本,每個 consumer 都只負責調整自己所消費的 partition,為了保證整個consumer group 的一致性,當一個 consumer 觸發了 rebalance 時,該 consumer group 內的其它所有其它 consumer 也應該同時觸發 rebalance。這會導致以下幾個問題:

    復制代碼
    1.Herd effect   任何 broker 或者 consumer 的增減都會觸發所有的 consumer 的 rebalance 2.Split Brain   每個 consumer 分別單獨通過 zookeeper 判斷哪些 broker 和 consumer 宕機了,那么不同 consumer 在同一時刻從 zookeeper 看到的 view 就可能不一樣,這是由 zookeeper 的特性決定的,這就會造成不正確的 reblance 嘗試。 3. 調整結果不可控   所有的 consumer 都并不知道其它 consumer 的 rebalance 是否成功,這可能會導致 kafka 工作在一個不正確的狀態。
    復制代碼

    基于以上問題,kafka 設計者考慮在0.9.*版本開始使用中心 coordinator 來控制 consumer rebalance,然后又從簡便性和驗證要求兩方面考慮,計劃在 consumer 客戶端實現分配方案。(見文章《Kafka Detailed Consumer Coordinator Design》和《Kafka Client-side Assignment Proposal》),此處不再贅述。

     

    七、注意事項

    7.1 producer 無法發送消息的問題

    最開始在本機搭建了kafka偽集群,本地 producer 客戶端成功發布消息至 broker。隨后在服務器上搭建了 kafka 集群,在本機連接該集群,producer 卻無法發布消息到 broker(奇怪也沒有拋錯)。最開始懷疑是 iptables 沒開放,于是開放端口,結果還不行(又開始是代碼問題、版本問題等等,倒騰了很久)。最后沒辦法,一項一項查看 server.properties 配置,發現以下兩個配置:

    復制代碼
    # The address the socket server listens on. It will get the value returned from  # java.net.InetAddress.getCanonicalHostName() if not configured. #   FORMAT: #     listeners = security_protocol://host_name:port #   EXAMPLE: #     listeners = PLAINTEXT://your.host.name:9092 listeners=PLAINTEXT://:9092

     # Hostname and port the broker will advertise to producers and consumers. If not set, 
     # it uses the value for "listeners" if configured. Otherwise, it will use the value
     # returned from java.net.InetAddress.getCanonicalHostName().
     #advertised.listeners=PLAINTEXT://your.host.name:9092

    復制代碼

    以上說的就是 advertised.listeners 是 broker 給 producer 和 consumer 連接使用的,如果沒有設置,就使用 listeners,而如果 host_name 沒有設置的話,就使用 java.net.InetAddress.getCanonicalHostName() 方法返回的主機名。

    修改方法:

    1. listeners=PLAINTEXT://121.10.26.XXX:9092 2. advertised.listeners=PLAINTEXT://121.10.26.XXX:9092

    修改后重啟服務,正常工作。關于更多 kafka 配置說明,見文章《Kafka學習整理三(borker(0.9.0及0.10.0)配置)》。

     

    八、參考文章

    1. 《Kafka剖析(一):Kafka背景及架構介紹

    2. 《Kafka設計解析(二):Kafka High Availability (上)

    3. 《Kafka設計解析(二):Kafka High Availability (下)

    4. 《Kafka設計解析(四):Kafka Consumer解析

    5. 《Kafka設計解析(五):Kafka Benchmark

    6. 《Kafka學習整理三(borker(0.9.0及0.10.0)配置)

    7. 《Using the High Level Consumer

    8. 《Using SimpleConsumer

    9. 《Consumer Client Re-Design

    10. 《Message Delivery Semantics

    11. 《Kafka Detailed Consumer Coordinator Design

    12. 《Kafka Client-side Assignment Proposal

    13. 《Kafka和DistributedLog技術對比

    14. 《kafka安裝和啟動

    15. 《kafka consumer防止數據丟失

      

     

    作者:cyfonly
    本文版權歸作者和博客園共有,歡迎轉載,未經同意須保留此段聲明,且在文章頁面明顯位置給出原文連接。歡迎指正與交流。
    posted @ 2017-04-28 10:37 xzc 閱讀(318) | 評論 (0)編輯 收藏

    1.  Kerberos簡介

    1.1. 功能

    1. 一個安全認證協議

    2. 用tickets驗證

    3. 避免本地保存密碼和在互聯網上傳輸密碼

    4. 包含一個可信任的第三方

    5. 使用對稱加密

    6. 客戶端與服務器(非KDC)之間能夠相互驗證

    Kerberos只提供一種功能——在網絡上安全的完成用戶的身份驗證。它并不提供授權功能或者審計功能。

    1.2. 概念

    首次請求,三次通信方

    • the Authentication Server
    • the Ticket Granting Server
    • the Service or host machine that you’re wanting access to.

     

    圖 1‑1 角色

    其他知識點

    • 每次通信,消息包含兩部分,一部分可解碼,一部分不可解碼
    • 服務端不會直接有KDC通信
    • KDC保存所有機器的賬戶名和密碼
    • KDC本身具有一個密碼

    2.  3次通信

     

      我們這里已獲取服務器中的一張表(數據)的服務以為,為一個http服務。

    2.1. 你和驗證服務

      如果想要獲取http服務,你首先要向KDC表名你自己的身份。這個過程可以在你的程序啟動時進行。Kerberos可以通過kinit獲取。介紹自己通過未加密的信息發送至KDC獲取Ticket Granting Ticket (TGT)。

    (1)信息包含

    • 你的用戶名/ID
    • 你的IP地址
    • TGT的有效時間

      Authentication Server收到你的請求后,會去數據庫中驗證,你是否存在。注意,僅僅是驗證是否存在,不會驗證對錯。

      如果存在,Authentication Server會產生一個隨機的Session key(可以是一個64位的字符串)。這個key用于你和Ticket Granting Server (TGS)之間通信。

    (2)回送信息

      Authentication Server同樣會發送兩部分信息給你,一部分信息為TGT,通過KDC自己的密碼進行加密,包含:

    • 你的name/ID
    • TGS的name/ID
    • 時間戳
    • 你的IP地址
    • TGT的生命周期
    • TGS session key

    另外一部分通過你的密碼進行加密,包含的信息有

    • TGS的name/ID
    • 時間戳
    • 生命周期
    • TGS session key

     

    圖 2‑1 第一次通信

      如果你的密碼是正確的,你就能解密第二部分信息,獲取到TGS session key。如果,密碼不正確,無法解密,則認證失敗。第一部分信息TGT,你是無法解密的,但需要展示緩存起來。

    2.2. 你和TGS

    如果第一部分你已經成功,你已經擁有無法解密的TGT和一個TGS Session Key。

    (1)    請求信息

     a)  通過TGS Session Key加密的認證器部分:

    • 你的name/ID
    • 時間戳

    b)       明文傳輸部分:

    • 請求的Http服務名(就是請求信息)
    • HTTP Service的Ticket生命周期

    c)        TGT部分

      Ticket Granting Server收到信息后,首先檢查數據庫中是否包含有你請求的Http服務名。如果無,直接返回錯誤信息。

      如果存在,則通過KDC的密碼解密TGT,這個時候。我們就能獲取到TGS Session key。然后,通過TGS Session key去解密你傳輸的第一部分認證器,獲取到你的用戶名和時間戳。

    TGS再進行驗證:

    1. 對比TGT中的用戶名與認證器中的用戶名
    2. 比較時間戳(網上有說認證器中的時間錯和TGT中的時間錯,個人覺得應該是認證器中的時間戳和系統的時間戳),不能超過一定范圍
    3. 檢查是否過期
    4. 檢查IP地址是否一致
    5. 檢查認證器是否已在TGS緩存中(避免應答攻擊)
    6. 可以在這部分添加權限認證服務

      TGS隨機產生一個Http Service Session Key, 同時準備Http Service Ticket(ST)。

    (2)    回答信息

      a)        通過Http服務的密碼進行加密的信息(ST):

    • 你的name/ID
    • Http服務name/ID
    • 你的IP地址
    • 時間戳
    • ST的生命周期
    • Http Service Session Key

      b)       通過TGS Session Key加密的信息

    • Http服務name/ID
    • 時間戳
    • ST的生命周期
    • Http Service Session Key

      你收到信息后,通過TGS Session Key解密,獲取到了Http Service Session Key,但是你無法解密ST。

     

    圖 2‑2 第二次通信

    2.3. 你和Http服務

      在前面兩步成功后,以后每次獲取Http服務,在Ticket沒有過期,或者無更新的情況下,都可直接進行這一步。省略前面兩個步驟。

    (1)    請求信息

      a)        通過Http Service Session Key加密部分

    • 你的name/ID
    • 時間戳

      b)       ST

       Http服務端通過自己的密碼解壓ST(KDC是用Http服務的密碼加密的),這樣就能夠獲取到Http Service Session Key,解密第一部分。

    服務端解密好ST后,進行檢查

    1. 對比ST中的用戶名(KDC給的)與認證器中的用戶名
    2. 比較時間戳(網上有說認證器中的時間錯和TGT中的時間錯,個人覺得應該是認證器中的時間戳和系統的時間戳),不能超過一定范圍
    3. 檢查是否過期
    4. 檢查IP地址是否一致
    5. 檢查認證器是否已在HTTP服務端的緩存中(避免應答攻擊)

    (2)    應答信息

    a)        通過Http Service Session Key加密的信息

    • Http服務name/ID
    • 時間戳

     

    圖 2‑3 第三次通信

      你在通過緩存的Http Service Session Key解密這部分信息,然后驗證是否是你想要的服務器發送給你的信息。完成你的服務器的驗證。

    至此,整個過程全部完成。

    posted @ 2017-04-25 15:56 xzc 閱讀(256) | 評論 (2)編輯 收藏
    今有一小型項目,完全自主弄,原來以為很簡單的NTP服務,我給折騰了2個多小時才整撐頭(以前都是運維搞,沒太注意,所以這技術的東西,在簡單都需要親嘗啊),這里記錄為以后別再浪費時間。 目標環境,5臺linux centos 6.3, 一臺作為NTPD服務與外部公共NTP服務同步時間,同時作為內網的NTPD服務器,其他機器與這臺服務做時間同步。 服務器IP 角色 說明 同步方式 192.168.1.135 NTPD服務 1、負責與外部公共NTPD服務同步標準時間 2、作為內外網絡的NTPD服務 NTPD服務平滑同步 192.168.1.xxx 內外NTP客戶端 內網設備與192.168.1.135同步時間 NTPD服務平滑同步 …… 內外NTP客戶端 內網設備與192.168.1.135同步時間 NTPD服務平滑同步 1、NTP時間同步方式選擇 NTP同步方式在linux下一般兩種:使用ntpdate命令直接同步和使用NTPD服務平滑同步。有什么區別呢,簡單說下,免得時間長了,概念又模糊。 現有一臺設備,系統時間是 13:00 , 真實的當前時間(在空中,也許衛星上,這里假設是在準備同步的上級目標NTP服務器)是: 12:30 。如果我們使用ntpdate同步(ntpdate -u 目標NTP服務器IP),操作系統的時間立即更新為12:30,假如,我們的系統有一個定時應用,是在每天12:40運行,那么實際今天這個的任務已經運行過了(當前時間是13:00嘛),現在被ntpdate修改為12:30,那么意味作10分鐘后,又會執行一次任務,這就糟糕了,這個任務只能執行一次的嘛!!我想你(其實是我)已經懂了ntpdate時間同步的隱患,當然這個例子有些極端,但的確是有風險的,生產環境我不打算這么干,還是穩妥點好。所以解決該問題的辦法就是時間平滑更改,不會讓一個時間點在一天內經歷兩次,這就是NTPD服務方式平滑同步時間,它每次同步時間的偏移量不會太陡,是慢慢來的(問:怎么來,沒有細究,只曉得一次一點的同步,完全同步好需要較長時間,所以一般開啟NTPD服務同步前先用ntpdate先手動同步一次)。 2、安裝配置 CentOS 6.3系統已經自帶了NTPD服務,一般默認是按照了的,如果沒有安裝,先檢查下,然后配置好yum倉庫,yum方式安裝下就OK,具體如下: # rpm -q ntp ntp-4.2.4p8-2.el6.x86_64 // 這表示已安裝了,如果沒有安裝,這是空白。 如果沒有安裝,我們按照下 # yum install ntp ...... 按上面的安裝方式在內網每臺服務器上都安裝好NTP軟件包。 完成后,都需要配置NTP服務為自啟動 # chkconfig ntpd on # chkconfig --list ntpd ntpd 0:關閉 1:關閉 2:啟用 3:啟用 4:啟用 5:啟用 6:關閉 在配置前,先使用ntpdate手動同步下時間,免得本機與外部時間服務器時間差距太大,讓ntpd不能正常同步。 # ntpdate -u 202.112.10.36 22 Dec 16:52:38 ntpdate[6400]: adjust time server 202.112.10.36 offset 0.012135 sec 配置內網NTP-Server(192.168.1.135) 下面主要是配置內網的NPTD服務器(192.168.1.135), NTPD服務配置核心就在/etc/ntp.conf文件,配置好了就OK。網上特別是老外的文章都很簡單,我上當了,媽喲,基礎環境不一樣,我們得中國特色才行。先上配置文件再說,紅色部分是我的修改,其他的是默認。 # For more information about this file, see the man pages # ntp.conf(5), ntp_acc(5), ntp_auth(5), ntp_clock(5), ntp_misc(5), ntp_mon(5). driftfile /var/lib/ntp/drift # Permit time synchronization with our time source, but do not # permit the source to query or modify the service on this system. restrict default kod nomodify notrap nopeer noquery restrict -6 default kod nomodify notrap nopeer noquery # Permit all access over the loopback interface. This could # be tightened as well, but to do so would effect some of # the administrative functions. restrict 127.0.0.1 restrict -6 ::1 # Hosts on local network are less restricted. # 允許內網其他機器同步時間 restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap # Use public servers from the pool.ntp.org project. # Please consider joining the pool (http://www.pool.ntp.org/join.html). # 中國這邊最活躍的時間服務器 : http://www.pool.ntp.org/zone/cn server 210.72.145.44 perfer # 中國國家受時中心 server 202.112.10.36 # 1.cn.pool.ntp.org server 59.124.196.83 # 0.asia.pool.ntp.org #broadcast 192.168.1.255 autokey # broadcast server #broadcastclient # broadcast client #broadcast 224.0.1.1 autokey # multicast server #multicastclient 224.0.1.1 # multicast client #manycastserver 239.255.254.254 # manycast server #manycastclient 239.255.254.254 autokey # manycast client # allow update time by the upper server # 允許上層時間服務器主動修改本機時間 restrict 210.72.145.44 nomodify notrap noquery restrict 202.112.10.36 nomodify notrap noquery restrict 59.124.196.83 nomodify notrap noquery # Undisciplined Local Clock. This is a fake driver intended for backup # and when no outside source of synchronized time is available. # 外部時間服務器不可用時,以本地時間作為時間服務 server 127.127.1.0 # local clock fudge 127.127.1.0 stratum 10 # Enable public key cryptography. #crypto includefile /etc/ntp/crypto/pw # Key file containing the keys and key identifiers used when operating # with symmetric key cryptography. keys /etc/ntp/keys # Specify the key identifiers which are trusted. #trustedkey 4 8 42 # Specify the key identifier to use with the ntpdc utility. #requestkey 8 # Specify the key identifier to use with the ntpq utility. #controlkey 8 # Enable writing of statistics records. #statistics clockstats cryptostats loopstats peerstats 配置參數和命令簡單說明請參考:http://linux.vbird.org/linux_server/0440ntp.php#server_ntp.conf 配置文件修改完成,保存退出,啟動服務。 # service ntpd start ...... 啟動后,一般需要5-10分鐘左右的時候才能與外部時間服務器開始同步時間。可以通過命令查詢NTPD服務情況。 查看服務連接和監聽 # netstat -tlunp | grep ntp udp 0 0 192.168.1.135:123 0.0.0.0:* 23103/ntpd udp 0 0 127.0.0.1:123 0.0.0.0:* 23103/ntpd udp 0 0 0.0.0.0:123 0.0.0.0:* 23103/ntpd udp 0 0 fe80::6cae:8bff:fe3d:f65:123 :::* 23103/ntpd udp 0 0 fe80::6eae:8bff:fe3d:f65:123 :::* 23103/ntpd udp 0 0 ::1:123 :::* 23103/ntpd udp 0 0 :::123 :::* 23103/ntpd 看紅色加粗的地方,表示連接和監聽已正確,采用UDP方式 ntpq -p 查看網絡中的NTP服務器,同時顯示客戶端和每個服務器的關系 # ntpq -p # ntpq -p remote refid st t when poll reach delay offset jitter ============================================================================== *202.112.10.36 202.112.10.60 2 u 277 128 314 201.553 9.193 17.068 +59.124.196.83 129.6.15.28 2 u 88 128 377 71.153 -25.111 14.004 LOCAL(0) .LOCL. 10 l 15 64 377 0.000 0.000 0.000 位置 標志 含義 符號 * 響應的NTP服務器和最精確的服務器 + 響應這個查詢請求的NTP服務器 blank(空格) 沒有響應的NTP服務器 標題 remote 響應這個請求的NTP服務器的名稱 refid NTP服務器使用的更高一級服務器的名稱 st 正在響應請求的NTP服務器的級別 when 上一次成功請求之后到現在的秒數 poll 本地和遠程服務器多少時間進行一次同步,單位秒,在一開始運行NTP的時候這個poll值會比較小,服務器同步的頻率大,可以盡快調整到正確的時間范圍,之后poll值會逐漸增大,同步的頻率也就會相應減小 reach 用來測試能否和服務器連接,是一個八進制值,每成功連接一次它的值就會增加 delay 從本地機發送同步要求到ntp服務器的往返時間 offset 主機通過NTP時鐘同步與所同步時間源的時間偏移量,單位為毫秒,offset越接近于0,主機和ntp服務器的時間越接近 jitter 統計了在特定個連續的連接數里offset的分布情況。簡單地說這個數值的絕對值越小,主機的時間就越精確 ntpstat 命令查看時間同步狀態,這個一般需要5-10分鐘后才能成功連接和同步。所以,服務器啟動后需要稍等下。 剛啟動的時候,一般是: # ntpstat unsynchronised time server re-starting polling server every 64 s 連接并同步后: synchronised to NTP server (202.112.10.36) at stratum 3 time correct to within 275 ms polling server every 256 s OK,內網的NTPD服務已經配置完成,如果所有正常后,開始配置內網的其他設備與這臺服務器作為時間同步服務。 配置內網NTP-Clients 內網其他設備作為NTP的客戶端配置,相對就比較簡單,而且所有設備的配置都相同。 首先需要安裝NTPD服務,然后配置為自啟動(與NTP-Server完全一樣)。然后找其中一臺配置/etc/ntp.conf文件,配置完成驗證通過后,拷貝到其他客戶端機器,直接使用即可。 # yum install ntp ... # chkconfig ntp on # vim /etc/ntp.conf driftfile /var/lib/ntp/drift restrict 127.0.0.1 restrict -6 ::1 # 配置時間服務器為本地的時間服務器 server 192.168.1.135 restrict 192.168.1.135 nomodify notrap noquery server 127.127.1.0 # local clock fudge 127.127.1.0 stratum 10 includefile /etc/ntp/crypto/pw keys /etc/ntp/keys 為了簡單,這里只列出了配置項,注釋全部清理了。 OK,保存退出,請求服務器前,請先使用ntpdate手動同步下時間 # ntpdate -u 192.168.0.135 22 Dec 17:09:57 ntpdate[6439]: adjust time server 192.168.1.135 offset 0.004882 sec 這里有可能出現同步失敗,一般情況下原因都是本地的NTPD服務器還沒有正常啟動起來,一般需要幾分鐘時間后才能開始同步。 錯誤判斷請參考后面的錯誤處理。 # service ntpd start .... 啟動后,查看同步情況 # ntpq -p # ntpstat ..... 因為是內網,一般ntpstat很快就可以同步上,幾分鐘需要等下. OK,本機客戶端配置完成后,使用SCP拷貝/etc/ntp.conf到其他需要同步的客戶端機器,啟動NTPD服務即可。 其他客戶端機器上操作配置如下: # ntpdate -u 192.168.0.135 22 Dec 17:09:57 ntpdate[6439]: adjust time server 192.168.1.135 offset 0.004882 sec # scp 192.168.1.xxx:/etc/ntp.conf /etc/ntp.conf # service ntpd start 3、錯誤問題處理 用于收集安裝,配置和應用中出現的問題 錯誤1:ntpdate -u ip -> no server suitable for synchronization found 判斷:在ntp客戶端用ntpdate –d serverIP查看,發現有“Server dropped: strata too high”的錯誤,并且顯示“stratum 16”。而正常情況下stratum這個值得范圍是“0~15”。 原因:NTP server還沒有和其自身或者它的server同步上。在ntp server上重新啟動ntp服務后,ntp server自身或者與其server的同步的需要一個時間段,這個過程可能是5分鐘,在這個時間之內在客戶端運行ntpdate命令時會產生no server suitable for synchronization found的錯誤。 處理:等待幾分鐘后,重試一般解決。 也可以使用命令 ntpq -p查看情況 參考:http://blog.csdn.net/weidan1121/article/details/3953021
    posted @ 2017-04-14 11:25 xzc 閱讀(548) | 評論 (2)編輯 收藏
    問題導讀
    1.CM的安裝目錄在什么位置?


    2.hadoop配置文件在什么位置?


    3.Cloudera manager運行所需要的信息存在什么位置?

    4.CM結構和功能是什么?




    1. 相關目錄
    • /var/log/cloudera-scm-installer : 安裝日志目錄。
    • /var/log/* : 相關日志文件(相關服務的及CM的)。
    • /usr/share/cmf/ : 程序安裝目錄。
    • /usr/lib64/cmf/ : Agent程序代碼。
    • /var/lib/cloudera-scm-server-db/data : 內嵌數據庫目錄。
    • /usr/bin/postgres : 內嵌數據庫程序。
    • /etc/cloudera-scm-agent/ : agent的配置目錄。
    • /etc/cloudera-scm-server/ : server的配置目錄。
    • /opt/cloudera/parcels/ : Hadoop相關服務安裝目錄。
    • /opt/cloudera/parcel-repo/ : 下載的服務軟件包數據,數據格式為parcels。
    • /opt/cloudera/parcel-cache/ : 下載的服務軟件包緩存數據。
    • /etc/hadoop/* : 客戶端配置文件目錄。

    2. 配置
    • Hadoop配置文件
      配置文件放置于/var/run/cloudera-scm-agent/process/目錄下。如:/var/run/cloudera-scm-agent/process/193-hdfs-NAMENODE/core-site.xml。這些配置文件是通過Cloudera Manager啟動相應服務(如HDFS)時生成的,內容從數據庫中獲得(即通過界面配置的參數)。
      在CM界面上更改配置是不會立即反映到配置文件中,這些信息會存儲于數據庫中,等下次重啟服務時才會生成配置文件。且每次啟動時都會產生新的配置文件。
      CM Server主要數據庫為scm基中放置配置的數據表為configs。里面包含了服務的配置信息,每一次配置的更改會把當前頁面的所有配置內容添加到數據庫中,以此保存配置修改歷史。
      scm數據庫被配置成只能從localhost訪問,如果需要從外部連接此數據庫,修改vim /var/lib/cloudera-scm-server-db/data/pg_hba.conf文件,之后重啟數據庫。運行數據庫的用戶為cloudera-scm。


    • 查看配置內容

      • 直接查詢scm數據庫的configs數據表的內容。
      • 訪問REST API: http://hostname:7180/api/v4/cm/deployment,返回JSON格式部署配置信息。


    • 配置生成方式
      CM為每個服務進程生成獨立的配置目錄(文件)。所有配置統一在服務端查詢數據庫生成(因為scm數據庫只能在localhost下訪問)生成配置文件,再由agent通過網絡下載包含配置文件的zip包到本地解壓到指定的目錄。


    • 配置修改
      CM對于需要修改的配置預先定義,對于沒有預先定義的配置,則通過在高級配置項中使用xml配置片段的方式進行配置。而對于/etc/hadoop/下的配置文件是客戶端的配置,可以在CM通過部署客戶端生成客戶端配置。

    3. 數據庫
    Cloudera manager主要的數據庫為scm,存儲Cloudera manager運行所需要的信息:配置,主機,用戶等。

    4. CM結構
    CM分為Server與Agent兩部分及數據庫(自帶更改過的嵌入Postgresql)。它主要做三件事件:
    • 管理監控集群主機。
    • 統一管理配置。
    • 管理維護Hadoop平臺系統。
    實現采用C/S結構,Agent為客戶端負責執行服務端發來的命令,執行方式一般為使用python調用相應的服務shell腳本。Server端為Java REST服務,提供REST API,Web管理端通過REST API調用Server端功能,Web界面使用富客戶端技術(Knockout)。
    • Server端主體使用Java實現。
    • Agent端主體使用Python, 服務的啟動通過調用相應的shell腳本進行啟動,如果啟動失敗會重復4次調用啟動腳本。
    • Agent與Server保持心跳,使用Thrift RPC框架。


    5. 升級
    在CM中可以通過界面向導升級相關服務。升級過程為三步:
    • 下載服務軟件包。
    • 把所下載的服務軟件包分發到集群中受管的機器上。
    • 安裝服務軟件包,使用軟鏈接的方式把服務程序目錄鏈接到新安裝的軟件包目錄上。


    6. 卸載
    sudo /usr/share/cmf/uninstall-scm-express.sh, 然后刪除/var/lib/cloudera-scm-server-db/目錄,不然下次安裝可能不成功。


    7. 開啟postgresql遠程訪問
    CM內嵌數據庫被配置成只能從localhost訪問,如果需要從外部查看數據,數據修改vim /var/lib/cloudera-scm-server-db/data/pg_hba.conf文件,之后重啟數據庫。運行數據庫的用戶為cloudera-scm。
    posted @ 2017-04-13 14:36 xzc 閱讀(319) | 評論 (0)編輯 收藏
    1. 新版本的 hbck 可以修復各種錯誤,修復選項是:     
    2. (1)-fix,向下兼容用,被-fixAssignments替代     
    3. (2)-fixAssignments,用于修復region assignments錯誤     
    4. (3)-fixMeta,用于修復meta表的問題,前提是HDFS上面的region info信息有并且正確。     
    5. (4)-fixHdfsHoles,修復region holes(空洞,某個區間沒有region)問題     
    6. (5)-fixHdfsOrphans,修復Orphan region(hdfs上面沒有.regioninfo的region)     
    7. (6)-fixHdfsOverlaps,修復region overlaps(區間重疊)問題     
    8. (7)-fixVersionFile,修復缺失hbase.version文件的問題     
    9. (8)-maxMerge <n> (n默認是5),當region有重疊是,需要合并region,一次合并的region數最大不超過這個值。     
    10. (9)-sidelineBigOverlaps ,當修復region overlaps問題時,允許跟其他region重疊次數最多的一些region不參與(修復后,可以把沒有參與的數據通過bulk load加載到相應的region)     
    11. (10)-maxOverlapsToSideline <n> (n默認是2),當修復region overlaps問題時,一組里最多允許多少個region不參與     
    12. 由于選項較多,所以有兩個簡寫的選項     
    13. (11) -repair,相當于-fixAssignments -fixMeta -fixHdfsHoles -fixHdfsOrphans -fixHdfsOverlaps -fixVersionFile -sidelineBigOverlaps     
    14. (12)-repairHoles,相當于-fixAssignments -fixMeta -fixHdfsHoles -fixHdfsOrphans     
    15.      
    16.      
    17.      
    18. 新版本的 hbck     
    19. (1)缺失hbase.version文件     
    20.  加上選項 -fixVersionFile 解決     
    21. (2)如果一個region即不在META表中,又不在hdfs上面,但是在regionserver的online region集合中     
    22.  加上選項 -fixAssignments 解決     
    23. (3)如果一個region在META表中,并且在regionserver的online region集合中,但是在hdfs上面沒有     
    24.  加上選項 -fixAssignments -fixMeta 解決,( -fixAssignments告訴regionserver close region),( -fixMeta刪除META表中region的記錄)     
    25. (4)如果一個region在META表中沒有記錄,沒有被regionserver服務,但是在hdfs上面有     
    26. 加上選項 -fixMeta -fixAssignments 解決,( -fixAssignments 用于assign region),( -fixMeta用于在META表中添加region的記錄)     
    27. (5)如果一個region在META表中沒有記錄,在hdfs上面有,被regionserver服務了     
    28. 加上選項 -fixMeta 解決,在META表中添加這個region的記錄,先undeploy region,后assign     
    29. (6)如果一個region在META表中有記錄,但是在hdfs上面沒有,并且沒有被regionserver服務     
    30. 加上選項 -fixMeta 解決,刪除META表中的記錄     
    31. (7)如果一個region在META表中有記錄,在hdfs上面也有,table不是disabled的,但是這個region沒有被服務     
    32. 加上選項 -fixAssignments 解決,assign這個region     
    33. (8)如果一個region在META表中有記錄,在hdfs上面也有,table是disabled的,但是這個region被某個regionserver服務了     
    34. 加上選項 -fixAssignments 解決,undeploy這個region     
    35. (9)如果一個region在META表中有記錄,在hdfs上面也有,table不是disabled的,但是這個region被多個regionserver服務了     
    36. 加上選項 -fixAssignments 解決,通知所有regionserver close region,然后assign region     
    37. (10)如果一個region在META表中,在hdfs上面也有,也應該被服務,但是META表中記錄的regionserver和實際所在的regionserver不相符     
    38. 加上選項 -fixAssignments 解決     
    39.      
    40. (11)region holes     
    41. 需要加上 -fixHdfsHoles ,創建一個新的空region,填補空洞,但是不assign 這個 region,也不在META表中添加這個region的相關信息     
    42. (12)region在hdfs上面沒有.regioninfo文件     
    43. -fixHdfsOrphans 解決     
    44. (13)region overlaps     
    45. 需要加上 -fixHdfsOverlaps     
    46.      
    47.      
    48. 說明:     
    49. (1)修復region holes時,-fixHdfsHoles 選項只是創建了一個新的空region,填補上了這個區間,還需要加上-fixAssignments -fixMeta 來解決問題,( -fixAssignments 用于assign region),( -fixMeta用于在META表中添加region的記錄),所以有了組合拳 -repairHoles 修復region holes,相當于-fixAssignments -fixMeta -fixHdfsHoles -fixHdfsOrphans     
    50. (2) -fixAssignments,用于修復region沒有assign、不應該assign、assign了多次的問題     
    51. (3)-fixMeta,如果hdfs上面沒有,那么從META表中刪除相應的記錄,如果hdfs上面有,在META表中添加上相應的記錄信息     
    52. (4)-repair 打開所有的修復選項,相當于-fixAssignments -fixMeta -fixHdfsHoles -fixHdfsOrphans -fixHdfsOverlaps -fixVersionFile -sidelineBigOverlaps     
    53.      
    54. 新版本的hbck從(1)hdfs目錄(2)META(3)RegionServer這三處獲得region的Table和Region的相關信息,根據這些信息判斷并repair    
    新版本的 hbck 可以修復各種錯誤,修復選項是:    (1)-fix,向下兼容用,被-fixAssignments替代    (2)-fixAssignments,用于修復region assignments錯誤    (3)-fixMeta,用于修復meta表的問題,前提是HDFS上面的region info信息有并且正確。    (4)-fixHdfsHoles,修復region holes(空洞,某個區間沒有region)問題    (5)-fixHdfsOrphans,修復Orphan region(hdfs上面沒有.regioninfo的region)    (6)-fixHdfsOverlaps,修復region overlaps(區間重疊)問題    (7)-fixVersionFile,修復缺失hbase.version文件的問題    (8)-maxMerge <n> (n默認是5),當region有重疊是,需要合并region,一次合并的region數最大不超過這個值。    (9)-sidelineBigOverlaps ,當修復region overlaps問題時,允許跟其他region重疊次數最多的一些region不參與(修復后,可以把沒有參與的數據通過bulk load加載到相應的region)    (10)-maxOverlapsToSideline <n> (n默認是2),當修復region overlaps問題時,一組里最多允許多少個region不參與    由于選項較多,所以有兩個簡寫的選項    (11) -repair,相當于-fixAssignments -fixMeta -fixHdfsHoles -fixHdfsOrphans -fixHdfsOverlaps -fixVersionFile -sidelineBigOverlaps    (12)-repairHoles,相當于-fixAssignments -fixMeta -fixHdfsHoles -fixHdfsOrphans                新版本的 hbck    (1)缺失hbase.version文件     加上選項 -fixVersionFile 解決    (2)如果一個region即不在META表中,又不在hdfs上面,但是在regionserver的online region集合中     加上選項 -fixAssignments 解決    (3)如果一個region在META表中,并且在regionserver的online region集合中,但是在hdfs上面沒有     加上選項 -fixAssignments -fixMeta 解決,( -fixAssignments告訴regionserver close region),( -fixMeta刪除META表中region的記錄)    (4)如果一個region在META表中沒有記錄,沒有被regionserver服務,但是在hdfs上面有    加上選項 -fixMeta -fixAssignments 解決,( -fixAssignments 用于assign region),( -fixMeta用于在META表中添加region的記錄)    (5)如果一個region在META表中沒有記錄,在hdfs上面有,被regionserver服務了    加上選項 -fixMeta 解決,在META表中添加這個region的記錄,先undeploy region,后assign    (6)如果一個region在META表中有記錄,但是在hdfs上面沒有,并且沒有被regionserver服務    加上選項 -fixMeta 解決,刪除META表中的記錄    (7)如果一個region在META表中有記錄,在hdfs上面也有,table不是disabled的,但是這個region沒有被服務    加上選項 -fixAssignments 解決,assign這個region    (8)如果一個region在META表中有記錄,在hdfs上面也有,table是disabled的,但是這個region被某個regionserver服務了    加上選項 -fixAssignments 解決,undeploy這個region    (9)如果一個region在META表中有記錄,在hdfs上面也有,table不是disabled的,但是這個region被多個regionserver服務了    加上選項 -fixAssignments 解決,通知所有regionserver close region,然后assign region    (10)如果一個region在META表中,在hdfs上面也有,也應該被服務,但是META表中記錄的regionserver和實際所在的regionserver不相符    加上選項 -fixAssignments 解決        (11)region holes    需要加上 -fixHdfsHoles ,創建一個新的空region,填補空洞,但是不assign 這個 region,也不在META表中添加這個region的相關信息    (12)region在hdfs上面沒有.regioninfo文件    -fixHdfsOrphans 解決    (13)region overlaps    需要加上 -fixHdfsOverlaps            說明:    (1)修復region holes時,-fixHdfsHoles 選項只是創建了一個新的空region,填補上了這個區間,還需要加上-fixAssignments -fixMeta 來解決問題,( -fixAssignments 用于assign region),( -fixMeta用于在META表中添加region的記錄),所以有了組合拳 -repairHoles 修復region holes,相當于-fixAssignments -fixMeta -fixHdfsHoles -fixHdfsOrphans    (2) -fixAssignments,用于修復region沒有assign、不應該assign、assign了多次的問題    (3)-fixMeta,如果hdfs上面沒有,那么從META表中刪除相應的記錄,如果hdfs上面有,在META表中添加上相應的記錄信息    (4)-repair 打開所有的修復選項,相當于-fixAssignments -fixMeta -fixHdfsHoles -fixHdfsOrphans -fixHdfsOverlaps -fixVersionFile -sidelineBigOverlaps        新版本的hbck從(1)hdfs目錄(2)META(3)RegionServer這三處獲得region的Table和Region的相關信息,根據這些信息判斷并repair  

    示例:

     

     

    1. 查看hbasemeta情況    
    2. hbase hbck    
    3. 1.重新修復hbase meta表(根據hdfs上的regioninfo文件,生成meta表)    
    4. hbase hbck -fixMeta    
    5. 2.重新將hbase meta表分給regionserver(根據meta表,將meta表上的region分給regionservere)    
    6. hbase hbck -fixAssignments    
    查看hbasemeta情況   hbase hbck   1.重新修復hbase meta表(根據hdfs上的regioninfo文件,生成meta表)   hbase hbck -fixMeta   2.重新將hbase meta表分給regionserver(根據meta表,將meta表上的region分給regionservere)   hbase hbck -fixAssignments  

     


     

    1. 當出現漏洞    
    2. hbase hbck -fixHdfsHoles  (新建一個region文件夾)    
    3. hbase hbck -fixMeta        (根據regioninfo生成meta表)    
    4. hbase hbck -fixAssignments  (分配region到regionserver上)  
    當出現漏洞   hbase hbck -fixHdfsHoles  (新建一個region文件夾)   hbase hbck -fixMeta        (根據regioninfo生成meta表)   hbase hbck -fixAssignments  (分配region到regionserver上)


     

    1. 一、故障原因    
    2. IP為10.191.135.3的服務器在2013年8月1日出現服務器重新啟動的情況,導致此臺服務器上的所有服務均停止。從而造成NTP服務停止。當NTP服務停止后,導致HBase集群中大部分機器時鐘和主機時間不一致,造成regionserver服務中止。并在重新啟動后,出現region的hole。需要對數據進行重新修復,以正常提供插入數據的服務。    
    3.     
    4. 二、恢復方式    
    5. 1、集群50個regionserver,宕掉服務41個,namenode所在機器10.191.135.3不明重啟(原因查找中)導致本機上的namenode、zookeeper、時間同步服務器服務掛掉。    
    6. 2、重啟hbase服務時,沒能成功stop剩余的9個regionserver服務,進行了人為kill進程,    
    7. 3、在hdfs上移走了hlog(避免啟動時split log花費過多時間影響服務),然后重啟hbase。發現10.191.135.30機器上的時間與時間同步服務器10.191.135.3不同步。手工同步后重啟成功。hbase可以正常提供查詢服務。    
    8. 4、運行mapreduce put數據。拋出異常,數據無法正常插入;    
    9. 5、執行/opt/hbase/bin/hbase hbck -fixAssignments,嘗試重新分配region。結果顯示hbase有空洞,即region之間數據不連續了;    
    10. 6、通過上述操作可以定位是在regionserver服務宕掉的后重啟的過程中丟了數據。需要進行空洞修復。然而hbase hbck命令總是只顯示三條空洞。    
    11. 7、通過編寫的regionTest.jar工具進行進一步檢測出空洞所在的regionname然后停掉hbase,進而進行region合并修復空洞;    
    12. 8、合并的merge 操作需要先去.META.表里讀取該region的信息,由于.META.表也在regionserver宕機過程中受到損壞,所以部分region的.META.信息沒有,merge操作時就拋出空指針異常。因此只能將hdfs這些region進行移除,然后通過regionTest.jar 檢測新的空洞所在的regionname,進行合并操作修復空洞;    
    13. 9、關于region重疊,即regionname存在.META.表內,但是在hdfs上被錯誤的移出,并進行了region合并。這種情況下需要通過regionTest.jar檢測重疊的regionname然后手動去.META.表刪除,.META.表修改之后需要flush;    
    14. 10、最后再次執行 hbase hbck 命令,hbase 所有表status ok。    
    15.     
    16. 三、相關命令及頁面報錯信息    
    17. 1.手工同步時間命令
service ntpd stop
ntpdate -d 192.168.1.20
service ntpd start    
    18.     
    19.     
    20. 2.org.apache.hadoop.hbase.client.RetriesExhaustedWithDetailsException: Failed 2 actions: WrongRegionException: 2 times, servers with issues: datanode10:60020, 
at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.processBatchCallback(HConnectionManager.java:1641)
at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.processBatch(HConnectionManager.java:1409)
at org.apache.hadoop.hbase.client.HTable.flushCommits(HTable.java:949)
at org.apache.hadoop.hbase.client.HTable.doPut(HTable.java:826)
at org.apache.hadoop.hbase.client.HTable.put(HTable.java:801)
at org.apache.hadoop.hbase.mapreduce.TableOutputFormat$TableRecordWriter.write(TableOutputFormat.java:123)
at org.apache.hadoop.hbase.mapreduce.TableOutputFormat$TableRecordWriter.write(TableOutputFormat.java:84)
at org.apache.hadoop.mapred.MapTask$NewDirectOutputCollector.write(MapTask.java:533)
at org.apache.hadoop.mapreduce.task.TaskInputOutputContextImpl.write(TaskInputOutputContextImpl.java:88)
at o    
    21.     
    22. 3.13/08/01 18:30:02 DEBUG util.HBaseFsck: There are 22093 region info entries
ERROR: There is a hole in the region chain between +8615923208069cmnet201303072132166264580 and +861592321.  You need to create a new .regioninfo and region dir in hdfs to plug the hole.
ERROR: There is a hole in the region chain between +8618375993383cmwap20130512235639430 and +8618375998629cmnet201305040821436779670.  You need to create a new .regioninfo and region dir in hdfs to plug the hole.
ERROR: There is a hole in the region chain between +8618725888080cmnet201212271719506311400 and +8618725889786cmnet201302131646431671140.  You need to create a new .regioninfo and region dir in hdfs to plug the hole.
ERROR: Found inconsistency in table cqgprs
Summary:
  -ROOT- is okay.
    Number of regions: 1
    Deployed on:  datanode14,60020,1375330955915
  .META. is okay.
    Number of regions: 1
    Deployed on:  datanode21,60020,1375330955825
  cqgprs is okay.
    Number of regions: 22057
    Deployed on:  datanode1,60020,1375330955761 datanode10,60020,1375330955748 datanode11,60020,1375330955736 datanode12,60020,1375330955993 datanode13,60020,1375330955951 datanode14,60020,1375330955915 datanode15,60020,1375330955882 datanode16,60020,1375330955892 datanode17,60020,1375330955864 datanode18,60020,1375330955703 datanode19,60020,1375330955910 datanode2,60020,1375330955751 datanode20,60020,1375330955849 datanode21,60020,1375330955825 datanode22,60020,1375334479752 datanode23,60020,1375330955835 datanode24,60020,1375330955932 datanode25,60020,1375330955856 datanode26,60020,1375330955807 datanode27,60020,1375330955882 datanode28,60020,1375330955785 datanode29,60020,1375330955799 datanode3,60020,1375330955778 datanode30,60020,1375330955748 datanode31,60020,1375330955877 datanode32,60020,1375330955763 datanode33,60020,1375330955755 datanode34,60020,1375330955713 datanode35,60020,1375330955768 datanode36,60020,1375330955896 datanode37,60020,1375330955884 datanode38,60020,1375330955918 datanode39,60020,1375330955881 datanode4,60020,1375330955826 datanode40,60020,1375330955770 datanode41,60020,1375330955824 datanode42,60020,1375449245386 datanode43,60020,1375330955880 datanode44,60020,1375330955902 datanode45,60020,1375330955881 datanode46,60020,1375330955841 datanode47,60020,1375330955790 datanode48,60020,1375330955848 datanode49,60020,1375330955849 datanode5,60020,1375330955880 datanode50,60020,1375330955802 datanode6,60020,1375330955753 datanode7,60020,1375330955890 datanode8,60020,1375330955967 datanode9,60020,1375330955948
  test1 is okay.
    Number of regions: 1
    Deployed on:  datanode43,60020,1375330955880
  test2 is okay.
    Number of regions: 1
    Deployed on:  datanode21,60020,1375330955825
35 inconsistencies detected.
Status: INCONSISTENT    
    23.     
    24. 4.hadoop jar regionTest.jar com.region.RegionReaderMain /hbase/cqgprs 檢測cqgprs表里的空洞所在的regionname。    
    25.     
    26. 5.==================================
first endKey = +8615808059207cmnet201307102326567966800
second startKey = +8615808058578cmnet201212251545557984830

first regionNmae = cqgprs,+8615808058578cmnet201212251545557984830,1375241186209.0f8266ad7ac45be1fa7233e8ea7aeef9.
second regionNmae = cqgprs,+8615808058578cmnet201212251545557984830,1362778571889.3552d3db8166f421047525d6be39c22e.
==================================
first endKey = +8615808060140cmnet201303051801355846850
second startKey = +8615808059207cmnet201307102326567966800

first regionNmae = cqgprs,+8615808058578cmnet201212251545557984830,1362778571889.3552d3db8166f421047525d6be39c22e.
second regionNmae = cqgprs,+8615808059207cmnet201307102326567966800,1375241186209.09d489d3df513bc79bab09cec36d2bb4.
==================================    
    27.     
    28. 6.Usage: bin/hbase org.apache.hadoop.hbase.util.Merge [-Dfs.default.name=hdfs://nn:port] <table-name> <region-1> <region-2>

./hbase org.apache.hadoop.hbase.util.Merge -Dfs.defaultFS=hdfs://bdpha cqgprs cqgprs,+8615213741567cmnet201305251243290802280,1369877465524.3c13b460fae388b1b1a70650b66c5039. cqgprs,+8615213745577cmnet201302141725552206710,1369534940433.5de80f59071555029ac42287033a4863. &    
    29.     
    30. 7.13/08/01 22:24:02 WARN util.HBaseFsck: Naming new problem group: +8618225125357cmnet201212290358070667800
ERROR: (regions cqgprs,+8618225123516cmnet201304131404096748520,1375363774655.b3cf5cc752f4427a4e699270dff9839e. and cqgprs,+8618225125357cmnet201212290358070667800,1364421610707.7f7038bfbe2c0df0998a529686a3e1aa.) There is an overlap in the region chain.
13/08/01 22:24:02 WARN util.HBaseFsck: reached end of problem group: +8618225127504cmnet201302182135452100210
13/08/01 22:24:02 WARN util.HBaseFsck: Naming new problem group: +8618285642723cmnet201302031921019768070
ERROR: (regions cqgprs,+8618285277826cmnet201306170027424674330,1375363962312.9d1e93b22cec90fd75361fa65b1d20d2. and cqgprs,+8618285642723cmnet201302031921019768070,1360873307626.f631cd8c6acc5e711e651d13536abe94.) There is an overlap in the region chain.
13/08/01 22:24:02 WARN util.HBaseFsck: reached end of problem group: +8618286275556cmnet201212270713444340110
13/08/01 22:24:02 WARN util.HBaseFsck: Naming new problem group: +8618323968833cmnet201306010239025175240
ERROR: (regions cqgprs,+8618323967956cmnet201306091923411365860,1375364143678.665dba6a14ebc9971422b39e079b00ae. and cqgprs,+8618323968833cmnet201306010239025175240,1372821719159.6d2fecc1b3f9049bbca83d84231eb365.) There is an overlap in the region chain.
13/08/01 22:24:02 WARN util.HBaseFsck: reached end of problem group: +8618323992353cmnet201306012336364819810
ERROR: There is a hole in the region chain between +8618375993383cmwap20130512235639430 and +8618375998629cmnet201305040821436779670.  You need to create a new .regioninfo and region dir in hdfs to plug the hole.
13/08/01 22:24:02 WARN util.HBaseFsck: Naming new problem group: +8618723686187cmnet201301191433522129820
ERROR: (regions cqgprs,+8618723683087cmnet201301300708363045080,1375364411992.4ee5787217c1da4895d95b3b92b8e3a2. and cqgprs,+8618723686187cmnet201301191433522129820,1362003066106.70b48899cc753a0036f11bb27d2194f9.) There is an overlap in the region chain.
13/08/01 22:24:02 WARN util.HBaseFsck: reached end of problem group: +8618723689138cmnet201301051742388948390
13/08/01 22:24:02 WARN util.HBaseFsck: Naming new problem group: +8618723711808cmnet201301031139206225900
ERROR: (regions cqgprs,+8618723710003cmnet201301250809235976320,1375364586329.40eed10648c9a43e3d5ce64e9d63fe00. and cqgprs,+8618723711808cmnet201301031139206225900,1361216401798.ebc442e02f5e784bce373538e06dd232.) There is an overlap in the region chain.
13/08/01 22:24:02 WARN util.HBaseFsck: reached end of problem group: +8618723714626cmnet201302122009459491970
ERROR: There is a hole in the region chain between +8618725888080cmnet201212271719506311400 and +8618725889786cmnet201302131646431671140.  You need to create a new .regioninfo and region dir in hdfs to plug the hole.    
    31.     
    32. 8.  delete '.META.','regionname','info:serverstartcode'    
    33. delete '.META.','regionname','info:regionserver'    
    34. delete '.META.','regionname','info:regioninfo'    
    35.      
    36. 9. flush '.META.'
major_compact '.META.'   
    posted @ 2017-04-11 16:01 xzc 閱讀(450) | 評論 (0)編輯 收藏

    自從開源中國的maven倉庫掛了之后就一直在用國外的倉庫,慢得想要砸電腦的心都有了。如果你和我一樣受夠了國外maven倉庫的龜速下載?快試試阿里云提供的maven倉庫,從此不在浪費生命……

    倉庫地址:http://maven.aliyun.com/nexus/#view-repositories;public~browsestorage

     

    倉庫配置

    在maven的settings.xml文件里的mirrors節點,添加如下子節點:

    復制代碼
    <mirror>       <id>nexus-aliyun</id>       <mirrorOf>central</mirrorOf>         <name>Nexus aliyun</name>       <url>http://maven.aliyun.com/nexus/content/groups/public</url>   </mirror> 
    復制代碼

    或者直接在profiles->profile->repositories節點,添加如下子節點:

    復制代碼
    <repository>     <id>nexus-aliyun</id>     <name>Nexus aliyun</name>     <layout>default</layout>     <url>http://maven.aliyun.com/nexus/content/groups/public</url>     <snapshots>         <enabled>false</enabled>     </snapshots>     <releases>         <enabled>true</enabled>     </releases> </repository>
    復制代碼

     

    settings文件的路徑

    settings.xml的默認路徑就:個人目錄/.m2/settings.xml

    如:

    windowns: C:\Users\你的用戶名\.m2\settings.xml

    linux: /home/你的用戶名/.m2/settings.xml

    Keep it simple!
    作者:KEITSI
    知識共享,歡迎轉載。
    posted @ 2017-04-11 10:08 xzc 閱讀(260) | 評論 (0)編輯 收藏
    僅列出標題
    共32頁: 上一頁 1 2 3 4 5 6 7 8 9 下一頁 Last 
    主站蜘蛛池模板: 老外毛片免费视频播放| 亚洲一级大黄大色毛片| 久久国产免费一区| 亚洲五月综合缴情婷婷| 国产91久久久久久久免费| 亚洲免费一区二区| 国产成人精品日本亚洲直接| 人人狠狠综合久久亚洲高清| 久久久精品国产亚洲成人满18免费网站 | 久久精品国产亚洲精品2020| 黄页网站在线观看免费高清| 美女18毛片免费视频| 亚洲美女又黄又爽在线观看| 无人在线观看免费高清视频 | 国产精品福利片免费看| 亚洲成年人电影在线观看| 国产免费久久精品| 精品一区二区三区免费毛片爱| 青青青亚洲精品国产| 久久夜色精品国产噜噜噜亚洲AV | 亚洲人成电影网站久久| 亚洲国产日韩在线视频| 最近免费中文字幕大全| 国产免费爽爽视频在线观看| 国产精品亚洲专区一区| 亚洲人成影院在线高清| 国产亚洲成av片在线观看| 国产人成免费视频| 无码国产精品一区二区免费| 野花香高清视频在线观看免费| 亚洲1区2区3区精华液| 亚洲中文无码a∨在线观看| 亚洲大尺度无码无码专区| 国产高清视频在线免费观看| 91精品视频免费| 久久这里只精品99re免费| 久久久受www免费人成| 免费视频成人国产精品网站 | 91高清免费国产自产拍2021| 久久免费香蕉视频| 午夜在线免费视频|