我的總結-亂七八糟踩坑

錯誤集錦

tomcat

  • tomcat沒法啓動:註釋遠程調試

tomcat/bin/catalina.sh 中的 #CATALINA_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,address=19000,server=y,suspend=n"css


mysql

  • 鏈接服務器 mysql -uusername -p1234556 -hdb.org --port=5003

visualbox 配置

  • 配置Ubuntu server 固定ip
  1. 爲了配置訪問外部網路以及和宿主機互聯,在vb 管理->主機網絡管理器->手動配置網卡->配置僅主機網絡屬性:ip和網絡掩碼
  2. 具體虛擬機(如ubuntu),設置->網絡->網卡1 選擇網絡地址轉換(NAT)混雜模式(所有容許), 網卡2:選擇僅主機網絡
  3. 啓動虛擬主機,配置ip: sudo vim /etc/network/interfaces,配置以下
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto eth0
iface eth0 inet dhcp

auto eth1
iface eth1 inet static
address 192.168.1.101
netmask 255.255.255.0
複製代碼
  1. 配置域名解析DNS sudo vim /etc/resolvconf/resolv.conf.d/base
# 根據我的電腦設置
# ipconfig /all windows查看
nameserver      8.8.8.8
複製代碼
  1. sudo reboot 重啓便可

windows

指令

  • 端口查看:netstat -aon | findstr 16661
  • 任務kill:taskkill /F /PID 14560

linux

指令

  • 獲取日期:date +%Y%m%d -d '+1 day/min',轉換成時間戳date -d '2013-2-22 22:14' +%s, 時間戳轉換成日期date -d @1512088011 +'%Y%m%d'
  • 查看端口:netstat -aon
  • lsof -p (list open file):查看進程使用的文件,-p指定pid

q&s

awk -F"\t" '{if($2 == "1"){print $1}}' | less,沒法匹配出數據java

grep 後面 跟less/more不會對查詢結果標紅mysql


fe

  • 修改css後頁面沒有刷新linux

    緩存問題,能夠在css加載語句的後面添加?v=1.0.0讓瀏覽器從新加載資源。web

  • js find 過濾器算法

    var rs = extObj.find("tr[role!='head'][role!='foot']"); 實現多重條件選擇sql


idea

  • Jetty 熱部署apache

    1. pom 文件
    <plugin>
        <groupId>org.mortbay.jetty</groupId>
        <artifactId>jetty-maven-plugin</artifactId>
        <configuration>
            <scanIntervalSeconds>1</scanIntervalSeconds> 
            <stopPort>9977</stopPort>
            <stopKey>foo</stopKey> <scanIntervalSeconds>0</scanIntervalSeconds>
            <connectors>
                <connector implementation="org.eclipse.jetty.server.nio.SelectChannelConnector">   
                    <port>8080</port>
                    <maxIdleTime>60000</maxIdleTime>
                </connector>
            </connectors>
            <webAppConfig>
            <contextPath>/</contextPath>
            </webAppConfig>
        </configuration>
    </plugin>
    複製代碼
    1. ctrl+shift+f9 從新build當前文件 ctrl+f9 從新build整個目錄
    2. project structure -> Modules paths 設置build的class文件目錄(注意放到web項目的目錄下面,如target\nss\WEB-INF\classes

java

q&s

問題ubuntu

2017-10-25 21:52:17,528 FATAL [main] org.apache.hadoop.mapred.YarnChild: Error running child : java.lang.OutOfMemoryError: Direct buffer memory
複製代碼

解決: reduce 階段,申請使用操做系統的內存,沒有控制好,出現了內存泄露,致使的內存溢出。申請內存超過8192MB和不能被1024MB整除的資源請求vim

jvm

  • -Xmx Java Heap最大值,默認值爲物理內存的1/4,最佳設值應該視物理內存大小及計算機內其餘內存開銷而定;
  • -Xms Java Heap初始值,Server端JVM最好將-Xms和-Xmx設爲相同值,開發測試機JVM能夠保留默認值;
  • -Xmn Java Heap Young區大小,不熟悉最好保留默認值;
  • -Xss 每一個線程的Stack大小,不熟悉最好保留默認值;

hadoop

notice

  • Map和Reduce階段不能對集合進行寫操做。即便寫了在reduce階段也讀不出來。

    map和reduce會在不一樣的服務器上操做,全局變量沒法生效。 一、經過Configuration保存String變量; 二、在reduce或者map階段讀取小文件存入內存,進行操做。

  • reduce階段,==Iterable的迭代只能遍歷一次==,第二次遍歷後沒有數據,因此會形成結果匹配錯誤。因此應該先將數據保存,再遍歷。

  • set class 要在set configuration以後這樣纔會保存配置

  • 若是reduce的Value不輸出值得話,返回類型用NullWritable.get(),這樣能夠保證文件中在key的後面不會出現tab

  • Mapper Reducer類的子類要是static,不然會報初始化錯誤

  • ==對於MR的return要謹慎使用,防止跳出,部分結果沒法輸出==

hdfs 操做指令

  • hadoop fs -stat [option] hdfsfilepath
%b:打印文件大小(目錄爲0)
%n:打印文件名
%o:打印block size (咱們要的值)
%r:打印備份數
%y:打印UTC日期 yyyy-MM-dd HH:mm:ss
%Y:打印自1970年1月1日以來的UTC微秒數
%F:目錄打印directory, 文件打印regular file
複製代碼
  • hadoop job -status jobid job_1509011180094_5418072

    結果說明:

Uber job : false-----uber模式:false,Uber模式簡單地能夠理解成JVM重用。
以Uber模式運行MR做業,全部的Map Tasks和Reduce Tasks將會在ApplicationMaster所在的容器(container)中運行,
也就是說整個MR做業運行的過程只會啓動AM container,由於不須要啓動
mapper 和reducercontainers,因此AM不須要和遠程containers通訊,整個過程簡單了。

Number of maps: 13702 -----map總數:
Number of reduces: 500 -----reduces總數
map() completion: 1.0  
reduce() completion: 1.0  
Job state: SUCCEEDED -----job狀態  
retired: false  
reason for failure: -----failure緣由  

Counters: 58 -----counter總數  
    File System Counters -----這個group表示job與文件系統交互的讀寫統計
        FILE: Number of bytes read=0 -----job讀取本地文件系統的文件字節數。假定咱們當前map的輸入數
        據都來自於HDFS,那麼在map階段,這個數據應該是0。但reduce在在執
        行前,它的輸入數據是通過Shuffle的merge後存儲在reduce端本地磁盤
        中,因此這個數據就是全部reduce的總輸入字節數。
        FILE: Number of bytes written=5654852533 -----map的中間結果都會spill到本地磁盤中,在map執行完後,造成
        最終的spill文件。因此map端這裏的數據就表示MapTask往本地磁盤
        中共寫了多少字節。與Map端相對應的是,reduce端在Shuffle時,會
        不斷拉取Map端的中間結果,而後作merge並不斷spill到本身的本地
        磁盤中。最終造成一個單獨文件,這個文件就是reduce的輸入文件。
        FILE: Number of read operations=0 -----
        FILE: Number of large read operations=0
        FILE: Number of write operations=0
        HDFS: Number of bytes read=3560544443952 -----job執行過程當中,累計寫入HDFS的數據大小,整個job執行過程當中
        ,只有map端運行時,纔會從HDFS讀取數據,這些數據不限於源文件
        內容,還包括全部map的split元數據。因此這個值應該比
        FileInputFormatCounter.BYTES_READ要略大些。
        HDFS: Number of bytes written=317076139 -----Reduce的最終結果都會寫入HDFS,就是一個Job執行結果的總量。
        HDFS: Number of read operations=70010
        HDFS: Number of large read operations=0
        HDFS: Number of write operations=4491
        VIEWFS: Number of bytes read=0
        VIEWFS: Number of bytes written=0
        VIEWFS: Number of read operations=0
        VIEWFS: Number of large read operations=0
        VIEWFS: Number of write operations=0
        
    Job Counters -----這個group描述與job調度相關的統計
        Killed map tasks=4
        Launched map tasks=13706 -----此job啓動了多少個map task
        Launched reduce tasks=500 -----此job啓動了多少個reduce task
        Data-local map tasks=13043 -----Job在被調度時,若是啓動了一個data-local(源文件的副本在執行map task的TaskTracker本地)
        Rack-local map tasks=663 ----- 處理的文件不在map task節點上
        Total time spent by all maps in occupied slots (ms)=437335720 -----全部map task佔用slot的總時間,包含執行時間和建立/銷燬子JVM的時間
        Total time spent by all reduces in occupied slots (ms)=83963148 -----
        Total time spent by all map tasks (ms)=218667860
        Total time spent by all reduce tasks (ms)=27987716
        Total vcore-seconds taken by all map tasks=218667860
        Total vcore-seconds taken by all reduce tasks=27987716
        Total megabyte-seconds taken by all map tasks=557165707280
        Total megabyte-seconds taken by all reduce tasks=128631542736
        
    Map-Reduce Framework -----這個Countergroup包含了至關多的job執行細節數據。
    這裏須要有個概念認識是:通常狀況下,record就表示一行數據,
    而相對的byte表示這行數據的大小是多少,這裏的group
    表示通過reduce merge後像這樣的輸入形式{"aaa",[5,2,8,...]}
        "Map input records=4486906030" -----全部MapTask從HDFS讀取的文件總行數
        Map output records=93940285 -----MapTask的直接輸出record是多少,就是在map方法中調用
        context.write的次數,也就是未通過Combine時的原生輸出條數。
        Map output bytes=5011599765 -----Map的輸出結果key/value都會被序列化到內存緩衝區中,
        因此這裏的bytes指序列化後的最終字節之和。
        Map output materialized bytes=3532812262 -----map 輸出物化到磁盤的數據量,
        也就是reduce shuffle的數據量
        Input split bytes=2839207
        "Combine input records=93940285" -----Combiner是爲了儘可能減小須要拉取和移動的數據
        "Combine output records=79274144" -----通過Combiner後,相同key的數據通過壓縮,
        在map端本身解決了不少重複數據,表示最終在map端中間
        文件中的全部條目數
        Reduce input groups=13757989 -----Reduce總共讀取了多少個這樣的groups,
        等於reduce處理的key個數
        "Reduce shuffle bytes=3532812262" -----Reduce端的copy線程總共從map端抓去了多少的中間數據
        ,表示各個MapTask最終的中間文件總和。
        "Reduce input records=79274144" -----若是有Combiner的話,那麼這裏的數值就會等於Map端
        Combiner運算後的最後條數,若是沒有,那麼就會等於Map的輸出條數
        Reduce output records=0 -----全部reduce執行後輸出的總條目數
        "Spilled Records=79274144" -----spill過程在map和reduce端都會發生,
        這裏統計的是總共從內存往磁盤中spill了多少條數據。
        Shuffled Maps =6851000 -----每一個reduce幾乎都得從全部Map端拉取數據,
        每一個copy線程拉取成功一個map的數據,那麼增1,
        因此它的總數基本等於reduce number*(map number - fiald)
        Failed Shuffles=0 -----copy線程在抓取map端中間數據時,
        若是由於網絡鏈接異常或是IO異常,所引發的Shuffle錯誤次數。
        "Merged Map outputs=6851000" -----記錄着Shuffle過程當中總共經歷了多少次merge動做
        "GC time elapsed (ms)=2890881"
        CPU time spent (ms)=299372980 -----job運行使用的cpu時間,是衡量任務的計算量
        總結:任務運行使用的CPU時間=counter:
        "Map-Reduce Framework:CPU time spent (ms)"
        Physical memory (bytes) snapshot=12848748335104 -----進程的當前物理內存使用大小
        Virtual memory (bytes) snapshot=45156357689344 -----進程的當前虛擬內存使用大小
        Total committed heap usage (bytes)=31420302491648 -----獲取jvm的當前堆大小
        
     SHUFFLECOUNTER
        SHUFFLE_IDLE_TIME=21427585
        SHUFFLE_TOTAL_TIME=25507722
        
    HIVE
        CREATED_FILES=1
            
    Shuffle Errors -----這組內描述Shuffle過程當中的各類錯誤狀況發生次數,
    基本定位於Shuffle階段copy線程抓取map端中間數據時的各類錯誤。
        BAD_ID=0 -----每一個map都有一個ID,
        如attempt_201109020150_0254_m_000000_0,
        若是reduce的copy線程抓取過來的元數據中的這個ID不是標準格式,
        那麼此Counter會增長。
        CONNECTION=0 -----表示copy線程創建到map端的鏈接有誤。
        IO_ERROR=0 -----Reduce的copy線程若是在抓取map端數據時出現IOException,
        那麼這個值會相應增長。
        WRONG_LENGTH=0 -----map端的那個中間結果是有壓縮好的有格式數據,
        它有兩個length信息:元數據大小和壓縮後數據大小。
        若是這兩個length信息傳輸的有誤,那麼此Counter會增長。
        WRONG_MAP=0 -----每一個copy線程固然是有目的的:爲某個reduce抓取
        某些map的中間結果,若是當前抓取的map數據不是copy
        線程以前定義好的map,那麼就表示把數據拉錯了。
        WRONG_REDUCE=0 -----與上述描述一致,若是抓取的數據表示它不是
        爲此reduce而準備的,那仍是拉錯數據了。
        DESERIALIZE_ERRORS=0
        
    File Input Format Counters 
                Bytes Read=0
                
    File Output Format Counters 
                Bytes Written=0
複製代碼

hadoop優化

mr job 流程

map

shuffle

  • io.sort.mb:100m

    1. 存儲map中間數據的緩存默認大小,當map任務產生了很是大的中間數據時能夠適當調大該參數,使緩存能容納更多的map中間數據,而不至於大頻率的IO磁盤,當系統性能的瓶頸在磁盤IO的速度上,能夠適當的調大此參數來減小頻繁的IO帶來的性能障礙。
    2. 查看日誌,spill次數多說明設置過低。(根據map的輸出量進行設置)
  • io.sort.spill.percent:80%

    達到必定百分比,從後臺進程對buffer進行排序,而後spill到磁盤。若是map的輸出基本有序能夠適當提升這個閾值。

  • io.sort.factor:10

    1. 最多能有多少並行的stream向merge文件中寫入
    2. 當一個map task執行完以後,本地磁盤上(mapred.local.dir)有若干個spill文件,map task最後作的一件事就是執行merge sort,把這些spill文件合成一個文件(partition),有時候咱們會自定義partition函數,就是在這個時候被調用的。
    3. merge sort會生成兩個文件,一個是數據文件,一個是index:記錄每一個不一樣的key在數據文件中的偏移量(這就是partition)
  • min.num.spill.for.combine:3

    當job中設定了combiner,而且spill數最少有3個的時候, 那麼combiner函數就會在merge產生結果文件以前運行。減小寫入到磁盤文件的數據數量,一樣是爲了減小對磁盤的讀寫頻率,有可能達到優化做業的目的。

  • mapred.compress.map.output:false

    那麼map在寫中間結果時,就會將數據壓縮後再寫入磁盤,讀結果時也會採用先解壓後讀取數據。cpu換IO

  • mapred.map.output.compression.codec:org.apache.hadoop.io.compress.De faultCodec(GzipCodec,LzoCodec,BZip2Codec,LzmaCodec)
    當採用map中間結果壓縮的狀況下,用戶還能夠選擇壓縮時採用哪一種壓縮格式進行壓縮

reduce

優化場景

  • Map邏輯處理後數據被展開,寫磁盤次數劇增,能夠觀察日誌中的spill次數,調整各個參數

  • 中間結果能不展開就不展開,儘可能縮小Mapper和reducer之間的數據傳遞

  • 處理速度很慢時候首先要懷疑Mapper和Reducer之間傳輸數據量過大

  • 觀察GC的狀況,有時候是由於內存佔用量高,頻繁GC,嚴重影響處理速

  • 適當控制mapper的數量,特別是有distribute cache的場景

  • distribute cache

    • 加載的數據能不用hashmap就儘可能不要用,hashmap會使得內存佔用量是原數據的5-10倍。
    • 加載的數據要儘量簡單,若是有複雜的處理邏輯能夠單獨開闢Mapper Reducer進行一輪處理
    • 避免每次mapper都要處理一遍,儘量減小distribute cache的數據量

hadoop配置說明

tasktracker.http.threads:

決定做爲server端的map用於提供數據傳輸服務的線程數  
複製代碼

mapred.reduce.parallel.copies:

決定做爲client端的reduce同時從map端拉取數據的並行度(一次同時從多少個map拉數據)
複製代碼

hive

notice

  • hive 查詢,字段沒法進行單引號比較,如p8='2',沒法查到數據

    當某一字段數據全是純數字字符串的時候,它會自動轉成數字去作比較。

  • 10位的時間戳值,即1970-1-1至今的秒,能夠用from_unixtime()轉爲時間,而13位的所謂毫秒的是不能夠的;from_unixtime(cast(substring(t3.time ,1,10)as BIGINT), 'yyyyMMdd HH:mm:ss')

  • insert overwrite/into table 只會有mapjob,沒有reducejob

  • 增長reduce數目

    1. set hive.exec.reducers.bytes.per.reducer=500000000;
    2. set mapred.reduce.tasks = 15;
  • 設置reduce的文件大小
    set hive.merge.size.per.task = 10000000; set hive.merge.mapfiles=false; set hive.groupby.skewindata=true;

hql

  • desc tablename;

  • show partitions tablename;

  • 修改表名

    alter table oldname rename to newname;

  • 增長列

    alter table tablename add columns (c1 type, c3 type);

  • hive增長分區映射到文件

    alter table tablename drop if exists partition(dt='20171130');
    alter table tablename add if not exists partition(dt='20171130') location 'path';

  • 修改表的分割字符

    alter table tablename set SERDEPROPERTIES('field.delim'='\t');

  • 修改字段順序

    alter table tablename change column cololdname colnewname coltype after colname2;

hive 和hadoop 配置說明

hive 配置說明

hadoop 配置說明

mapred.compress.map.output ##指定map的輸出是否壓縮。有助於減少數據量,減少io壓力,但壓縮和解壓有cpu成本,須要慎重選擇壓縮算法。

mapred.map.output.compression.codec ##map輸出的壓縮算法

mapred.output.compress ##reduce輸出是否壓縮

mapred.output.compression.codec ##控制mapred的輸出的壓縮的方式

hive.exec.compress.intermediate=true; ##hive中間數據壓縮

set hive.exec.compress.intermediate=true;
set mapred.map.output.compression.codec= org.apache.hadoop.io.compress.SnappyCodec set mapred.map.output.compression.codec=com.hadoop.compression.lzo.LzoCodec;

set hive.exec.compress.output=false;

hive reduce最終數據不壓縮

set hive.exec.compress.output=true;
set mapred.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec;

set hive.merge.smallfiles.avgsize=256000000; ###設置輸出文件的平均值

hive Job 細節優化

  • map

set mapred.min.split.size=1;
set mapred.max.split.size=256000000;

  • reduce

set mapred.reduce.tasks=100;--直接指定Reduce個數
set mapred.exec.reducers.bytes.per.reducer=1G;

  • map 與reduce過程當中

set io.sort.mb;--增大Mapper輸出buffer的大小,避免Spill的發生
set io.sort.factor;--一次性可以合併更多的數據
set sort mapred.reduce.slowstart.completed.maps=0.05;--Reduce端copy的進度
set mapred.reduce.parallel.copies;--能夠決定做爲client端的Reduce同時從Map端拉取數據的並行度

  • 文件格式

set hive.default.fileformat = SequenceFile;
set hive.exec.compress.output = true;

對於sequencefile,有record和block兩種壓縮方式可選,block壓縮比更高

set mapred.output.compression.type = BLOCK;
set hive.hadoop.supports.splittable.combineinputformat=true;--小文件合併

  • Job 總體優化
    • job 執行模式

set hive.exec.mode.local.auto;--自動開啓local mr模式
set hive.exec.mode.local.auto.tasks.max;--文件數量
set hive.exec.mode.local.auto.inputbytes.max;--數據量大小

  • jvm重用

set mapred.job.reuse.jvm.num.tasks=5;--一個jvm運行屢次任務以後再退出

  • 索引
  • join

set hive.auto.convert.join = true;

Hive會自動判斷當前的join操做是否合適作Map join

  • 數據傾斜

set hive.map.aggr=true;
set hive.groupby.skewindata;

Reduce操做的時候,拿到的key並非全部相同值給同一個Reduce,而是隨機分發,而後Reduce作聚合,作完以後再作一輪MR,拿前面聚合過的數據再算結果

  • sql 總體優化
    • job 並行
      set hive.exec.parallel = true; set hive.exec.parallel.thread.number;

    • 減小Job數 group by 代替 join

相關文章
相關標籤/搜索